在 MFC 中动态创建控件以及消息响应
此内容年代久远,谨慎参考
首先声明并创建
cppCButton* p_MyBut;
p_MyBut->Create("动态按钮",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,CRect(20,10,80,40),this,IDC_MYBUTTON);
动态控件的响应函数不能用ClassWizard添加,只能手动添加,仍以上面的按钮为例,制作按钮的单击响应函数
首先在MESSAGE_MAP中添加响应函数
MESSAGE_MAP表中定义了消息响应函数,其格式为:消息名(ID,函数名)
当用ClassWizard添加函数时,会自动添加在AFX_MSG_MAP括起的区间内,如
cppBEGIN_MESSAGE_MAP(CTextEditorView, CFormView)
//{{AFX_MSG_MAP(CTextEditorView)
ON_BN_CLICKED(IDC_ICONBUT0, OnIconbut0)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
但是手工添加时不要添加到AFX_MSG_MAP区间内,以防ClassWizard不能正常工作,如
cppBEGIN_MESSAGE_MAP(CTextEditorView, CFormView)
//{{AFX_MSG_MAP(CTextEditorView)
ON_BN_CLICKED(IDC_ICONBUT0, OnIconbut0)
//}}AFX_MSG_MAP
ON_BN_CLICKED(ID_MYBUT1, OnMybut1)
ON_BN_CLICKED(ID_MYBUT2, OnMybut2)
ON_BN_CLICKED(ID_MYBUT3, OnMybut3)
END_MESSAGE_MAP()
其中ON_BN_CLICKED是按钮单击消息
接着在头文件中添加函数定义,用ClassWizard添加函数时,会在头文件的AFX_MSG区间内添加函数定义,如
cppprotected:
//{{AFX_MSG(CTextEditorView)
afx_msg void OnIconbut0();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
模仿这种形式,只是把函数定义添加到AFX_MSG区间外就行了
cppprotected:
//{{AFX_MSG(CTextEditorView)
afx_msg void OnIconbut0();
//}}AFX_MSG
afx_msg void OnMybut1();
afx_msg void OnMybut2();
afx_msg void OnMybut3();
DECLARE_MESSAGE_MAP()
以上是把消息和函数关联起来了,具体在单击按钮后应做的工作在函数中完成
cppvoid CTextEditorView::OnMybut1(){MessageBox("你单击了动态按钮。");}
void CTextEditorView::OnMybut2(){...}
void CTextEditorView::OnMybut3(){...}
由于动态控件对象是由new的,它不会被程序自动释放,所以需手工释放,在控件不再使用时可以删除它
cppdelete p_MyBut[0];