首先声明并创建,

1
2
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括起的区间内,如:

1
2
3
4
5
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不能正常工作,如:

1
2
3
4
5
6
7
8
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区间内添加函数定义,如:

1
2
3
4
5
protected:
//{{AFX_MSG(CTextEditorView)
afx_msg void OnIconbut0();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
1
2
3
4
5
6
7
8
9
//模仿这种形式,只是把函数定义添加到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()

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

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

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

1
delete p_MyBut[0];