摘要: [翻譯]關(guān)于“異步可插協(xié)議”(About Asynchronous Pluggable Protocols(APPs))
原文鏈接:http://msdn2.microsoft.com/en-us/library/aa767916(VS.85).aspx
閱讀全文
其實(shí)也不是真正的第一次,以前有用csc進(jìn)行編譯.net的程序,可以算是第一次用cl編譯吧。
今天讀了C++ Primer,還是決定用這個(gè)最原始的方法來(lái)編譯,感受一下歷史的美,順便對(duì)比一下今天大量IDE環(huán)境下的幸福的我們。
新開(kāi)一個(gè)記事本,寫(xiě)下以下代碼(好土的代碼,溫故而知新啦):
#include <iostream>
int main()
{
std::cout<<"Enter two numbers:"<<std::endl;
int v1,v2;
std::cin>>v1>>v2;
std::cout<<"The sum of " <<v1<<" and "<<v2<<" is "<<v1+v2<<std::endl;
return 0;
}
保存為Unicode格式的prog1.cc(故意不用cpp,哈哈,天天用cpp給人感覺(jué)又是用VS創(chuàng)建的)
印象中以上代碼的標(biāo)準(zhǔn)庫(kù)似乎在VS2005創(chuàng)建的ConsoleApplication下已經(jīng)無(wú)法編譯了。
打開(kāi)Visual Studio 2005 命令提示工具(開(kāi)始->程序->“然后就是VS的那個(gè)快捷方式了”)
打開(kāi)后就出現(xiàn)了命令提示窗口:(我的程序放在E盤(pán)底下的CPP文件夾內(nèi),命名為prog1.cc)
Setting environment for using Microsoft Visual Studio 2005 x86 tools.
D:\Program Files\Microsoft Visual Studio 8\VC>E:
E:\>cd cpp
E:\cpp>cl -EHsc prog1.cc 用于 80x86 的 Microsoft (R) 32 位 C/C++ 優(yōu)化編譯器 14.00.50727.762 版 版權(quán)所有(C) Microsoft Corporation。保留所有權(quán)利。
prog1.cc Microsoft (R) Incremental Linker Version 8.00.50727.762 Copyright (C) Microsoft Corporation. All rights reserved.
/out:prog1.exe prog1.obj
E:\cpp>prog1 Enter two numbers: 3 7 The sum of 3 and 7 is 10
|
這時(shí)候進(jìn)入文件夾也可以看到多了兩個(gè)文件prog1.exe和prog1.obj
怎么樣,有意思吧。呵呵,也不知道自己會(huì)堅(jiān)持使用這種方法多久。呵呵!
[目的]
記錄C++ Primer學(xué)習(xí)中遇到的需要記憶的東西,這里僅以我個(gè)人為標(biāo)準(zhǔn)進(jìn)行記錄。
[格式]
以下樣例代表了本文所描述的所有摘要片段將通過(guò)以下模版進(jìn)行創(chuàng)建。
Page [PageIndex] ( Chapter [ChapterIndex] [Title of Chapter]) |
[正文] |
[正文]
Page 3 ( Chapter 1 快速入門(mén)) |
在大多數(shù)系統(tǒng)中,main函數(shù)的返回值是一個(gè)狀態(tài)指示器。返回值0往往表示main函數(shù)成功執(zhí)行完畢。任何其他非零的返回值都有操作系統(tǒng)定義的含義。通常非零返回值表明有錯(cuò)誤出現(xiàn)。每一種操作系統(tǒng)都有自己的方式告訴用戶main函數(shù)返回什么內(nèi)容。 |
Page 3 ( Chapter 1 快速入門(mén)) |
在書(shū)中提到的 C:\directory> cl -GX prog1.cpp 命令在利用VS2005所帶的32位C/C++優(yōu)化編譯器下會(huì)出現(xiàn)如下提示:
用于 80x86 的 Microsoft (R) 32 位 C/C++ 優(yōu)化編譯器 14.00.50727.762 版 版權(quán)所有(C) Microsoft Corporation。保留所有權(quán)利。
cl: 命令行 warning D9035 :“GX”選項(xiàng)已否決,并將在將來(lái)的版本中移除 cl: 命令行 warning D9036 :使用“EHsc”而不使用“GX”
|
Page 5 ( Chapter 1 快速入門(mén)) |
并沒(méi)有直接定義進(jìn)行輸入或輸出(IO)的任何語(yǔ)句,這種功能是由標(biāo)準(zhǔn)庫(kù)提供的。 |
Page 6 ( Chapter 1 快速入門(mén)) |
std::cout<<"Enter two number:"<<std::endl; 每個(gè)輸出操作符實(shí)例都接受兩個(gè)操作數(shù):左操作數(shù)必須是ostream對(duì)象;右操作數(shù)是要輸出的值。操作符將其右操作數(shù)寫(xiě)到作為其左操作數(shù)的ostream對(duì)象。 (std::cin與std::cout相反: std::cout 左←右(注意箭頭方向) std::cin 左→右(注意箭頭方向)) …… endl是一個(gè)特殊之,稱為操縱符(manipulator),將它寫(xiě)入輸出流時(shí),具有輸出換行的效果,并刷新與設(shè)備相關(guān)聯(lián)的緩沖區(qū)(buffer)。通過(guò)刷新緩沖區(qū),用戶可立即看到寫(xiě)入到流中的輸出。 |
Page 16 ( Chapter 1 快速入門(mén)) |
當(dāng)我們使用istream對(duì)象作為條件,結(jié)果是測(cè)試流的狀態(tài)。如果流是有效的(也就是說(shuō),如果讀入下一個(gè)輸入是可能的)那么測(cè)試成功。遇到文件結(jié)束符(end-of-file)或遇到無(wú)效輸入時(shí),如讀取了一個(gè)不是整數(shù)的值,則istream對(duì)象是無(wú)效的。處于無(wú)效狀態(tài)的istream對(duì)象將導(dǎo)致條件失敗。 【本信息針對(duì)上文中】 int sum = 0,value; while(std::cin>>value) //以前很少在while里面使用這樣的輸入 …… |
Page 20 ( Chapter 1 快速入門(mén)) |
點(diǎn)操作符通過(guò)它的左操作數(shù)取得有操作數(shù)。點(diǎn)操作符僅應(yīng)用于類(lèi)類(lèi)型的對(duì)象:左操作數(shù)必須是類(lèi)類(lèi)型的對(duì)象,右操作數(shù)必須指定該類(lèi)型的成員。 |
今天收到當(dāng)當(dāng)網(wǎng)寄過(guò)來(lái)的C++ Primer感覺(jué)興奮的同時(shí)又開(kāi)始擔(dān)心。
記得前兩天寫(xiě)下學(xué)習(xí)計(jì)劃這樣的文章,將未來(lái)設(shè)計(jì)地如此“完美”,但今天拿到書(shū)后又一陣壓力壓得我喘不過(guò)氣來(lái),七百多頁(yè)的書(shū)握在手上著實(shí)又厚實(shí)了許多,但給我?guī)?lái)的不是“踏實(shí)”的感覺(jué),而是壓力。當(dāng)年在校可以一天窩在圖書(shū)館看書(shū),800多頁(yè)的書(shū)也就一頁(yè)一頁(yè)地啃下來(lái)了,前后也就兩個(gè)月多,而且效率還挺高的。但現(xiàn)在看這本大部頭就讓我覺(jué)得壓力,每天工作之余也挺累的,真不知道自己該如何堅(jiān)持高效地完成這本書(shū),其實(shí)在我看來(lái),高效地看書(shū)比單純意義上的看書(shū)是更值得關(guān)注的。
下面就我對(duì)高效看書(shū)做一個(gè)簡(jiǎn)要總結(jié)(針對(duì)計(jì)算機(jī)類(lèi)書(shū)籍(非理論型)):
1、看書(shū)我習(xí)慣一次性看一大部分,比如說(shuō)前后章節(jié)關(guān)聯(lián)比較緊密的,我習(xí)慣性會(huì)堅(jiān)持看完,連貫性的東西拆開(kāi)看,通常會(huì)降低效率。而且我不是那種合上書(shū)本前說(shuō)明天再看就一定會(huì)去看的人,因此為了不然自己接下去看的時(shí)候已經(jīng)是下個(gè)月的這種情況發(fā)生,我都會(huì)堅(jiān)持將一個(gè)部分看完。
2、建議在效率高的時(shí)候看書(shū),看書(shū)切忌為了數(shù)量而不追求質(zhì)量,有的時(shí)候可能你很困或者注意力很難集中,那切忌不要看,因?yàn)榭戳说扔跊](méi)看,而似乎又不愿意回頭再看,這樣將浪費(fèi)那部分內(nèi)容。
3、看書(shū)不提倡做小動(dòng)作,之所以說(shuō)不提倡是因?yàn)槲覍⒄f(shuō)“比如拿個(gè)筆晃來(lái)晃去”,因?yàn)檫@個(gè)習(xí)慣很多人都有,但是有的人受影響小,有的人則完全分心了。
4、看書(shū)一定要抓住重點(diǎn)多看幾眼,以前看書(shū)經(jīng)常看后不知所云,后來(lái)發(fā)現(xiàn)需要多關(guān)注重點(diǎn),雖然不是每個(gè)字都要記住,但是重點(diǎn)部分一定要多看幾眼,至于重點(diǎn)是什么,我想抱著求學(xué)的態(tài)度去認(rèn)真看,重點(diǎn)不難找出。記得要多斟酌幾遍,有什么可以隨手記在邊上。
5、看書(shū)要勤做練習(xí),這點(diǎn)和計(jì)算機(jī)特別有關(guān)聯(lián),其實(shí)非常簡(jiǎn)單的代碼,不去實(shí)踐一下也是不容易記住的,哪怕只是抄到電腦上,或許你就會(huì)有新的發(fā)現(xiàn)。而且有的時(shí)候斷點(diǎn)調(diào)試會(huì)有很多新的思路,對(duì)于自己在看書(shū)的時(shí)候有任何的疑問(wèn)可以隨手記錄,比如你可以推算一段代碼的某一處某個(gè)變量的值是否和你所預(yù)期的一樣等等,其實(shí)這些都很容易就能夠掌握,關(guān)鍵在一個(gè)“勤”字。
6、看書(shū)要多加思考,如果有個(gè)學(xué)習(xí)伙伴那就更好,可以互相交流,有的時(shí)候很明顯的東西或許有有分歧的理解,這時(shí)候就是更需要證明的,證明自己往往要比自己看書(shū)更容易掌握,你不會(huì)告訴自己曾經(jīng)某個(gè)時(shí)候你在某個(gè)地方對(duì)某個(gè)問(wèn)題有深入的了解,但你一定會(huì)記得某個(gè)時(shí)候和伙伴為了一個(gè)細(xì)節(jié)爭(zhēng)論正確,最后不管戰(zhàn)況如何,你總是能記住那個(gè)被你求證過(guò)的結(jié)果,而不只是印象中的“似曾相識(shí)”。
7、看書(shū)一定要看好書(shū),推薦到論壇上找找,總是有很多熱心人曾今推薦過(guò),那些被廣泛支持的可以簡(jiǎn)單地稱作“經(jīng)典”,但切忌不要買(mǎi)了很多卻每本只看第一章。
以上是我個(gè)人對(duì)看書(shū)的一點(diǎn)小小的心得。
本來(lái)想寫(xiě)一篇發(fā)泄壓抑的文章,但寫(xiě)著寫(xiě)著就成了表達(dá)看書(shū)心得了,既然寫(xiě)了就發(fā)布上來(lái),希望大家對(duì)我的看書(shū)心得給予評(píng)價(jià)。
希望未來(lái)一段時(shí)間我能堅(jiān)持用自己總結(jié)的方法來(lái)按期完成任務(wù)。我現(xiàn)在在使用Gmail的日歷來(lái)管理我的時(shí)間,希望這對(duì)我有益,也希望大家能夠找個(gè)日歷來(lái)管理自己的時(shí)間(Gmail,Hotmail,Yahoo等都有挺不錯(cuò)的日歷管理功能,大家根據(jù)各自的需要選擇吧)
有效管理時(shí)間,讓未來(lái)過(guò)得充實(shí)而又充滿豐收的喜悅。
半年前的軟件工程課程設(shè)計(jì)和SysClock是我C++的上一個(gè)句號(hào)。在學(xué)校的日子移情別戀于.net平臺(tái),本來(lái)想拓寬路子方便找工作,后來(lái)找到的工作就是做WebApplication的(.net),其實(shí)關(guān)注C#和.net已經(jīng)有半年了,因此上手也還好,憑借著舊有的知識(shí)繼續(xù)闖蕩,不想爭(zhēng)論C++還是C#好,但是因?yàn)楹芫脹](méi)有在C++上有動(dòng)作了,因此也就生疏了,而且從來(lái)也沒(méi)有系統(tǒng)學(xué)習(xí)過(guò)C++,因此也就離他更遠(yuǎn)了。
畢業(yè)設(shè)計(jì)應(yīng)該是大學(xué)階段做過(guò)的最完整的software了,因?yàn)檎业降墓ぷ魇?net的,也就將C#熟能生巧到底了。C++的路子似乎已經(jīng)被遺忘,過(guò)去還皮厚地在簡(jiǎn)歷上寫(xiě)熟悉,現(xiàn)在也許只能寫(xiě)了解了。好在畢業(yè)設(shè)計(jì)我的重點(diǎn)不在于WEB本身,也不在于C#語(yǔ)法,而是強(qiáng)調(diào)設(shè)計(jì)思路,因此所有的重點(diǎn)從OOP開(kāi)始,間或Design Pattern等知識(shí),C#只是一個(gè)表現(xiàn)形式罷了。說(shuō)老實(shí)話,.net下OOP確實(shí)比C++優(yōu)美,更多地關(guān)注于設(shè)計(jì)細(xì)節(jié)讓我對(duì).net更有好感,微軟確實(shí)能將簡(jiǎn)單融入開(kāi)發(fā),讓復(fù)雜的事情簡(jiǎn)單化確實(shí)讓人有更好的“用戶體驗(yàn)”。
前陣子開(kāi)始猶豫是不是要在C++方面繼續(xù)挖掘?到了公司后想過(guò)離開(kāi),但是荒廢了很多月的C++讓我不爭(zhēng)氣,去了一家大公司面試后發(fā)現(xiàn)C++的基本功降低太多,題目簡(jiǎn)單到大二的時(shí)候都可以得心應(yīng)手的地步,但是對(duì)一些底層的細(xì)節(jié)已經(jīng)忘記了。不想和人爭(zhēng)論自己曾經(jīng)有多么優(yōu)秀,只怪自己基本功不扎實(shí)。事情已經(jīng)過(guò)去了四五個(gè)月,也沒(méi)想太多,現(xiàn)在的工作雖然不是很有挑戰(zhàn)性,但是薪酬也能夠?qū)Φ闷鹆夹模饕撬€很安逸,但是安逸給我的感覺(jué)總是有更多的不安,我習(xí)慣于充實(shí)的大腦才能夠有說(shuō)話的底氣,但是我現(xiàn)在感覺(jué)有些力不從心了,還是想回到C++陣營(yíng)上來(lái),想過(guò)一段時(shí)間關(guān)于未來(lái)前景的問(wèn)題,以前關(guān)注于社會(huì)變化,現(xiàn)在關(guān)心的是供需變化,.net搞壟斷估計(jì)是遲早的事,但是做.net的人似乎也多的跟米一樣,想過(guò)跑到JAVA陣營(yíng)去混一片天地,但是已經(jīng)逃離了語(yǔ)言主導(dǎo)的我已經(jīng)不關(guān)心語(yǔ)言的選擇了,我會(huì)投入更多的時(shí)間和精力在設(shè)計(jì)模式、系統(tǒng)架構(gòu)、重構(gòu)等一些所謂的方法論上,只有這樣寫(xiě)出來(lái)的東西才能美,才會(huì)有靈魂,關(guān)注于語(yǔ)言層面畢竟還是過(guò)于低級(jí)了。但是語(yǔ)言是問(wèn)題的表達(dá)形式,沒(méi)有語(yǔ)言,那些方法論永遠(yuǎn)都是空想主意。C#確實(shí)能夠滿足我在設(shè)計(jì)方面的需求,這一點(diǎn)不容否認(rèn),而且工作需要,我不會(huì)放棄它,而且我會(huì)繼續(xù)在上面不斷表現(xiàn)我設(shè)計(jì)上的學(xué)習(xí)研究成果,我想這些基于經(jīng)驗(yàn)的東西比基于技術(shù)的東西更加富有價(jià)值。但是整體方向的選擇還是有一定必要的,前些日子想了一下,Windows的開(kāi)發(fā)人太多了,競(jìng)爭(zhēng)壓力遠(yuǎn)比技術(shù)壓力大,想過(guò)換平臺(tái),也許只有Unix有更好的企業(yè)市場(chǎng),似乎能夠瞄準(zhǔn)電信行業(yè)而去,C++必然是這個(gè)方面的必需品。考慮過(guò)未來(lái)的中國(guó)市場(chǎng)和國(guó)際行情,嵌入式開(kāi)發(fā)(更多的重點(diǎn)被我放在了手機(jī)平臺(tái)的開(kāi)發(fā)上),一切都才剛剛起步,至少國(guó)內(nèi)是個(gè)步履蹣跚的地步,這個(gè)市場(chǎng)會(huì)需要很多的人才,C++應(yīng)該仍然有強(qiáng)大的市場(chǎng),雖然.net已經(jīng)深入手機(jī)平臺(tái),所謂的跨平臺(tái)還是基于平臺(tái)的應(yīng)用軟件,雖然這方面的需求在未來(lái)一定很大,但是入門(mén)門(mén)檻并不高,Winform的朋友很容易就轉(zhuǎn)過(guò)去,.net的跨平臺(tái)性讓大家都不失業(yè),但是大家都沒(méi)有高薪了,現(xiàn)在.net的工作應(yīng)該也是一個(gè)轉(zhuǎn)型的資本,我希望在底層方面有所拓展,因此C++仍然是必須。
C++與我的過(guò)去。過(guò)去還是喜歡所見(jiàn)即所得吧,畢竟拿底層入門(mén)有點(diǎn)浪費(fèi)體力不討好。學(xué)了N年的C語(yǔ)言,仍然只能用于大學(xué)的課程,C語(yǔ)言的知識(shí)其實(shí)很重要,但是現(xiàn)在卻忘記地差不多了,很想把手頭的那本C語(yǔ)言看一遍,當(dāng)年期末復(fù)習(xí)通讀也就兩天不到,但是總是各種各樣的原因阻礙了我的學(xué)習(xí),或許我真的打心眼里不想看它吧。之后學(xué)習(xí)了VC++也是以MFC為核心進(jìn)行展開(kāi),我用MFC又是喜歡于做一些應(yīng)用軟件,比如本文第一句話提到的兩個(gè)家伙。其實(shí)現(xiàn)在要做應(yīng)用軟件,用.net一定更好,因?yàn)榇_實(shí)開(kāi)發(fā)起來(lái)很方便,性能上并沒(méi)有必要追求C++,不過(guò)說(shuō)起來(lái)慚愧,我還是希望用我在Web上的工作經(jīng)驗(yàn)去主導(dǎo)我在Winform的開(kāi)發(fā),畢竟Web比Winform更繁瑣,業(yè)務(wù)邏輯和更底層我已經(jīng)習(xí)慣于用類(lèi)庫(kù)來(lái)描述,因此Web和Win對(duì)我的差異就更小,我可以直接放棄表現(xiàn)層而仍然能夠有所作為,至少我認(rèn)為可以這么做。MFC是C++的經(jīng)典,我想挖掘它更底層的東西,畢竟C++所能做的東西.net不一定能做。
昨天猶豫了很久還是決定從C++的語(yǔ)法開(kāi)始系統(tǒng)的學(xué)習(xí),用C++來(lái)表現(xiàn)設(shè)計(jì)我已經(jīng)力不從心,我得讓自己先有表達(dá)能力,然后才能抉擇更多,以后是針對(duì)UNIX還是Embeded C++就得另作打算了,但是所有的核心不會(huì)變,更多地體現(xiàn)設(shè)計(jì)的理念,雖然將應(yīng)用軟件思想來(lái)對(duì)付底層開(kāi)發(fā)或許不太可取,我想面向底層總不能沒(méi)有設(shè)計(jì)吧?這些細(xì)節(jié)再做討論。以后的日子無(wú)論C#還是C++一個(gè)都不能少一個(gè)也不會(huì)少,時(shí)間要充分地利用起來(lái),付出才會(huì)有收獲,我不想做只說(shuō)不做的人。
昨晚到當(dāng)當(dāng)訂購(gòu)了兩本書(shū),一本是C++ Primer中文版(第4版)、重構(gòu)-改善既有代碼的設(shè)計(jì),這兩本書(shū)也是我現(xiàn)在最想品味的,曾幾何時(shí)發(fā)現(xiàn)自己不是不愛(ài)看書(shū),而是沒(méi)有找到喜歡看的書(shū),第一本將為我復(fù)習(xí)補(bǔ)充我曾經(jīng)非系統(tǒng)地學(xué)習(xí)C++的知識(shí),后一本將繼續(xù)為我的設(shè)計(jì)創(chuàng)造新的動(dòng)力。加油,不放棄,永不言敗!
今天懷著虞城的心來(lái)探索打印CListCtrl的方法,可惜忙到現(xiàn)在被老掉牙的數(shù)據(jù)加載給絆倒。但是從中卻學(xué)到了不少新東西,以前沒(méi)有遇到過(guò)的。現(xiàn)在就寫(xiě)出來(lái)和大家分享。
ODBC數(shù)據(jù)源與CListCtrl的連接已經(jīng)算是老生常談的事情了。
1、先建立數(shù)據(jù)庫(kù)(這里以一個(gè)PrintTest為數(shù)據(jù)源名來(lái)處理,該數(shù)據(jù)庫(kù)包含一張表info,里面有四個(gè)字段,ID,NAME,GROUP,AGE,只是測(cè)試用因此隨便列出幾個(gè)字段,其中ID為數(shù)字類(lèi)型,其余為文本,采用Access數(shù)據(jù)庫(kù)來(lái)建立。方法就是添加一張表,然后分別對(duì)表中填充一些數(shù)據(jù),這里就不再講述!)
2、ODBC數(shù)據(jù)源與程序的連接
???a.在stdafx.h文件的尾部添加#include "afxdb.h"
???b.針對(duì)于整個(gè)工程的全局函數(shù)CDatabase db;
???c.在APP文件的初始化進(jìn)程中添加打開(kāi)數(shù)據(jù)庫(kù)的語(yǔ)句
?????????
????CWinApp::InitInstance();????
//
此句為系統(tǒng)自動(dòng)生成的;
????
if
?(
!
db.IsOpen())
????????db.Open(
"
PrintTest;
"
);
????
else
????????AfxMessageBox(
"
數(shù)據(jù)庫(kù)連接失敗!
"
);

