• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            MyMSDN

            MyMSDN記錄開(kāi)發(fā)新知道

            #

            [翻譯]關(guān)于“異步可插協(xié)議”(About Asynchronous Pluggable Protocols(APPs))

                 摘要: [翻譯]關(guān)于“異步可插協(xié)議”(About Asynchronous Pluggable Protocols(APPs))

            原文鏈接:http://msdn2.microsoft.com/en-us/library/aa767916(VS.85).aspx
              閱讀全文

            posted @ 2008-03-28 02:21 volnet 閱讀(1211) | 評(píng)論 (0)編輯 收藏

            [學(xué)習(xí)筆記](méi)C++ Primer[第二章]基本語(yǔ)言

            Page 30 ( Chapter 2 基本語(yǔ)言)
            算術(shù)類(lèi)型的存儲(chǔ)空間依機(jī)器而定。
            Page 30 ( Chapter 2 基本語(yǔ)言)
            表示整數(shù)、字符和布爾值的算術(shù)類(lèi)型合稱為整形(integral type)
            字符類(lèi)型有兩種:char和wchar_t。char類(lèi)型通常是單個(gè)機(jī)器字節(jié)(byte)。wchar_t類(lèi)型用于擴(kuò)展字符集,比如漢字和日語(yǔ)
            Page 31 ( Chapter 2 基本語(yǔ)言)
            在位這一級(jí)上,存儲(chǔ)器是沒(méi)有結(jié)構(gòu)和意義的。
            讓存儲(chǔ)具有結(jié)構(gòu)的最基本方法是用塊(chunk)處理存儲(chǔ)。……雖然確切的大小因機(jī)器不同而不同,但是通常將8位的塊作為一個(gè)字節(jié),32位或4個(gè)字節(jié)作為一個(gè)“字(word)”
            Page 32 ( Chapter 2 基本語(yǔ)言)
            C++標(biāo)準(zhǔn)并未定義signed類(lèi)型如何用位來(lái)表示,而是由每個(gè)編譯器自由決定如何表示signed類(lèi)型。……符號(hào)位為1,值就為負(fù)數(shù);符號(hào)位為0,值就為0或正數(shù)。……有些語(yǔ)言中將負(fù)數(shù)賦給unsigned類(lèi)型是非法的,但在C++中這是合法的。
            Page 35 ( Chapter 2 基本語(yǔ)言)
            為了兼容C語(yǔ)言,C++中所有的字符串字面值都由編譯器自動(dòng)在末尾添加一個(gè)空字符。
            Page 36 ( Chapter 2 基本語(yǔ)言)
            兩個(gè)相鄰的僅由空格、制表符或換行符分開(kāi)的字符串字面值(或?qū)捵址置嬷担蛇B接成一個(gè)新字符串字面值。
            //concatenated long string literal
            std::cout<<"a multi-line "
            "string literal "
            "using concatenation "
            <<std::endl;
            執(zhí)行這條語(yǔ)句將會(huì)輸出:
            a multi-line string literal using concatenation
            如果連接字符串字面值和寬字符串字面值,將會(huì)出現(xiàn)什么結(jié)果呢?例如:
            //Concatenating plain and wide character strings is undefined
            std::cout<<"multi-line" L"literal "<<std::endl;
            其結(jié)果未定義的(unsigned),也就是說(shuō),連接不同類(lèi)型的行為標(biāo)準(zhǔn)沒(méi)有定義。這個(gè)程序可能會(huì)執(zhí)行,也可能會(huì)崩潰或者產(chǎn)生沒(méi)有用的值,而且在不同的編譯器下程序的動(dòng)作可能不同。
            Page 36 ( Chapter 2 基本語(yǔ)言)
            在一行的末尾加一反斜線符號(hào)可將此行和下一行當(dāng)作同一行處理。
            std::cou\
            t<<"Hi"<<st\
            d::endl;
            等價(jià)于
            std::cout<<"Hi"<<std::endl;
            注意反斜線符號(hào)必須是該行的尾字符——不允許其后面有注釋或空格。同樣,后繼行行首的任何空格和制表符都是字符串字面值的一部分。正因如此,長(zhǎng)字符串字面值的后繼行才不會(huì)有正常的縮進(jìn)。
            Page 39 ( Chapter 2 基本語(yǔ)言)
            C++是一門(mén)靜態(tài)類(lèi)型語(yǔ)言,在編譯時(shí)會(huì)作類(lèi)型檢查。
            Page 41 ( Chapter 2 基本語(yǔ)言)
            標(biāo)識(shí)符不能包含兩個(gè)連續(xù)的下劃線,也不能以下劃線開(kāi)頭后面緊跟一個(gè)大寫(xiě)字母。有些標(biāo)識(shí)符(在函數(shù)外定義的標(biāo)識(shí)符)不能以下劃線開(kāi)頭。
            Page 42 ( Chapter 2 基本語(yǔ)言)
            C++支持兩種初始化變量的形式:復(fù)制初始化(copy-initialization)和直接初始化(direct-initialization)。復(fù)制初始化語(yǔ)法用等號(hào)(=),直接初始化則是把初始化式放在括號(hào)中:
            int ival(1024);    //direct-initialization
            int ival = 1024;    //copy-initialization
            Page 43 ( Chapter 2 基本語(yǔ)言)
            也可以通過(guò)一個(gè)計(jì)數(shù)器和一個(gè)字符初始化string對(duì)象。這樣創(chuàng)建的對(duì)象包含重復(fù)多次的指定字符,重復(fù)次數(shù)由計(jì)數(shù)器指定:
            std::string all_nines(10,'9');    //all_nines="9999999999"
            本例中,初始化all_nines的唯一方法是直接初始化。有多個(gè)初始化式時(shí)不能使用復(fù)制初始化
            Page 44 ( Chapter 2 基本語(yǔ)言)
            內(nèi)置類(lèi)型變量是否自動(dòng)初始化取決于變量定義的位置。在函數(shù)體外定義的變量都初始化成0,在函數(shù)體里定義的內(nèi)置類(lèi)型變量不進(jìn)行自動(dòng)初始化。
            Page 46 ( Chapter 2 基本語(yǔ)言)
            extern聲明不是定義,也不分配存儲(chǔ)空間。
            ……
            只有當(dāng)extern聲明位于函數(shù)外部時(shí),才可以含有初始化式。
            Page 50 ( Chapter 2 基本語(yǔ)言)
            非const變量默認(rèn)為extern,要使const變量能夠在其他的文件中訪問(wèn),必須顯式地指定它為extern
            Page 51 ( Chapter 2 基本語(yǔ)言)
            引用只是對(duì)象的另一個(gè)名字
            Page 52 ( Chapter 2 基本語(yǔ)言)
            const引用可以初始化為不同類(lèi)型的對(duì)象或者初始化為右值
            ……
            非const引用只能綁定到與該引用同類(lèi)型的對(duì)象。
            const引用則可以綁定到不同但相關(guān)的類(lèi)型的對(duì)象或綁定到右值。
            Page 56-57 ( Chapter 2 基本語(yǔ)言)
            如果使用class關(guān)鍵字來(lái)定義類(lèi),那么定義在第一個(gè)訪問(wèn)標(biāo)號(hào)前的任何成員都隱式指定為private;如果使用struct關(guān)鍵字,那么這些成員都是public。使用class還是struct關(guān)鍵字來(lái)定義類(lèi),僅僅影響默認(rèn)的初始化訪問(wèn)級(jí)別。
            可以等效地定義Sales_item類(lèi)為:
            struct Sales_item{
                //no need for public label, memebers are public by default
                //operations on Sales_item objects
            private:
                std::string isbn;
                unsigned units_sold;
                double revenues
            };
            本例的類(lèi)定義和前面的類(lèi)定義只有兩個(gè)區(qū)別:這里使用了關(guān)鍵字struct,并且沒(méi)有在花括號(hào)后使用關(guān)鍵字public。struct的成員都是public,除非有其他特殊的聲明,所以就沒(méi)有必要添加public標(biāo)號(hào)。
            用class和struct關(guān)鍵字定義類(lèi)的唯一差別在于默認(rèn)訪問(wèn)級(jí)別:默認(rèn)情況下,struct的成員為public,而class的成員為private。
            Page 59 ( Chapter 2 基本語(yǔ)言)
            這種行為有一個(gè)很重要的含義:當(dāng)我們?cè)陬^文件中定義了const變量后,每個(gè)包含該頭文件的源文件都有了自己的const變量,其名稱和值都一樣。

            posted @ 2007-06-16 01:32 volnet 閱讀(1001) | 評(píng)論 (2)編輯 收藏

            第一次直接用命令行的方式直接編譯C++

            其實(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)持使用這種方法多久。呵呵!

            posted @ 2007-06-09 19:46 volnet 閱讀(1924) | 評(píng)論 (2)編輯 收藏

            [學(xué)習(xí)筆記](méi)C++ Primer[第一章]快速入門(mé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)型的成員。

            posted @ 2007-06-09 17:29 volnet 閱讀(1384) | 評(píng)論 (6)編輯 收藏

            不盡的想法,不夠的時(shí)間

            今天收到當(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í)而又充滿豐收的喜悅。

            posted @ 2007-06-08 19:41 volnet 閱讀(337) | 評(píng)論 (3)編輯 收藏

            【學(xué)習(xí)計(jì)劃】C#與C++并行生存,為了設(shè)計(jì),為了工作,為了生活,為了……

            半年前的軟件工程課程設(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)力。加油,不放棄,永不言敗!

            posted @ 2007-06-05 10:27 volnet 閱讀(1599) | 評(píng)論 (9)編輯 收藏

            [知識(shí)庫(kù)][轉(zhuǎn)載]十年MFC經(jīng)歷認(rèn)識(shí)的Microsoft技術(shù)(ZT)

            知識(shí)庫(kù)(KnowledgeLibrary) ?

            固定鏈接http://www.shnenglu.com/mymsdn/category/3173.html


            文章標(biāo)題:十年MFC經(jīng)歷認(rèn)識(shí)的Microsoft技術(shù)(ZT)
            關(guān)鍵字:MFC、Microsoft、技術(shù)對(duì)比、技術(shù)發(fā)展
            轉(zhuǎn)載自http://blog.vckbase.com/hangwire/archive/2005/05/26/5806.html
            作者:hangwire
            發(fā)表時(shí)間:2005-05-26 09:13


            一、初識(shí)MFC

              我最初知道MFC大概是在1993年,那個(gè)時(shí)候Visual C++還沒(méi)面世,當(dāng)時(shí)Microsoft的C++編譯器還很弱,官方的名字是Microsoft C/C++ 7.0,MFC的版本是1.0,幾乎沒(méi)有引起什么反響,那個(gè)時(shí)期最好的C++開(kāi)發(fā)環(huán)境是Borland C++ 3.1,其實(shí),大概是1992年11月份,一個(gè)偶然的機(jī)會(huì),我領(lǐng)略到Borland公司的厲害,記不得在什么地方,我看到一個(gè)絕妙的集成開(kāi)發(fā)環(huán)境,即Turbo C++ 3.0 for Windows,這是我記憶中第一個(gè)真正的Windows環(huán)境下的C++集成開(kāi)發(fā)環(huán)境,那種激動(dòng)的感覺(jué)至今仍記憶猶新,不客氣的說(shuō),當(dāng)時(shí)至少在C++方面,Microsoft與Borland不是一個(gè)水平的,Borland明顯的要高于Microsoft ,Borland的產(chǎn)品在技術(shù)上給我留下深刻的印象。那個(gè)時(shí)候Microsoft最好的開(kāi)發(fā)平臺(tái)是Visual Basic 3.0,而B(niǎo)orland的Delphi正處于開(kāi)發(fā)階段(Delphi 的代碼名稱是:"VB Killer")……,想起這些十幾年前的往事,我不禁感慨萬(wàn)千。

              十幾年來(lái),我用過(guò)許多開(kāi)發(fā)環(huán)境,關(guān)于Visual Basic,我用過(guò)最早的DOS版本,Windows版的Visual Basic我基本上全都用過(guò),至今我還記得每個(gè)版本的VB安裝盤(pán)磁盤(pán)的盤(pán)數(shù)。同樣,我用過(guò)各個(gè)版本的Delphi,特別是Delphi 2.0,給我留下極好的印象。Delphi提供真正編譯的可視化開(kāi)發(fā)環(huán)境,那個(gè)時(shí)候(1994年左右),Delphi就可以開(kāi)發(fā)帶有GUI的動(dòng)態(tài)鏈接庫(kù),你可以想象,在Microsoft Access 2.0的應(yīng)用程序中可以加載一個(gè)Delphi Form并進(jìn)行程序交互,那種感覺(jué)真是棒極了。

              Borland C++是我心中無(wú)法抹掉的遺憾,從Turbo C到C++ Builder,我深刻的體驗(yàn)到Borland的輝煌和無(wú)奈,Delphi從VB Killer走到為VB護(hù)航(你可以想象Delphi一步到位的ActiveX 控件開(kāi)發(fā)技術(shù)有多牛,早期的VB有多土,早期的VB不能開(kāi)發(fā)動(dòng)態(tài)鏈接庫(kù),因此無(wú)法開(kāi)發(fā)ActiveX 控件,想起來(lái)真令人噓唏不已),Borland C++的命運(yùn)也是不濟(jì)。Borland C++ 3.1的輝煌永遠(yuǎn)不再了,十幾年的開(kāi)發(fā)工作中,我在C++上投入了大量的精力,Borland C++曾經(jīng)給我?guī)?lái)無(wú)數(shù)的激動(dòng),然而這個(gè)經(jīng)典的名字卻在與Microsoft的競(jìng)爭(zhēng)中漸漸的流逝了……。

              MFC4.0的出現(xiàn),使得人們感覺(jué)Microsoft在C++方面趕上來(lái)了,這一版的MFC是Win95推出后出現(xiàn)在Visual C++ 4中(Microsoft沒(méi)有VC 3,VC4以前的版本是2.2、2.1、2.0、1.51、1.5、1.0)。也許是對(duì)Borland C++的潛意識(shí)的失望,我不知不覺(jué)的接受了MFC,VC 4.2推出時(shí),我通過(guò)正常渠道購(gòu)買(mǎi)了這個(gè)編譯器的企業(yè)版。

            二、關(guān)于Microsoft

              關(guān)于Microsoft,有無(wú)數(shù)的人要對(duì)這個(gè)名字?jǐn)⒄f(shuō)感覺(jué),這個(gè)令人討厭的名字!不知道是喜歡還是憎惡,你是程序員,你的心思可能就要因Microsoft的存在而動(dòng),即使你用Linux,你可能也是因?yàn)镸icrosoft技術(shù)因素。多少年來(lái),這個(gè)名字每天都出現(xiàn)在你、我、他的面前,因?yàn)槟悴坏貌幻鎸?duì)Windows的存在,可是你憎恨這個(gè)名字嗎?你討厭這個(gè)名字嗎?我不知道是否已經(jīng)對(duì)這個(gè)名字麻木了。

              1998年我個(gè)人訂了Microsoft MSDN Universal 版,我開(kāi)始比較全面接觸這個(gè)公司的開(kāi)發(fā)技術(shù),你可以想象,1998年當(dāng)你面對(duì)上百?gòu)埣夹g(shù)光盤(pán)的時(shí)候,你就知道什么叫做"厚度",當(dāng)我們有時(shí)說(shuō)出"趕上"或 "達(dá)到"Microsoft某些產(chǎn)品的水平的時(shí)候,可能我們?nèi)狈?duì)這個(gè)公司"厚度"的真實(shí)了解。進(jìn)入MSDN,我感覺(jué)Microsoft簡(jiǎn)直不是一個(gè)"公司",而是(或者正在形成)一個(gè)"社會(huì)"。

              當(dāng)時(shí)著名的技術(shù)網(wǎng)站http://www.codeguru.com全部的技術(shù)資料是可下載的(那個(gè)時(shí)候http://www.codeguru.com提供整個(gè)網(wǎng)站內(nèi)容下載服務(wù),大約3M左右),大名鼎鼎的

              有人說(shuō)"COM"沒(méi)落了,那么就太不了解Microsoft了。在與"OpenDoc"的競(jìng)爭(zhēng)中,"COM"是個(gè)徹底的勝利者,在與"Java"的競(jìng)爭(zhēng)中,"COM"成功的進(jìn)化了,在這個(gè)過(guò)程中Microsoft體現(xiàn)了強(qiáng)大的吸收能力、以及無(wú)法想象的韌勁。.NET只不過(guò)是COM的"別名"而已。對(duì)于一個(gè)經(jīng)驗(yàn)豐富的C++程序員而言,.NET就是COM的進(jìn)化,而Microsoft內(nèi)部.NET就是"COM 3.0"(OLE2就是COM 2.0),而"CLR"就是一個(gè)不擇不扣的COM對(duì)象。曾經(jīng)有人問(wèn)我,既然牛頓時(shí)代就奠定了基礎(chǔ)(想想著名的牛頓-萊布尼茨公式),幾百年后的今天,數(shù)學(xué)還研究"微積分"嗎?回答當(dāng)然是依然在研究!"微積分"早期是針對(duì)函數(shù)的,現(xiàn)代"微積分"是針對(duì)"流形(Manifold)、纖維叢(Fiber Bundle)"的,概念深?yuàn)W了,可是基本思想不變,只是"微積分"的思想得到合理的延拓與進(jìn)化,你了解Microsoft嗎?Microsoft Research有一批超一流的數(shù)學(xué)家在為Microsoft工作,其中一些是斐爾茲獎(jiǎng)的得主,Microsoft正在實(shí)現(xiàn)如同"微積分"進(jìn)化到"微分流形"一樣將"COM"進(jìn)化到".NET"。從科學(xué)概念角度上分析COM與Java,可能COM更全面、精確,從實(shí)現(xiàn)的成熟度上Java可能更成熟,可是你看到,Microsoft正在不緊不慢的追趕。Microsoft令人聯(lián)想起戰(zhàn)國(guó)時(shí)期的強(qiáng)秦。

              戰(zhàn)國(guó)時(shí)期的秦國(guó),采取"遠(yuǎn)交近攻""撫弱掠強(qiáng)"等措施傲視六國(guó),今天的Microsoft也是這樣,VB1.0時(shí),Microsoft推出"VBX"控件技術(shù),眾多的小公司得以生存,Microsoft自己不開(kāi)發(fā)"VBX"組件,同樣"VBX"進(jìn)化為"OCX"時(shí),Microsoft并不十分強(qiáng)大,可是這種試探得到眾多小公司的響應(yīng)。1997年Microsoft Office 97、1998年Microsoft推出Visual Studio 6.0,給眾多中、小公司提供了生存、發(fā)展的機(jī)會(huì),例如Microsoft Office 97中集成了Visual Basic for Application 5.0,這項(xiàng)技術(shù)使得幾百家軟件開(kāi)發(fā)商與Microsoft簽署了VBA技術(shù)許可協(xié)議,即使AutoDesk這樣的公司都與Microsoft簽署了這個(gè)協(xié)議,這個(gè)協(xié)議使得每個(gè)集成VBA的產(chǎn)品的給個(gè)用戶許可為Microsoft付40$的許可費(fèi),如果你了解VSIP(Visual Studio Integration Protocol)協(xié)議,以及有多少公司簽訂了VSIP協(xié)議,你就真正感覺(jué)到Microsoft的可怕;Microsoft Office 97、Visual Studio 6.0的用戶界面十分漂亮,為什么Microsoft自己的開(kāi)發(fā)工具不提供類(lèi)似的軟件組件?你看到眾多第三方的Microsoft盟友紛紛推出自己的界面庫(kù)以模仿Microsoft,他們不會(huì)反對(duì)Microsoft,因?yàn)樗麄円呀?jīng)形成了使得Microsoft以及這些公司得以生存的生態(tài)圈。

              Microsoft的技術(shù)儲(chǔ)備有多少,Microsoft之外的人很難說(shuō)清楚,Microsoft中國(guó)公司也未必了解多少,1999年WTL類(lèi)庫(kù)剛剛出現(xiàn)的時(shí)候,人們就希望WTL能得到官方的支持,或授權(quán)給一個(gè)Microsoft之外的一個(gè)公司(你能想象出Borland C++ 5.0內(nèi)置的ActiveX開(kāi)發(fā)機(jī)制是基于Microsoft ATL類(lèi)庫(kù)嗎?),直到今天,WTL依然如故,我們完全相信,如果Microsoft強(qiáng)力推廣WTL,WTL完全可以流行,可是Microsoft不缺類(lèi)似的技術(shù),類(lèi)似的類(lèi)庫(kù)還有BCL(Base Control Library,一個(gè)用于開(kāi)發(fā)輕量級(jí)ActiveX控件的類(lèi)庫(kù)),Microsoft還有一個(gè)基于ATL的類(lèi)庫(kù),這個(gè)類(lèi)庫(kù)用于開(kāi)發(fā)ActiveX Designer,ActiveX Designer是絕大多數(shù)程序員不了解的一類(lèi)對(duì)象,如果你熟悉Office開(kāi)發(fā),你知道Office VBA 中有一類(lèi)對(duì)象,即Form2,此外VB6.0 中的報(bào)表設(shè)計(jì)器(以及著名的Active Reporter),都屬于此類(lèi)對(duì)象,用這個(gè)類(lèi)庫(kù),你可以為VB6.0以及集成VBA的系統(tǒng)提供定制化的可視化設(shè)計(jì)機(jī)制等等,如今ActiveX Designer已經(jīng)演化為集成于Visual Studio .NET中的設(shè)計(jì)器。

            三、向Microsoft學(xué)習(xí)

              無(wú)論從什么角度評(píng)價(jià)Microsoft,我覺(jué)得Microsoft是值得我們學(xué)習(xí)的,如果說(shuō)生活在這個(gè)時(shí)代有Microsoft存在是一場(chǎng)災(zāi)難,你就應(yīng)該痛恨這個(gè)家伙,但你首先要向這個(gè)家伙學(xué)習(xí)!我無(wú)意為Microsoft歌功頌德,我只是想說(shuō)出十幾年我對(duì)Microsoft技術(shù)的感受。

              Microsoft在研究式的開(kāi)發(fā)中受益極大,如果你有興趣,你可以訪問(wèn)

              在Office大戰(zhàn)中,國(guó)產(chǎn)軟件的確在一些方面與Microsoft進(jìn)行較量,其實(shí)給人的感覺(jué)很勉強(qiáng),界面上的似是而非,或用戶習(xí)慣方面的接近并不能解決根本的問(wèn)題,一個(gè)好的軟件開(kāi)發(fā)人員必須是一個(gè)軟件使用的高手,很難想象一個(gè)軟件操作水平很拙劣的開(kāi)發(fā)人員能開(kāi)發(fā)出高水平的軟件,我最早使用的軟件之一就是Microsoft Word,當(dāng)時(shí)的版本是2.0,大概是1992年的事情,給我留下深刻印象的是集成于Word中的Word Basic,后來(lái),我接觸到Excel 3.0,不出所料,Excel中集成的是Excel Basic,后來(lái)使用的Access中自然內(nèi)置Access Basic 1.0,在這些軟件集成捆綁成Office之前,我就感覺(jué)這些產(chǎn)品的構(gòu)思十分了不起,很具有Microsoft的風(fēng)格,因?yàn)槟阒溃词故且粋€(gè)DOS,Microsoft都要提供一個(gè)內(nèi)置的QBasic或GW Basic。雖然關(guān)于Microsoft的產(chǎn)品評(píng)論很多,作為一個(gè)技術(shù)人員,我認(rèn)為Microsoft的產(chǎn)品構(gòu)思絕對(duì)是第一流的,從1994年早期的Office系列到1997年形成的Office 4.2,我認(rèn)為,技術(shù)構(gòu)思上均領(lǐng)先于我國(guó)2002年以后的Office產(chǎn)品,你聽(tīng)說(shuō)過(guò)如下說(shuō)法嗎?"Dos 作為操作系統(tǒng)的時(shí)代,Windows是應(yīng)用軟件;Windows是操作系統(tǒng)時(shí),Office成為Dos時(shí)代的Windows;那么如果按此規(guī)律,Office會(huì)不會(huì)替代Windows而成為操作系統(tǒng)?",現(xiàn)在在開(kāi)發(fā)領(lǐng)域Visual Studio( .NET)正在成為另一個(gè)Office,你注意到了嗎?控制Visual Studio( .NET)集成開(kāi)發(fā)環(huán)境的仍然是一個(gè)Basic語(yǔ)言引擎(Visual Basic .NET)。

              與許多公司不同的是,在技術(shù)體系上,Microsoft幾乎所有的產(chǎn)品是息息相關(guān)的,Windows、Office、Visual Studio .NET雖然各不相同,但公共的核心即將形成,我們已經(jīng)看到,核心組件方面,Office與Visual Studio .NET日漸趨于一致,例如Microsoft正在將Office 2003的核心組件VBA 6.X逐步用新的Visual Studio Tools for Office替代,而我們依然在一些似是而非的現(xiàn)象上與Microsoft的產(chǎn)品比較差距,國(guó)家采購(gòu)或政府采購(gòu)支持的公司,不去鉆研核心技術(shù),只是急功近利的采用短期行為急于與Microsoft相爭(zhēng),不知是否有蚍蜉撼樹(shù)的感覺(jué),個(gè)人的體驗(yàn)是,先學(xué)習(xí)Microsoft,踏踏實(shí)實(shí)的學(xué),了解Microsoft,深入的了解,然后再喊口號(hào)。

            四、為什么用MFC?

              經(jīng)過(guò)若干年的競(jìng)爭(zhēng),Borland 的OWL幾乎消失了,這個(gè)OWL是個(gè)非常漂亮的C++類(lèi)庫(kù),在Borland C++ 3.1風(fēng)光無(wú)限的年代,OWL真正的做到了獨(dú)領(lǐng)風(fēng)騷。然而,Borland C++ 4.0錯(cuò)過(guò)了進(jìn)入32位程序的最佳時(shí)機(jī),BC 4.0推出后不久,迎來(lái)了Win95,Borland倉(cāng)促上陣,以一個(gè)小的"Pack"使得BC4可以編譯基于Win4的程序,當(dāng)時(shí)的Visual C++是2.0版,支持Window16的版本為Visual C++1.51,有意思的是Borland可以用同一個(gè)編譯器同時(shí)支持Win16、Win32,而Microsoft卻不得不為Win16、Win32提供不同的編譯器。然而,非正式版本的Visual C++ 2.1與Visual C++ 2.2卻悄悄地支持了Win95的最新特征,即Win95新提供的一組公共控件,在我的印象中,Borland對(duì)Win95新特征的支持不利使得MFC與OWL的距離極大的縮短了。稍后到來(lái)的Borland C++ 4.5沒(méi)有改變這個(gè)狀況,盡管Borland C++ 5.0同時(shí)支持OWL與MFC,可是敗象已經(jīng)顯露,Borland C++非常遺憾的只走到了5.5版。C++ Builder雖然形式上引入了Delphi的VCL庫(kù),可是許多C++程序員并不買(mǎi)賬,因?yàn)樵S多以C++為樂(lè)的人更喜歡以編輯的模式進(jìn)行編碼。Visual C++ 4.0的出現(xiàn),在C++這個(gè)戰(zhàn)場(chǎng)上,Borland開(kāi)始落敗了。

              MFC發(fā)展到今天,已經(jīng)十多年了,盡管褒貶不一,但可以肯定,十幾年的技術(shù)積累已經(jīng)奠定了MFC的生存基礎(chǔ),即使Microsoft的長(zhǎng)角發(fā)布,MFC也不能推出Windows的舞臺(tái),事實(shí)上,長(zhǎng)角(Longhorn)之后的Visual Studio .NET仍將MFC作為一個(gè)重要的組成部分,在今年的Visual Studio .NET 2005中,MFC在C++中的位置依然如故。MFC的未來(lái),應(yīng)該不必?fù)?dān)心,只要你深入考察.NET類(lèi)庫(kù),你會(huì)發(fā)現(xiàn),MFC的許多思想機(jī)制正悄然進(jìn)入.NET,與此同時(shí),Microsoft的第三方盟友十多年來(lái)已為MFC開(kāi)發(fā)了大量的擴(kuò)展庫(kù),如果Microsoft是船,第三方盟友就是載舟之水。許多人認(rèn)為MFC不發(fā)展了,其實(shí)是一種錯(cuò)覺(jué),Visual C++ 6的界面十分經(jīng)典,特別是其中的Docking控制條機(jī)制,其實(shí)Visual C++ 6的IDE完全就是MFC寫(xiě)的,可是MFC類(lèi)庫(kù)中控制條相關(guān)的類(lèi)功能很弱,為什么?你會(huì)看到許多與Microsoft友好的公司,他們很快的在MFC基礎(chǔ)上實(shí)現(xiàn)了Visual C++ 6 的Docking機(jī)制,這就是Microsoft的高明之處,Microsoft很會(huì)給盟友提供機(jī)會(huì),其一貫的做法就是在自己的商品化產(chǎn)品中預(yù)先提供一些有趣的特征,使得其他一些公司進(jìn)行模仿以帶動(dòng)用戶群體。Borland不具備這樣的儲(chǔ)備。MFC第三方市場(chǎng)的繁榮,得益于Microsoft的策略與明智。MFC可否跨平臺(tái)?理論上完全可以,Microsoft不做,也是策略,但是有許多重要的產(chǎn)品Microsoft卻默許MFC移植到其他平臺(tái),事實(shí)上,Microsoft的合作伙伴之一Mainsoft公司(Windows源碼就是從這家公司流失的),幾年來(lái)就是負(fù)責(zé)移植MFC程序移植到UINIX、Linux、AIX等操作系統(tǒng)之上。

              新版的Visual C++中MFC已經(jīng)支持.NET開(kāi)發(fā)了,MFC與ATL的協(xié)作更好了。根據(jù)我的經(jīng)驗(yàn),MFC、ATL與.NET庫(kù)三者完全可以融合在一起綜合應(yīng)用到實(shí)際的開(kāi)發(fā)工作中去,如果你是MFC行家,我希望ATL與.NET庫(kù)能成為你的忠實(shí)的左右手。那么有沒(méi)有同時(shí)支持MFC、ATL與.NET庫(kù)的程序?當(dāng)然有,Visual Studio .NET IDE就是!而且Visual Studio .NET IDE還支持用ATL與.NET庫(kù)擴(kuò)展的Addin,如果你希望用MFC管理ATL與.NET庫(kù),請(qǐng)繼續(xù)支持我!

            五、認(rèn)識(shí)Application對(duì)象

              如果你熟悉Microsoft Office,你應(yīng)該進(jìn)一步的剖析這個(gè)大型軟件,Microsoft Office中幾乎每個(gè)程序都是可二次開(kāi)發(fā)的,這一點(diǎn)得益于Microsoft Office內(nèi)置的二次開(kāi)發(fā)機(jī)制,一個(gè)是基于COM機(jī)制的VBA模型,另一個(gè)是基于.NET框架的托管模型:Visual Studio Tools for Office。作為一名程序員,你應(yīng)當(dāng)在技術(shù)角度解析Office的技術(shù)結(jié)構(gòu)。Microsoft的大多數(shù)軟件的對(duì)象結(jié)構(gòu)可以通過(guò)Visual Studio提供的工具OLE/COM Object Viewer考察其類(lèi)型庫(kù)得到,通過(guò)引用類(lèi)型庫(kù),你甚至可以得到描述對(duì)象信息的C++頭文件。這樣做真是好處多多。一個(gè)典型的Office通常都有一個(gè)Application對(duì)象(或其他一個(gè)與之相當(dāng)?shù)膶?duì)象),這個(gè)對(duì)象相當(dāng)于軟件樞紐,在這里,我們不討論Office,借此話題說(shuō)說(shuō)Application對(duì)象。大多數(shù)支持?jǐn)U展(Addin、Plugin)的軟件都存在類(lèi)似的構(gòu)造。通常,一個(gè)系統(tǒng)得Application對(duì)象或者是一個(gè)COM對(duì)象,或者是一個(gè).NET對(duì)象,如果你的系統(tǒng)存在這類(lèi)對(duì)象,你的系統(tǒng)就基本具備支持Addin、Plugin的機(jī)制了。一個(gè)理想的做法就是在一個(gè)MFC系統(tǒng)中,內(nèi)置一個(gè)ATL對(duì)象或.NET對(duì)象,稍后我們給出方案如何做到這一點(diǎn)。設(shè)計(jì)Application對(duì)象的關(guān)鍵是如何規(guī)劃這個(gè)對(duì)象的屬性、方法、事件。如果你希望系統(tǒng)具備良好的擴(kuò)展性,Application對(duì)象是十分關(guān)鍵的,這也是構(gòu)架藝術(shù)的體現(xiàn)。所謂Addin(Plugin),是系統(tǒng)運(yùn)行時(shí)根據(jù)需要加載的對(duì)象庫(kù),Addin(Plugin)之所以可以擴(kuò)展系統(tǒng),關(guān)鍵的因素就是系統(tǒng)加載Addin(Plugin)時(shí),將Application對(duì)象傳遞給Addin(Plugin)庫(kù),設(shè)想一下,如果Application恰到好處的觸發(fā)了系統(tǒng)事件,而Addin(Plugin)庫(kù)如愿的解釋了事件,一個(gè)Addin(Plugin)庫(kù)的任務(wù)不就OK了嗎!因此Application對(duì)象是系統(tǒng)設(shè)計(jì)的關(guān)鍵。

              如果你精通ATL對(duì)象,在你的MFC系統(tǒng)中添加一個(gè)ATL對(duì)象,這個(gè)任務(wù)可以用VC Wizard完成。你已經(jīng)接受了一個(gè)事實(shí),就是MFC程序中存在一個(gè)CXXXApp對(duì)象(CWinApp的派生類(lèi)),現(xiàn)在你要做的是增加一個(gè)對(duì)應(yīng)得ATL對(duì)象。這個(gè)對(duì)象可以在CXXXApp::InitInstance()中創(chuàng)建,如果ATL對(duì)象的類(lèi)是CXXXAppObject,建議你在CXXXApp對(duì)象對(duì)象中增加一個(gè)成員變量,例如:CComObject<CXXXAppObject>* m_pAppObj,然后可以入下初始化m_pAppObj:

            m_pAppObj = new CComObject<CXXXAppObject>;

              注意程序結(jié)束時(shí)在CXXXApp::ExitInstance()中釋放m_pAppObj,語(yǔ)句如下:

            delete m_pAppObj;

              你可以將系統(tǒng)得關(guān)鍵屬性設(shè)置成CXXXAppObject的屬性,例如系統(tǒng)得標(biāo)題、是否為多文檔等等。系統(tǒng)希望外部調(diào)用的功能可以實(shí)現(xiàn)為CXXXAppObject的方法,這一點(diǎn)取決于你的需要。系統(tǒng)需要外部擴(kuò)展的功能,表現(xiàn)為CXXXAppObject的事件,關(guān)鍵是在恰當(dāng)?shù)奈恢糜|發(fā)事件以及提供的事件參數(shù)。例如,你可以在CXXXApp::InitInstance()觸發(fā)應(yīng)用程序開(kāi)始的事件OnStartUp,Plugin捕獲事件后,可以進(jìn)行特定的初始化(身份確認(rèn)、初始信息查詢等等);你可以在CXXXApp::ExitInstance()觸發(fā)應(yīng)用程序結(jié)束事件,Plugin捕獲事件后,處理用戶需要的系統(tǒng)退出工作。所有的設(shè)計(jì)取決于具體設(shè)計(jì)。

              如何加載Plugin,是一個(gè)有趣的問(wèn)題,如果Plugin實(shí)現(xiàn)為一個(gè)COM范疇(Category),可以運(yùn)用COM技術(shù)枚舉這個(gè)Category;可以將Plugin安裝到一個(gè)特定目錄,也可以通過(guò)注冊(cè)表。Plugin的實(shí)現(xiàn)可以用COM技術(shù)、也可以用.NET框架。適當(dāng)?shù)臋C(jī)會(huì)我會(huì)提供例子……

            六、后記

              一時(shí)心血來(lái)潮,就寫(xiě)了這篇文章,很難說(shuō)是有心,還是無(wú)意。幾天前我在新浪網(wǎng)上看應(yīng)氏杯圍棋決賽,我覺(jué)得該贏了吧,作為一個(gè)圍棋迷,我們等了十幾年,等到了屬于國(guó)人的應(yīng)氏杯。記得7、8年前在還在大學(xué)工作的時(shí)候,有一次,一位同事興致沖沖的走道我面前對(duì)我說(shuō):"嗨,昨天馬XX贏了李昌鎬!",當(dāng)時(shí)我在系辦公室正在看報(bào)紙,那位仁兄見(jiàn)我頭都沒(méi)抬,非常不滿的搶下報(bào)紙,對(duì)我吼道:"喂!馬XX贏了李昌鎬!!你聽(tīng)到?jīng)]有!!!",我對(duì)他說(shuō):"你大驚小怪個(gè)啥?!馬XX輸了李昌鎬多少盤(pán),你知道嗎?",馬XX幾乎一直在輸給李昌鎬,人們已經(jīng)不奇怪了,偶爾贏一次,國(guó)人就把他捧得北都找不到了,李昌鎬弱冠17的時(shí)候就傲視這個(gè)世界了,可至今面孔不變,幾天前的農(nóng)心杯,中日聯(lián)軍5個(gè)人,被他打個(gè)落花流水,李昌鎬是公認(rèn)的世界第一,以至于有的高手知道下一個(gè)對(duì)手如果是他,就會(huì)去訂回程機(jī)票。這次應(yīng)氏杯,國(guó)人竟然感謝崔哲瀚,何也?因?yàn)檫@個(gè)弱冠19的小子,擋住了他的大哥李昌鎬才使得應(yīng)氏杯有了懸念。當(dāng)國(guó)人媒體在說(shuō)韓國(guó)僅李昌鎬一人厲害的時(shí)候,不知道是出何居心還是自欺欺人,李昌鎬年方30,不知道要力壓中、日多少年!面對(duì)這個(gè)名字,真有點(diǎn)麻木了,這個(gè)太極虎!

              軟件界又來(lái)了我們一向不齒的印度虎,2001年我們的軟件出口額僅是印度的四十分之一,我們震驚了,怎么可能呢?這個(gè)四十分之一水分很大,很可能更可憐!當(dāng)時(shí)我在大連參加一個(gè)關(guān)于"大連軟件出口國(guó)內(nèi)第一"的官方會(huì)議,那位大人在會(huì)上說(shuō):"據(jù)說(shuō),我們大連軟件出口國(guó)內(nèi)排名第一,市有關(guān)領(lǐng)導(dǎo)希望今天的會(huì)議給出這個(gè)第一的數(shù)字依據(jù),希望你們把數(shù)據(jù)報(bào)上來(lái),去年的數(shù)據(jù)也可申報(bào),注意,我們要的只是數(shù)據(jù),你們仔細(xì)體會(huì),我們根據(jù)數(shù)據(jù),有獎(jiǎng)勵(lì),機(jī)會(huì)難得呀!"……。某一天,幾個(gè)朋友在我家看央視的對(duì)話節(jié)目,對(duì)話一方為國(guó)內(nèi)的軟件大鱷們(用友、阿爾派等公司的老總們),另一方為印度軟件的一個(gè)代表團(tuán)。當(dāng)問(wèn)及中、印軟件差距的時(shí)候,我們的劉老總(代表阿爾派)不以為然的說(shuō),據(jù)他的看法,我們已經(jīng)快趕上(印度)了,……,言下之意頗有印度的水平不過(guò)如此的感覺(jué),印度方的話我至今記憶猶新:"是否趕上,國(guó)際市場(chǎng)說(shuō)的算!在中國(guó)看來(lái),印度程序員的個(gè)性不足,技術(shù)也不怎么樣,其實(shí)是個(gè)錯(cuò)覺(jué),印度軟件首先注重個(gè)性,許多重要的美國(guó)商品化軟件都是在印度本土開(kāi)發(fā)的……",我們的輿論總是將印度程序員的水平描述的平庸至極,可是差距日漸拉開(kāi),……,圍棋、足球(不好意思談,談不出口!)、軟件,我們被近鄰嚴(yán)酷的封鎖了,樂(lè)壞了記者們、給媒體帶來(lái)了生機(jī)……

              日本江戶時(shí)代的圍棋,如果一個(gè)人要想世襲一個(gè)稱號(hào)(例如:本因坊),他必須戰(zhàn)勝所有的師兄弟,然后,住進(jìn)師父家的內(nèi)室,你知道以后的事情嗎?以后,這個(gè)棋手,就得為師父一家做飯、帶孩子、搞衛(wèi)生……,其余的門(mén)人則一心一意的下棋,這樣的人、方式,造就了一代一代的本因坊,他們的棋譜大多數(shù)都流芳至今,這就是早期日本圍棋的悟道模式。軟件總共有多少語(yǔ)句?我最早接觸的計(jì)算機(jī)軟件教材是一本英文版的(影印的D版),不同于我們,那本書(shū)的作者構(gòu)造了"X-語(yǔ)言",他們不講什么C、Pascal、Basic,一旦缺了什么機(jī)制,就給"X-語(yǔ)言"添加些成分。什么C、Pascal、Basic,你感覺(jué)差不多,但現(xiàn)在卻分出了等級(jí)!我們駕馭語(yǔ)言的能力弱得很,可是我們?cè)谡Z(yǔ)言的細(xì)微之處卻很講究,不知道對(duì)不對(duì),許多程序員也許是出于虛榮而用C++,事實(shí)上,地球人到知道,做數(shù)據(jù)庫(kù),Delphi、VB遠(yuǎn)比C++勝任,鋪天蓋地的C++的書(shū),寫(xiě)的東西幾乎雷同,因?yàn)椋杏玫幕蛘咦髡卟粚?xiě)、或者作者不懂。有時(shí)我在想,如果國(guó)內(nèi)沒(méi)有內(nèi)需,會(huì)怎樣?也許軟件內(nèi)需的存在,造就了中國(guó)軟件的特色,我認(rèn)為國(guó)內(nèi)業(yè)界并沒(méi)有充分利用中國(guó)軟件內(nèi)需的存在,也許中國(guó)軟件內(nèi)需的存在是軟件落后的硬傷。

              我記得一部電影《神辮》,那個(gè)英雄的大辮子被洋人炸掉了,最終他成了神槍手,戰(zhàn)勝洋人用大刀、秘籍是不行的,用洋的東西戰(zhàn)勝洋的技術(shù)才是正道。我覺(jué)得,一個(gè)好的程序員必須了解軟件的歷史,學(xué)習(xí)歷史,你知道你為什么弱,別人是如何強(qiáng)大的。我們正在另一個(gè)戰(zhàn)場(chǎng)上抗美(可笑的是我們卻要趕超印度!),無(wú)論Microsoft、Borland如何爭(zhēng)斗,無(wú)論他們誰(shuí)統(tǒng)治誰(shuí),他們不影響美國(guó)的強(qiáng)大,朋友們,學(xué)習(xí)Microsoft,開(kāi)發(fā)出讓國(guó)人感到牛的軟件!

            posted @ 2006-12-04 22:05 volnet 閱讀(715) | 評(píng)論 (0)編輯 收藏

            CListCtrl(List Control)綁定ODBC數(shù)據(jù)庫(kù)的方法。(附加:CRecordset::Open()與CRecordset::OpenEx()區(qū)別之真實(shí)體驗(yàn)~)

            今天懷著虞城的心來(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í)候可以不添加該按鈕。)

            posted @ 2006-09-18 02:07 volnet 閱讀(3742) | 評(píng)論 (0)編輯 收藏

            如何利用MFC建立的對(duì)話框應(yīng)用程序中一鍵實(shí)現(xiàn)對(duì)CListCtrl(List Control控件)列表的表格打印?

            如何利用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)。

            posted @ 2006-09-17 14:13 volnet 閱讀(3278) | 評(píng)論 (2)編輯 收藏

            用文檔序列化來(lái)保存打開(kāi)文件[理論聯(lián)系實(shí)際]

                 摘要: 文檔與序列化 一、文檔的基本特征 文檔類(lèi)文件是從CDocument繼承而來(lái)的。 ...  閱讀全文

            posted @ 2006-08-16 23:19 volnet 閱讀(2428) | 評(píng)論 (0)編輯 收藏

            僅列出標(biāo)題
            共9頁(yè): 1 2 3 4 5 6 7 8 9 
            特殊功能
             
            亚洲av日韩精品久久久久久a| 亚洲国产精品无码久久青草| 精品国产乱码久久久久久呢| 色狠狠久久综合网| 国产精品va久久久久久久| 国内精品伊人久久久久网站| 污污内射久久一区二区欧美日韩| 久久妇女高潮几次MBA| 久久精品国产免费| 伊人精品久久久久7777| 99久久99久久| 一本一本久久aa综合精品| 91久久精品国产成人久久| 伊人久久大香线蕉综合网站| 精品999久久久久久中文字幕| 亚洲国产婷婷香蕉久久久久久| 久久久精品2019免费观看| 午夜精品久久久久成人| 欧美亚洲国产精品久久蜜芽| 久久精品国产清自在天天线| 久久国产精品偷99| 91精品国产综合久久精品| 久久久亚洲裙底偷窥综合| 久久高潮一级毛片免费| 久久精品一区二区国产| 久久久久久无码Av成人影院| 亚洲精品国产第一综合99久久| 久久久久久免费一区二区三区| 亚洲va久久久噜噜噜久久| 蜜臀久久99精品久久久久久| 国产99久久久国产精品~~牛| 久久精品中文闷骚内射| 国内精品九九久久精品| 国产精品久久婷婷六月丁香| 久久久久女教师免费一区| 亚洲午夜精品久久久久久人妖| 久久人人爽人人人人爽AV| 久久人妻少妇嫩草AV蜜桃| 精品国产乱码久久久久软件| 日日狠狠久久偷偷色综合免费| 99久久伊人精品综合观看|