MFC动态按钮的创建及其消息响应 和 自定义消息
原文鏈接:?http://www.cnblogs.com/gaohongchen01/p/4046525.html
動態(tài)按鈕(多個)的創(chuàng)建:
1、在類中聲明并定義按鈕控件的ID
#define IDC_D_BTN 100002、在類的OnInitDialog()函數(shù)中動態(tài)創(chuàng)建按鈕(建立按鈕對象時最好建立對象的指針)
3、手動釋放對象指針
下面是動態(tài)生成多個按鈕的例子:
CButton* btn = new CButton[5]; DWORD dwStyle = WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON; for(int i = 0; i < 5; i++) { btn[i].Create(_T("動態(tài)按鈕"), dwStyle,CRect(20+80*i,20,80+80*i,60),this,IDC_D_BTN+i); }注:Create()的第一個參數(shù)為按鈕的標(biāo)題,可直接給出(如上所示),也可在String Table中先定義字符串,再利用控件的LoadString()函數(shù)將字符串讀取進(jìn)來
程序運(yùn)行效果如下所示:
?
動態(tài)按鈕(多個)的消息響應(yīng):
一個MFC的消息響應(yīng)函數(shù)在程序中有三處相關(guān)信息:函數(shù)原型、函數(shù)實現(xiàn)以及用來關(guān)聯(lián)消息和消息響應(yīng)函數(shù)的宏。頭文件中在兩個AFX_MSG注釋宏之間是消息響應(yīng)函數(shù)原型的聲明。源文件中有兩處:一處是在AFX_MSG_MAP注釋宏之間的消息映射宏,用來關(guān)聯(lián)消息和消息響應(yīng)函數(shù)的宏;另一處是源文件中的消息響應(yīng)函數(shù)的實現(xiàn)代碼。
下面為動態(tài)生成的多個按鈕的消息響應(yīng)的建立步驟:
1、在對話框類的定義文件(.h文件)中聲明消息響應(yīng)函數(shù)OnButtonClick
afx_msg void OnButtonClick(UINT uID);注:OnButtonClick函數(shù)的參數(shù)nID代表響應(yīng)函數(shù)對應(yīng)按鈕控件的ID號,單個按鈕可不設(shè)參數(shù)
2、在對話框類的函數(shù)實現(xiàn)文件(.cpp文件)中定義消息映射ON_COMMAND_RANGE???? (多個按鈕)
在函數(shù)實現(xiàn)文件中的消息映射部分(BEGIN_MESSAGE_MAP與END_MESSAGE_MAP之間)定義按鈕控件與其消息響應(yīng)函數(shù)之間的映射關(guān)系。
ON_COMMAND_RANGE(IDC_D_BTN,IDC_D_BTN+5-1,OnButtonClick)對于所有動態(tài)創(chuàng)建的5個按鈕(ID號在IDC_D_BTN ~ IDC_D_BTN+5-1之間),定義其消息映射函數(shù)為OnButtonClick函數(shù),根據(jù)其輸入ID分辨具體響應(yīng)那個按鈕。
若是單個按鈕,則消息映射為ON_BN_CLICKED
ON_BN_CLICKED(IDC_BUTTON_ID, OnButtonFunc)3、實現(xiàn)消息響應(yīng)函數(shù)OnButtonClick
在對話框類的函數(shù)實現(xiàn)文件(.cpp文件)中給出具體的按鈕消息響應(yīng)
?
自定義消息:
消息映射、循環(huán)機(jī)制是Windows程序運(yùn)行的基本方式。VC++ MFC 中有許多現(xiàn)成的消息句柄,可當(dāng)我們需要完成其它的任務(wù),需要自定義消息,就遇到了一些困難。在MFC ClassWizard中不允許添加用戶自定義消息,所以我們必須在程序中添加相應(yīng)代碼,以便可以象處理其它消息一樣處理自定義消息。
Windows消息用"WM_"這個前綴,自定義消息一般用"UM_這個前綴"。
1、首先在頭文件或CPP文件中定義一個消息(推薦用戶自定義消息至少是WM_USER+100,因為很多新控件也要使用WM_USER消息)
#define WM_MY_MESSAGE (WM_USER+100)2、在消息映射宏里面添加函數(shù)聲明
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);3、在函數(shù)實現(xiàn)文件(.cpp文件)中定義消息映射ON_MESSAGE,關(guān)聯(lián)消息和消息響應(yīng)函數(shù)
ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)4、實現(xiàn)消息處理函數(shù),該函數(shù)使用WPRAM和LPARAM參數(shù)并返回LPESULT
LPESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam) { // TODO: 處理用戶自定義消息 ... return 0; }5、發(fā)送消息
::PostMessage(GetSafeHwnd(), WM_MY_MESSAGE, 0, 0);其中GetSafeHwnd()得到了一個當(dāng)前窗口的句柄,此消息將發(fā)給當(dāng)前窗口;如果想發(fā)送消息給其它窗口,只需改變這個句柄,前提是目的窗口也實現(xiàn)了此消息的處理函數(shù)。
注:
如果用戶需要一個定義整個系統(tǒng)唯一的消息,可以調(diào)用SDK函數(shù)RegisterWindowMessage定義消息:
static UINT WM_MY_MESSAGE=RegisterWindowMessage("User");并使用ON_REGISTERED_MESSAGE宏指令取代ON_MESSAGE宏指令,其余步驟同上。
總結(jié)
以上是生活随笔為你收集整理的MFC动态按钮的创建及其消息响应 和 自定义消息的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GCC笔记 命令行分析
- 下一篇: mxf高速发展和数字电影母版制作技术