前言
在上一篇中,我們給最基本的表單添加了一個按鈕,有了按鈕後,當然就需要發揮按鈕的作用,大家都知道按鈕最基本的功能就是通過使用者的點擊事件與電腦產生互動。如果你做過.net 的winform,wpf或者java的gui等開發,相信這樣的操作你做過無數遍了,而且這樣的操作也是非常方便的,藉助vs這樣強大的ide,很容易建立表單,添加按鈕,並給按鈕添加點擊事件,最後監聽該事件,當該事件觸發時候,回調事件處理函數,執行相應的操作。在現代的表單應用程式開發中,你經常能看到event(事件)這樣的東西,而看不到訊息的處理,因為物件導向的語言對訊息處理進行了封裝,使得更方便的開發。那麼go語言是否也能這樣呢?答案是肯定的。但是,今天我們不做這樣的事情,我們還是使用傳統的處理訊息的方式,來進行點擊訊息的處理,至於封裝成類似c#中winform這樣的,這個以後再玩。扯了那麼一堆,無非就是想說,其實雖然各種新技術,新語言的不斷出現,其實歸根到底其本質還是沒什麼大的變化,至少目前是這樣,無非就是對不方便的操作進行封裝或者通過各種演算法和資料機構得到更優的解決方案。那麼就開始今天的按鈕點擊訊息處理吧。
一、處理子表單訊息
當你給一個表單添加了一個按鈕後,按鈕也就成了表單的一個子表單,當我們點擊按鈕的時候,按鈕就產生了相應的訊息,但是,我們之前就知道,父表單取出訊息佇列中的各種訊息,然後把訊息傳到訊息處理函數中處理,那麼子表單的訊息是否也能拿到呢?事實上是可以的。當按鈕被點擊後,子表單就向父表單發送了一個WM_COMMAND訊息,所以我們需要在訊息處理函數中添加WM_COMMAND類型訊息的分支,最終的訊息處理函數如下:
注意看,WM_COMMAND分支中,有一個if條件,它比較的是訊息處理函數中參數wParam的低位與指定子表單的id號是否相等。其實,wParam的低位就是產生訊息的子表單的id號,所以通過它便可以知道具體是那個子表單產生的訊息了。這裡,產生訊息後,彈出一個第一篇中就講過的彈出訊息視窗。
二、關於wParam參數與lParam參數的具體含義
1.LOWORD(wParam) ==> 子表單ID
2.HIWORD(wParam) ==> 通知碼
3.lParam ==> 子表單控制代碼
三、添加按鈕
那麼這個子表單id為什麼和1比較?請看WM_CREATE中,addButton函數的最後一個參數就是1,因為我們建立了一個id為1的button。除了通過子表單id來判斷是哪個子表單產生的訊息外,我們也可以通過視窗控制代碼進行判斷,如WM_COMMAND中注釋所示。addButton函數如下:
上一篇已經講過如何建立子表單,所以這裡就不講了,關鍵是最後一個id參數,是本篇新加的子表單id參數。
最後效果:
今天就到此,下次再繼續~