MFC中動態創建多個按鈕並實現其消息響應

在MFC中,一般通過控件欄直接向對話框中添加按鈕控件,並雙擊按鈕添加該按鈕控件的消息響應函數。但是經常我們需要根據程序輸入或運行時信息在界面上動態生成一個或多個按鈕,並分別添加消息響應,實現這一目標包括如下幾步:

1.在類中聲明按鈕變量指針CButton* btn。

2.在類中聲明並定義按鈕控件的ID, buttonID=10000。

3.在類的OnInitDialog()函數中動態創建按鈕。

  1. btn = new CButton[n];  
  2. DWORD dwStyle = WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON;  
  3. for(int i = 0; i < DBUtil::OrdnanceSiteNum; i++){  
  4.     btn[i].Create(str, dwStyle,CRect(x1,y1,x2,y2),this,buttonID+i);   
  5.     btn[i].SetFont(GetParent()->GetFont());  
  6. }  

上述代碼中,n表示運行時獲得的按鈕控件的個數,一共創建n個按鈕控件,且控件ID在buttonID~buttonID+n-1之間。

4.創建按鈕消息響應。

(1)在對話框類的定義文件(.h文件)中聲明消息響應函數OnButtonClick。

  1. // Implementation  
  2. protected:  
  3.     // Generated message map functions  
  4.     //{{AFX_MSG(COrdnanceLocus)  
  5.     virtual BOOL OnInitDialog();  
  6.     //}}AFX_MSG  
  7.     afx_msg void OnButtonClick(UINT uID);  
  8.     DECLARE_MESSAGE_MAP()  
注意,OnButtonClick函數必須聲明在對話框類自動生成的控件響應函數聲明列表的後面(上述代碼中OnInitDialog函數就是自動生成的函數聲明),即程序員添加的動態按鈕消息響應函數聲明應該在在//}}AFX_MSG和DECLARE_MESSAGE_MAP()兩行之間,以免系統將其當做自動生成的消息響應函數。OnButtonClick函數的參數nID代表響應函數對應按鈕控件的ID號。

(2)在對話框類的函數實現文件(.cpp文件)中定義消息映射ON_COMMAND_RANGE。

在函數實現文件中的消息映射部分(BEGIN_MESSAGE_MAP與END_MESSAGE_MAP之間)定義按鈕控件與其消息響應函數之間的映射關係。

  1. ON_COMMAND_RANGE(buttonID,buttonID+n-1,OnButtonClick)  

對於所有動態創建的n個按鈕(ID號在buttonID~buttonID+n-1之間),定義其消息映射函數爲OnButtonClick函數,根據其輸入ID分辨具體響應那個按鈕。

注意:若是單個按鈕,則消息映射的定義方式爲ON_BN_CLICKED(IDC_BUTTON_ID, OnButtonFunc)

(3)實現消息響應函數OnButtonClick。

在對話框類的函數實現文件(.cpp文件)中給出具體的按鈕消息響應。

發佈了58 篇原創文章 · 獲贊 51 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章