????AfxEnableControlContainer();????
//
此句為系統(tǒng)自動(dòng)生成的;
至此,與數(shù)據(jù)庫(kù)的連接基本上完成了,也正是因?yàn)檫@個(gè)db.Open("PrintTest;");才有了這篇文章。
3、向記錄集(CRecordset)填充數(shù)據(jù),在這里我們必須要談到(數(shù)據(jù)庫(kù)和記錄集對(duì)象之間的)記錄字段交換 (RFX)。(大家可以在MSDN中查閱相關(guān)信息。)現(xiàn)在只將步驟做一個(gè)簡(jiǎn)述:
???a.在“類(lèi)視圖”中添加類(lèi),然后選擇“MFC ODBC 使用者”;
???b.在向?qū)е校瑪?shù)據(jù)源按鈕后選擇“機(jī)器數(shù)據(jù)源”選擇我們?cè)O(shè)置的ODBC數(shù)據(jù)源,這里為PrintTest;確定;
???c.在彈出的對(duì)話框中選擇info表,確定;
???d.修改類(lèi)名,文件名(如果有必要的話),這里改為CInfoRS,InfoRS.h,InfoRS.cpp
???e.注意下面的選擇是“動(dòng)態(tài)集”,確定。(警告關(guān)閉)
這時(shí)候你可以在類(lèi)向?qū)е锌吹教砑拥男骂?lèi),CInfoRS
4、在初始化對(duì)話框的時(shí)候進(jìn)行數(shù)據(jù)的讀入。
值得注意的是:我們剛才定義的是全局的變量,但是定義的語(yǔ)句是在APP文件中寫(xiě)入的,因此在Dlg文件中調(diào)用的時(shí)候我們?nèi)匀恍枰ヂ暶饕幌滤侨肿兞浚簿褪菍?duì)Dlg來(lái)說(shuō),它是在外部已經(jīng)定義過(guò)的變量。因此在Dlg.cpp的開(kāi)頭我們補(bǔ)充extern CDatabase db;
在BOOL CPrintListCtrlDlg::OnInitDialog()中添加
????
//
?TODO:?在此添加額外的初始化代碼
//
注意找到該函數(shù)中的這句話,在其后添加以下代碼
????m_cList.SetExtendedStyle(LVS_EX_GRIDLINES);??????
//
設(shè)置ListCtrl的風(fēng)格
????
int
?nWidth
=
110
;
????m_cList.InsertColumn(
0
,
"
會(huì)員編號(hào)
"
,LVCFMT_LEFT,nWidth
*
2
/
3
);
????m_cList.InsertColumn(
1
,
"
會(huì)員姓名
"
,LVCFMT_LEFT,nWidth);
????m_cList.InsertColumn(
2
,
"
會(huì)員組織
"
,LVCFMT_LEFT,nWidth
*
3
/
2
);
????m_cList.InsertColumn(
3
,
"
年齡
"
,LVCFMT_LEFT,nWidth
/
2
);
????CInfoRS?rs(
&
db);

