最近有不少朋友發信到我的郵箱,其中有高手也有菜鳥,也許他們問的問題我還不能一一解答,但是他們的來信的確讓我感受到極大的鼓舞。今天忙裡偷閒,翻譯了一片外國的文章,獻給那些摸索中的菜鳥們。
下面將通過一個最簡單的程序來說明Windows的消息機制。程序主要是使用兩個按鈕控件,它要求用戶輸入兩個數字,當你按下其中一個按鈕的時候,會根據進行相應的計算並輸出結果。例如如果你輸入1和2,然後按下''Plus'' 按鈕,就會輸出結果。
由於大多數情況下,按鈕控件都是在對話框中使用的,所以我們的程序也就從對話框開始。使用程序向導建立一個名為“ButtonDemo”的項目,選擇基於對話框的程序類型。
選擇Workspace中的ResourceVew 屬性頁,在裡面找到名為IDD_BUTTONDEMO_DLG的一項,雙擊打開對話框編輯窗口。可以看到系統已經替我們在窗口中加入了''Ok''和''Cancel''兩個按鈕,我們保留OK按鈕,刪掉Cancel按鈕,並按照圖中所示改變按鈕的放置位置。
通過鼠標的拖放操作往窗體中加入兩個按鈕(因為在本程序中需要''Plus'' and ''Minus''兩個按鈕),在按鈕上面右擊鼠標,選擇properties進入控件的屬性設置。MFC會為每一個新加入到窗口中的按鈕分配一個唯一的ID值,相應的ID值會記錄在一個名為"Resource.h"文件中。為了表達清楚各個控件的功能,我們將按鈕的ID值改為ID_BUTTON_ADD,並修改caption的內容為“Plus”。
下一步我們要加入Edit Box控件以便在程序中輸入和輸出數據。加入Edit Box控件的方法跟加入Button控件的方法是一樣的,就是先把控件拉進來,調整它在窗口中的位置,然後修改它們的ID值。如下圖所示,不過記得在最後一個Edit Box控件的屬性設置中要把 ''disable''的屬性也勾上,因為計算的結果不需要由用戶輸入。我們還在右邊的兩個Edit Box之間加入一個Static 控件用來顯示等式中的等號,只需要把控件拖進來改變它的caption就可以了。
調整好各個控件的位置之後,我們要把控件與程序代碼聯系起來。這一步可以通過類向導(class wizard)來實現,調用類向導的方法有兩種,一種是通過菜單項 View->Class Wizard調用,又或者通過快捷鍵Control + W 。選擇Member Variables 屬性頁,加入以下三個變量: m_nX, m_nY和m_nAnswer。記住三個變量的類型都是整數int類型,它們用來存放Edit Box中的整數值。
然後再選擇Message Maps 屬性頁,為ID值為ID ID_BUTTON_ADD和 ID_BUTTON_SUBTRACT 的兩個按鈕控件添加BN_CLICK消息,系統會針對添加的消息在代碼中加入相應的消息函數,這樣當用戶點擊按鈕的時候就會調用這個函數。在本例中生成的兩個消息函數分別名為 OnButtonAdd 和 OnButtonSubtract.。完成了上面的工作之後,記住最後要按OK按鈕退出類向導。
現在我們可以著手代碼的編寫了。代碼的意思相信不難理解,但是關於UpdateData函數卻有必要在這裡講解一下。在這裡UpdateData函數起到控制Edit Box 顯示內容的作用。當調用UpdataData (TRUE)的時候,程序會對控件對應的變量值進行刷新,也就是說會把控件中的輸入值賦給對應的變量。而調用UpdataData (FALSE)的時候,程序則會把相應變量的值顯示在對應的控件上面。
void CButtonDemoDlg::OnButtonAdd()
{
UpdateData (TRUE);
m_nAnswer = m_nX + m_nY;
UpdateData (FALSE);
}
void CButtonDemoDlg::OnButtonSubtract()
{
UpdateData (TRUE);
m_nAnswer = m_nX - m_nY;
UpdateData (FALSE);
}
按鈕的使用就是如此簡單。
既然上面講到添加消息函數,這裡就順便加插些內容。在默認的情況下,通過類向導只能添加一些常用的消息函數。也就是說在類向導的消息列表中並沒有列舉出所有的消息。此時可以通過下面的方法往列表中加入這些沒有顯示的消息。選擇“Workspace”中的“ClassViewq”頁,在對應的類中右擊,選擇Add Windows Message Handler…,這時你就會看到其它一些原來列表中沒有的Windows消息了,你可以選擇其一或者全部加入到消息列表中,這樣就可以使用類向導來添加相應的消息函數了。如果在以後的練習中遇到類向導中沒有的Windows消息,記住這個方法哦。
(全文完)