ATL的GUI程序设计(前言)
前言
也許,你是一個(gè)頑固的SDK簇?fù)碚?#xff1b;
也許,你對MFC抱著無比排斥的態(tài)度,甚至像我一樣對它幾乎一無所知;
也許,你符合上面兩條,而且正在尋求著一種出路;
也許,你找到了一條出路——WTL,但是仍然為它的技術(shù)支持、它的上下兼容性感到擔(dān)憂;
也許,你還有著更多的也許;
也許,這時(shí)候你看到了李馬的這篇文章。
世界上的故事,往往就是由各種“也許”交織而成的。
我的轉(zhuǎn)型
歷史告訴我,在向別人推薦一樣?xùn)|西的時(shí)候,首先應(yīng)該告訴別人你從中獲益了多少,如是才能夠使這一切更加具有說服力。比如我告訴你,我自從用了ATL之后,腰不酸了、腿不疼了、走路也有勁兒了,那么你沒準(zhǔn)兒就會對ATL產(chǎn)生些許的好感。是的,在《前言》的這一節(jié)里,我將以我自身的Win32 GUI程序設(shè)計(jì)經(jīng)歷來向你不遺余力地推薦ATL——因?yàn)槲业倪@一系列連載就是以它為主題的。
2000年,我開始用Visual Basic學(xué)寫Win32下(嚴(yán)格地說,當(dāng)時(shí)的Windows 95并不能算是純粹的Win32系統(tǒng),它只是一個(gè)16/32位Windows的雜種)的程序。到了2001年,我開始厭倦它的運(yùn)行庫與運(yùn)行效率,于是轉(zhuǎn)投了Delphi。也許是Borland的粉絲不好做,也許是我厭倦了PASCAL的嚴(yán)謹(jǐn),又也許是那種“真正的程序員用VC”的幼稚思想在作怪——總之,我又投向了VC。
一方面是我忒摳門兒,不舍得花錢買好書;另一方面,中國的MFC書籍琳瑯滿目魚龍混雜而使我無法提起學(xué)習(xí)的興致——反正不知道什么時(shí)候開始,我就開始強(qiáng)烈抵觸MFC這個(gè)本無過錯(cuò)的Framework,而僅僅憑著雜志報(bào)紙上寥寥的幾篇SDK文章和全英文的MSDN 6.0開始了我艱難的學(xué)習(xí)長征。所幸,這一路上雖然磕磕絆絆,但最終我還是到達(dá)了屬于我的陜北。如果您于此期間曾經(jīng)在網(wǎng)上或其它媒體上看到過我的Win32技術(shù)文章,就應(yīng)該會發(fā)現(xiàn)這其中我極少涉獵MFC的任何內(nèi)容——我不否認(rèn)我對它存在著狹隘的偏見,雖然我在2005年完成的畢業(yè)設(shè)計(jì)是用MFC編寫的。
SDK終究不是一個(gè)讓人舒適的歸宿,我想SDK的粉絲們都應(yīng)該有著深深的體會。哪怕是你的代碼增加到1000行,你都會覺得維護(hù)這些東西的難度非常之大——臃腫、堆砌、全局、耦合、復(fù)用性差——有太多丑陋的詞語都可以用在這上面。是的,我的確說過我不喜歡MFC,但是我也同樣不能否認(rèn)用MFC編寫的程序結(jié)構(gòu)清楚、分流明晰——當(dāng)然,如果你不是深入到MFC內(nèi)部去看的話。舉個(gè)例子來說,我所編寫的進(jìn)程查看器July的2.11版本就是用SDK編寫的(這個(gè)版本是開源的),才1000行出頭的代碼就已經(jīng)使得我難以駕馭它們了,以致于后來我不止一次地想重寫之——我想過用MFC,甚至Delphi的VCL。不過,運(yùn)行庫的限制和龐大的EXE體積還是使我放棄了這些想法。
如果說MFC和VCL是生長在深宮名門的大家閨秀,那么WTL就可以算是一位浪跡天涯的絕色歌女。我在2004年的時(shí)候,曾與它不經(jīng)意地邂逅。精良的設(shè)計(jì)、輕巧的EXE、無與倫比的效率——如果不是它的兼容性存在問題的話(如果不修改的話,WTL 7.1連它自己附帶的某幾個(gè)sample都無法通過編譯),我?guī)缀蹙鸵莸乖谒氖袢瓜铝恕?/p>
于是我繼續(xù)迷茫,這種迷茫一直持續(xù)到了2005年我畢業(yè)之后。2005年8月的時(shí)候,為了研究不借助MFC調(diào)用ActiveX控件的技術(shù),我接觸了WTL的發(fā)端——為開發(fā)COM組件而設(shè)計(jì)的ATL。時(shí)至今日我似乎已經(jīng)無法回憶起當(dāng)時(shí)的景況,只記得一個(gè)月之后,用ATL重寫的July v2.20就誕生了。
比起大家閨秀和絕色歌女,ATL則更像是一位溫柔賢惠的樸實(shí)女子。
對癥下藥
說歸說,ATL終究不是萬靈之藥。它是否適合你,且看你是否已經(jīng)存在以下病癥(當(dāng)然,我也為你列出了其它可選藥物):
- 看重程序獨(dú)立性,不喜歡程序運(yùn)行庫。顯然,.net和Visual Basic都不適合你。除ATL外,你還可以選擇VCL、MFC(靜態(tài)鏈接),當(dāng)然還有WTL。
- 看重程序效率。Visual Basic絕對不適合你。由于VCL與MFC內(nèi)部會為窗口控件維護(hù)對象鏈,所以可能也不適合你。在這一方面,ATL和WTL會是不錯(cuò)的選擇。
- 看重EXE的大小。沒的說,VCL和靜態(tài)鏈接的MFC不能列入你的選擇,ATL和WTL仍是最佳選擇。當(dāng)然,如果你不計(jì)較Windows自己捆綁的MFC運(yùn)行庫的話,MFC動態(tài)鏈接也可以。
- 你不得不在沒有MFC的Windows環(huán)境下編寫代碼。有這樣的環(huán)境嗎?也許你要問。是的,Smartphone 2003正是這樣一個(gè)環(huán)境。ATL是你最佳的選擇,當(dāng)然你還可以選擇.net Compact Framework。
此外,你需要做好準(zhǔn)備迎接以下這些使用了ATL以后可能帶來的并發(fā)癥:
- 向?qū)еС州^少。可以說,VC的IDE就是完全為MFC程序設(shè)計(jì)準(zhǔn)備的。它為ATL的支持甚少,似乎只有幾個(gè)窗口消息處理器可以用。所以,有很多的消息映射可能需要你自己手工完成。
- 技術(shù)支持有限。畢竟ATL是為COM組件開發(fā)準(zhǔn)備的,所以關(guān)于用ATL進(jìn)行GUI開發(fā)的資料非常少,除了MSDN上的說明和網(wǎng)上寥寥的幾篇文章之外,似乎就很難找到了。
最后,我為你列出ATL較之WTL更優(yōu)秀的幾點(diǎn):
- 代碼兼容性強(qiáng)。比如VC6.0寫出的代碼在大多數(shù)情況下(我暫未遇到少數(shù)情況)都可以不經(jīng)修改地在VS2003下編譯運(yùn)行。
- 消息分流簡單。我是前說過,VC對ATL的向?qū)еС质呛苡邢薜摹_@樣一來,WTL豐富的消息分流反而成了累贅。如果你用WTL寫過程序,相信你會有相同的感覺——手工編寫那批多種多樣消息處理函數(shù)并不是一件輕松的事情。
當(dāng)然,我本人對WTL并沒有偏見,但WTL的不為官方所支持也是它自身不爭的一個(gè)事實(shí)。相信還有很多人對WTL的官方化望眼欲穿,然而他們還是遲遲不能如愿。如果WTL真有那么一天(我也認(rèn)為肯定會有那么一天),關(guān)于代碼兼容性、向?qū)еС帧⒓夹g(shù)支持的這些問題都將不會是問題。
關(guān)于本系列連載
《ATL的GUI程序設(shè)計(jì)》這一系列的文章是李馬為ATL/WTL之間的矛盾而做出的一個(gè)折中,也是李馬在2006年為大家獻(xiàn)上的一份禮物,希望大家能夠喜歡,也希望它們能夠成為大家邁入WTL之門的引領(lǐng)者。
閱讀本系列文章有兩個(gè)先決條件:第一,你需要了解C++的模板技術(shù),因?yàn)锳TL的技術(shù)基礎(chǔ)就是建構(gòu)于模板之上的;第二,你需要了解Win32 SDK程序設(shè)計(jì),這方面的經(jīng)典教材是Charles Petzold的《Programming Windows》(中譯《Windows程序設(shè)計(jì)》),有關(guān)這方面的基礎(chǔ)知識我在本系列文章中不再進(jìn)行任何解釋。
本系列文章將會介紹如何使用ATL進(jìn)行Win32的GUI程序設(shè)計(jì)方法,包括ATL的GUI基礎(chǔ)使用方法、高級主題以及對ATL的擴(kuò)展。此外,本系列文章還會對ATL/WTL的某些關(guān)鍵實(shí)現(xiàn)技術(shù)進(jìn)行解說,這些內(nèi)容的理解與否并不影響使用ATL進(jìn)行GUI程序設(shè)計(jì),你可以根據(jù)個(gè)人情況來選擇閱讀。
本系列文章中所有附帶的源代碼都是在Visual C++ 6.0 sp4和Visual Studio 2003.net上編譯通過的,但主要環(huán)境仍然基于VC6.0之上,VS2003則只供驗(yàn)證之用。
就這樣了!我謹(jǐn)用一句呼應(yīng)開頭的話來結(jié)束這段稍嫌冗長的開場白:
——也許,認(rèn)識ATL之后,以前的“也許”將不再是“也許”……
轉(zhuǎn)載于:https://www.cnblogs.com/lgh1992314/p/6616358.html
總結(jié)
以上是生活随笔為你收集整理的ATL的GUI程序设计(前言)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 40平米的客厅用多大的空调好?
- 下一篇: 衡水滏阳康居公租房怎么收费?