在MFC中动态创建控件以及消息响应

首先声明并创建

CButton* 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括起的区间内,如

BEGIN_MESSAGE_MAP(CTextEditorView, CFormView)  
//{{AFX_MSG_MAP(CTextEditorView)  
ON_BN_CLICKED(IDC_ICONBUT0, OnIconbut0)  
//}}AFX_MSG_MAP  
END_MESSAGE_MAP()

但是手工添加时不要添加到AFX_MSG_MAP区间内,以防ClassWizard不能正常工作,如

BEGIN_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区间内添加函数定义,如

protected:
//{{AFX_MSG(CTextEditorView)
afx_msg void OnIconbut0();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()

模仿这种形式,只是把函数定义添加到AFX_MSG区间外就行了

protected:
//{{AFX_MSG(CTextEditorView)
afx_msg void OnIconbut0();
//}}AFX_MSG
afx_msg void OnMybut1();
afx_msg void OnMybut2();
afx_msg void OnMybut3();
DECLARE_MESSAGE_MAP()

以上是把消息和函数关联起来了,具体在单击按钮后应做的工作在函数中完成

void CTextEditorView::OnMybut1(){MessageBox("你单击了动态按钮。");}
void CTextEditorView::OnMybut2(){……}
void CTextEditorView::OnMybut3(){……}

由于动态控件对象是由new的,它不会被程序自动释放,所以需手工释放,在控件不再使用时可以删除它

delete p_MyBut[0];

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!