在 MFC 中动态创建控件以及消息响应
在 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];
作者
ragnaroks
发布时间
2014-12-13
创作协议