ATL的GUI程式設計 2

2021-04-16 01:00:04 字數 2418 閱讀 6446

第二章 乙個最簡單視窗程式的轉型

我知道,可能會有很多朋友對上一章的「hello, world!」atl版不以為然,因為它並不能算是什麼atl程式——畢竟它只不過是有了個ccommodule而已。不過不管怎樣我還是要說,它幾乎仍然擁有了乙個atl gui程式的所有組成部分:入口、初始化、程式體、解除安裝……

「等等!」也許你會突然打斷我,「——還有註冊視窗類、訊息迴圈呢?」

當然,對於乙個完整的gui程式來講,這也是必要的。

貌似廢話

不清楚你是否已經為本章的內容做好了準備,因為下面我們就要動真格的了。不過考慮到本書的讀者群中可能會存在著相當一部分了解mfc卻對win32 gui的基本原理和流程不甚熟悉的朋友,所以李馬特別為你們準備了這一節的內容。sdk的粉絲們可以跳過這一節,如果你們覺得李馬講的有些拖沓冗長的話。

那麼,我還是先以乙個標準的win32 sdk程式開始:

//

// atl的gui程式設計配套源**

// 第二章 乙個最簡單視窗程式的轉型

// 工程名稱:hellosdk

不知道你是否會覺得這段**有些冗長?事實上,這個程式已經體現了win32 gui程式執行的所有流程(請注意,我並不會對這些**進行詳細的解釋,因為我已經假設你已經了解了這些**具體行為的必要細節。如果不是這樣的話,請參考相關的書籍或者msdn):

建立視窗的部分。在通常的sdk**裡,這些**被封裝在乙個名為initinstance的函式中。這段**所做的工作一般是建立視窗並將其顯示出來。

訊息迴圈。windows是乙個基於訊息機制的作業系統,各個視窗之間的通訊也主要是靠windows訊息來完成的。而程式中的訊息迴圈也就是將本程式ui執行緒中的訊息佇列中提取各種訊息,進行處理(如果有必要的話)之後分發給各個訊息的屬主視窗(或者說是目標視窗)。

在這裡需要指出的是,hellowndproc是我們自己定義的乙個函式,我們需要用它來控制我們對特定視窗訊息的特定響應。我們只需要在註冊視窗類之前,將這個函式的位址(也就是函式名)賦值給wndclass::lpfnwndproc成員就可以了。這個函式我們自己不需要進行呼叫,它的呼叫是當我們的視窗收到視窗訊息後,由windows完成的。在這個**函式中,我們的處理是這樣的:

這段**貌似冗長,但實際上還是很有條理的,你可以根據它以及我以上的解說來對照這個程式的atl版本。

atl等同品

在寫作這本書的時候,我總是希望我每次都能夠能使用讓你不太陌生的**來循序漸進地引導你。考慮再三,對於「hello, atl!」的這個程式,我決定先把它的winmain展現給你:

int winapi _twinmain( hinstance hinstance, hinstance hprevinstance, lptstr lpcmdline, int nshowcmd )

_module.term();

return msg.wparam;

}

ok,上一章介紹過的_module又出現在你的眼前了——不過還是沒有什麼特別的變化,仍然是那熟悉的init和term。而且,正如「山哟還是那座山」一樣,訊息迴圈喲也仍然是那個訊息迴圈。當然,你肯定也發現了那寥寥的變化:chelloatlwnd是什麼?在我將它的**展現給你之前,你可能會做出這樣的猜想:

好,打住,這就夠了。讓我們來撩開chelloatlwnd那貌似神秘的面紗吧,趕緊著。

猜想,還是猜想!

請允許我在本章中不為你解釋這個類的任何具體細節,取而代之的是繼續的猜想。因為,這個類中需要解釋的東西太多了,以至於我必須為它單獨開闢一章。

當然,除了這些猜想之外,你可能還會同時存在以下疑問:

補敘ccommodule

由於這本書主要針對的是atl 3.0/visual c++ 6.0,所以我疏忽了對ccommodule的研究。在此感謝老李老刀兄提出的一點,就是ccommodule在atl 7.0中已經不建議使用了。於是我將msdn中的相關章節摘抄下來,權作借花獻佛之用。

ccommodule 替換類

atl 的早期版本使用 ccommodule。在 atl 7.0 中,ccommodule 功能被若干個類所取代:

分布 ccommodule 功能的原因

由於以下原因,ccommodule 的功能分布到了幾個新類中:

不過,出於**的相容性以及wtl的內容考慮,本系列後續文章仍然將使用atl 3.0中的ccommodule。

ATL的GUI程式設計 2

第二章 乙個最簡單視窗程式的轉型 我知道,可能會有很多朋友對上一章的 hello,world atl版不以為然,因為它並不能算是什麼atl程式 畢竟它只不過是有了個ccommodule而已。不過不管怎樣我還是要說,它幾乎仍然擁有了乙個atl gui程式的所有組成部分 入口 初始化 程式體 解除安裝 ...

GUI程式設計

兩種形式 1.例項化 jframe 2.繼承jframe class myframe extends jframe myhandler myhandler new myhandler 實現actionlistener類處理事件 jb.addactionlistener myhandler this....

Shell的GUI程式設計

小部件 描述calendar 提供乙個可以在其中選擇日期的日曆 checklist 顯示多個專案,這些專案均可以被開啟或關閉 form 允許建立乙個可以填寫標籤和文字欄位的表單 fselect 提供乙個檔案選擇視窗以瀏覽檔案 gauge 顯示乙個說明完成百分比的儀表 infobox 顯示資訊而不等待...