【轉載】MFC動態建立控制項及其訊息響應函數

來源:互聯網
上載者:User

標籤:

原文:http://blog.sina.com.cn/s/blog_4a08244901014ok1.html

 

這幾天專門調研了一下MFC中如何動態建立控制項及其訊息響應函數。

參考文章如下:

(1)http://topic.csdn.net/u/20101204/13/5f1b1e70-2f1c-4205-ba10-41616d16f07e.html

(2)http://www.cppblog.com/deercoder/articles/107132.html

這兩篇文章是比較經典的,能夠回答我的問題。但是如何動態建立訊息響應函數呢?這需要利用另外一個命令:

ON_COMMAND_RANGE

參考如下文章:http://topic.csdn.net/t/20020728/22/906766.html

 

注意:ON_COMMAND_RANGE映射了一組控制項ID與其相應的訊息響應函數,因為要區分是哪個控制項ID的訊息響應函數,所以其訊息響應函數需要加上參數:UINT   nID  

下面我自己建立了一個MFC工程,開始測試上面文章中的用法。經過反覆比較,發現還有一個細節需要注意:

需要在String Table中加入初始化時的那個控制項ID,具體操作如下:

開啟資源中的“String Table”,在空白行上雙擊滑鼠,這時會彈出一個ID屬性對話方塊,在其中的ID編輯框中輸入ID,如:IDC_MYBUTTON,在Caption中輸入控制項標題或註解(註:Caption框不可為空,為空白會導致建立失敗),這裡我輸入的是按鈕上要顯示的文字--動態按鈕。
這樣後面的操作就不會出錯了。

具體代碼如下:

(1)建立控制項ID號:在String Table中加入一個新ID:IDC_MYBUTTON。注意和預設的ID的值保持距離

(2)建立控制項對象:
注意不能直接定義CButton對象,如:CButton m_MyBut;這種定義只能用來給靜態控制項定義控制變數,不能用於動態控制項。

對於一個Dialog資源,先關聯一個類,比如CTestDlg

然後在CTestDlg.cpp中位置加入:

ON_COMMAND_RANGE(IDC_MYBUTTON,IDC_MYBUTTON+10,&CTestDlg::OnMYBTN)

如下所示:

BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
 ON_COMMAND_RANGE(IDC_MYBUTTON,IDC_MYBUTTON+10,&CTestDlg::OnMYBTN)
 ON_BN_CLICKED(IDC_BUTTON1, &CTestDlg::OnBnClickedButton1)
 ON_BN_CLICKED(IDC_BUTTON2, &CTestDlg::OnBnClickedButton2)
END_MESSAGE_MAP()
然後添加一個建立控制項的函數:

CButton* CTextEditorView::NewMyButton(int nID,CRect rect,int nStyle)
{
CString m_Caption;
m_Caption.LoadString( nID ); //取按鈕標題
CButton *p_Button = new CButton();
ASSERT_VALID(p_Button);
p_Button->Create( m_Caption, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | nStyle, rect, this, nID ); //建立按鈕
return p_Button;
}

然後使用工具箱建立了一個button(IDC_BUTTON1),使得這個button的訊息響應函數是用來建立三個新按鈕。其訊息響應函數如下:

void CTestDlg::OnBnClickedButton1()
{
 // TODO: 在此添加控制項通知處理常式代碼
if(btn_flag==false) 

{

p_MyBut[0] = NewMyButton( IDC_MYBUTTON, CRect(20,20,50,60), BS_DEFPUSHBUTTON );
 p_MyBut[1] = NewMyButton( IDC_MYBUTTON+1, CRect(70,20,95,50), 0 );
 p_MyBut[2] = NewMyButton( IDC_MYBUTTON+50, CRect(120,20,140,35), 0 ); 
 btn_flag=p_MyBut[0] && p_MyBut[1] && p_MyBut[2]; //btn_flag=true;
}

}

另外又設定了一個button(IDC_BUTTON2),按下這個按鈕就銷毀之前建立的三個新按鈕。

void CTestDlg::OnBnClickedButton2()
{
 if(btn_flag)
 {
  if(p_MyBut[0]) delete p_MyBut[0];
  if(p_MyBut[1]) delete p_MyBut[1];
  if(p_MyBut[2]) delete p_MyBut[2];
  btn_flag=false;
 }
}

設定全域變數:bool btn_flag;用來表示是否按下了button1,建立了三個按鈕

設定全域變數:CButton *p_MyBut[3];用來存放建立的三個按鈕

而這三個按鈕的訊息響應函數如下:注意需要加參數!

void CTestDlg::OnMYBTN(UINT nID)
{
 int index = nID - IDC_MYBUTTON;

 CString strBtn;
 strBtn.Format(_T("BUTTON%d"),index);
  MessageBox(strBtn);
}

========================================================

最後實現的功能就是按Button1產生三個新按鈕,每個按鈕都可以觸發一個messagebox。而按Button2可以銷毀三個新產生的按鈕。

【轉載】MFC動態建立控制項及其訊息響應函數

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.