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