????UpdateList(rs);
在這個(gè)應(yīng)用程序中同樣要注意到,因?yàn)槲覀冃枰氖且粡堫?lèi)似Access表的表格,而不是類(lèi)似我的電腦的圖標(biāo)形式的風(fēng)格,因此我們需要在添加的ListControl的時(shí)候,將其屬性中的View設(shè)置為Report。
?UpdateList(rs);是我們自己添加的一個(gè)函數(shù),再此我再介紹一下使用類(lèi)向?qū)砑雍瘮?shù)的方法。
在類(lèi)視圖中,右鍵,添加->添加函數(shù),然后添加相關(guān)參數(shù),比如返回值類(lèi)型,參數(shù)類(lèi)型等,記得添加參數(shù)的時(shí)候按“添加”將其添加到參數(shù)列表中。
下面列出UpdateList的代碼:
void
?CPrintListCtrlDlg::UpdateList(CInfoRS
&
?rs)

{
????
int
?i
=
0
;
????CString?strID;
????rs.Open();
????m_cList.DeleteAllItems();
????
while
(
!
rs.IsEOF())

????
{
????????m_cList.InsertItem(i,
""
);
????????strID.Format(
"
%d
"
,rs.m_ID);
????????m_cList.SetItemText(i,
0
,strID);
????????m_cList.SetItemText(i,
1
,rs.m_NAME?);
????????m_cList.SetItemText(i,
2
,rs.m_GROUP);
????????m_cList.SetItemText(i,
3
,rs.m_AGE);
????????rs.MoveNext();
????????i
++
;
????}
????rs.Close();
}
至此這個(gè)程序基本上就編寫(xiě)完成了,但是使用Ctrl+F5調(diào)試的時(shí)候出現(xiàn)了錯(cuò)誤。錯(cuò)誤具體就不再描述,只告訴解決的方法。
1、一個(gè)是CInfoRS類(lèi)中一句#error Security Issue: The connection string may contain a password
解決方法:注釋掉
2、類(lèi)型不匹配:
??m_cList.SetItemText(i,1,rs.m_NAME );
??m_cList.SetItemText(i,2,rs.m_GROUP);
??m_cList.SetItemText(i,3,rs.m_AGE);
將提示rs.m_NAME,rs.m_GROUP,rs.m_AGE不能從“CStringW”轉(zhuǎn)換為“LPCTSTR”
解決方法:在類(lèi)視圖中定位到CInfoRS,在其變量(藍(lán)色方塊后),隨便點(diǎn)一個(gè)進(jìn)入。按以下方法修改:
//將以下代碼:
????long????m_ID;
????CStringW????m_NAME;
????CStringW????m_GROUP;
????CStringW????m_AGE;
//修改為:
????long????m_ID;
????CString????m_NAME;
????CString????m_GROUP;
????CString????m_AGE;
//即將這里的CStringW替換為CString
//其實(shí)可以注意到之前的一大段話:以下字符串類(lèi)型(如果存在)反映數(shù)據(jù)庫(kù)字段(ANSI 數(shù)據(jù)類(lèi)型的 CStringA 和 Unicode數(shù)據(jù)類(lèi)型的 CStringW)的實(shí)際數(shù)據(jù)類(lèi)型。這是為防止 ODBC 驅(qū)動(dòng)程序執(zhí)行可能不必要的轉(zhuǎn)換。如果希望,可以將這些成員更改為CString 類(lèi)型,ODBC 驅(qū)動(dòng)程序?qū)?zhí)行所有必要的轉(zhuǎn)換。(注意: 必須使用 3.5 版或更高版本的 ODBC 驅(qū)動(dòng)程序以同時(shí)支持 Unicode 和這些轉(zhuǎn)換)。
至此,編譯通過(guò)。
但是,隨后彈出錯(cuò)誤:ODBC數(shù)據(jù)源不支持動(dòng)態(tài)集
修正這個(gè)問(wèn)題的方法有二:
一、在剛才添加的時(shí)候,將動(dòng)態(tài)集(默認(rèn))改為快照,在這里,將不會(huì)出現(xiàn)錯(cuò)誤。
二、令人慶幸的是我曾經(jīng)做過(guò)一個(gè)例子,里面確實(shí)是使用動(dòng)態(tài)集,但并沒(méi)有出現(xiàn)這個(gè)錯(cuò)誤,于是我找到了另一個(gè)程序,再次調(diào)試通過(guò)。于是就很是郁悶。于是用斷點(diǎn)調(diào)試,最終確定問(wèn)題是發(fā)生在rs.Open();的位置。
于是查找MSDN發(fā)現(xiàn)(For CRecordset, the default value is CRecordset::snapshot.翻譯:對(duì)于CRecordset默認(rèn)值類(lèi)對(duì)象,默認(rèn)值是 CRecordset::snapshot,也就是快照模式),而我們所用的是動(dòng)態(tài)集的模式。這里可以將rs.Open();改為rs.Open(CRecordset::forwardOnly);再次編譯就可以通過(guò)了。
另外可以將最初的db.Open("PrintTest;");改為db.OpenEx("DSN=PrintTest;");就可以解決問(wèn)題了。這其中的奧妙就不是很清楚,只能當(dāng)作經(jīng)驗(yàn)來(lái)和大家分享一下。也希望有知道的人能夠留言告訴我。謝謝先~!
以下將本示例的代碼以及數(shù)據(jù)庫(kù)打包供大家學(xué)習(xí)下載!
http://www.shnenglu.com/Files/mymsdn/PrintListCtrl.rar
附錄:
1、編譯調(diào)試:Visual Studio.NET 2003中文版
2、在主對(duì)話框需要添加一個(gè)ListControl的控件。(下載的代碼可能還多包括一個(gè)打印控件,但該控件的功能并未實(shí)現(xiàn),只是一個(gè)預(yù)留的測(cè)試功能。大家自行練習(xí)的時(shí)候可以不添加該按鈕。)
如何利用MFC建立的對(duì)話框應(yīng)用程序中一鍵實(shí)現(xiàn)對(duì)CListCtrl(List Control控件)列表的表格打印?
這是一個(gè)讓我覺(jué)得郁悶的問(wèn)題:
問(wèn)題描述:
1、常規(guī)利用一個(gè)MFC對(duì)話框應(yīng)用程序?qū)崿F(xiàn)一個(gè)數(shù)據(jù)庫(kù)管理系統(tǒng)
2、在完成查詢后,希望能夠打印出結(jié)果。
3、為了簡(jiǎn)化功能,實(shí)現(xiàn)打印功能,將僅實(shí)現(xiàn)基本打印功能。
思路分析:
1、CListCtrl類(lèi)是派生于CListView類(lèi)的類(lèi),而CListView類(lèi)又是從CView類(lèi)派生的。因此可以利用CView類(lèi)的打印功能來(lái)輸出相關(guān)數(shù)據(jù)。(找到了成功的打印模型)
2、……
參看參考文章:打印CView類(lèi)文章.rar(
http://www.shnenglu.com/Files/mymsdn/打印CView類(lèi)文章.rar)
本文章并未實(shí)踐過(guò),請(qǐng)高手分析一下思路是否可行,該套用是否可行以及潛在的難點(diǎn)。
摘要: 文檔與序列化
一、文檔的基本特征
文檔類(lèi)文件是從CDocument繼承而來(lái)的。
...
閱讀全文