15.14 如何在运行时动态创建控件
首先介绍一种勉强的代替方法:实现在编写程序时在资源视图中创建好需要的控件,在程序初始化时设置这些控件为隐藏的,在需要显示这些控件时再设置其为可见的。这种方法适用于一些需求不是太高的场合,对于要求比较高的场合(例如动态创建的对象比较多),就应该避免使用该方法。
动态创建控件可以使用MFC中CWnd类中定义的虚函数Create实现,也就是说,在多数情况下CWnd子类所创建的对象均可以通过调用Create函数来实现。下面的例子演示了如何动态地创建一个按钮控件,并且对其进行事件处理,进行消息响应,步骤如下:
(1)创建一个基于对话框的、使用MFC库的Windows应用程序工程DyCtl。
(2)在主对话框类的头文件中声明一个CButton类指针,代码如下:
class CDyCtlDlg : public CDialog { //省略部分不相关代码 private: CButton *m_pBtn; }; |
(3)重载CDyCtlDlg::OnCancel函数,修改CDyCtlDlg构造函数和OnCancel函数,代码如下:
CDyCtlDlg:: CDyCtlDlg (CWnd* pParent /*=NULL*/) : CDialog(CMFCDlg::IDD, pParent) { //{{AFX_DATA_INIT(CMFCDlg) //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_pBtn=NULL; }
void CDyCtlDlg:: OnCancel() { if(m_pBtn) { m_pBtn->DestroyWindow(); delete m_pBtn; m_pBtn=0; } }
|
(4)在主对话框上创建两个按钮控件,分别用于动态创建按钮和销毁该动态创建的按钮,实现其单击事件响应函数如下:
void CDyCtlDlg::OnCreateButton() { if(!m_pBtn) { m_pBtn=new CButton(); m_pBtn ->Create (_T ("Button Title ") , WS_CHILD|BS_PUSHBUTTON|WS_VISIBLE, CRect ( 0, 0, 100 , 24) , this , 16000 ); } } void CDyCtlDlg::OnDestroyButton() { // TODO: Add your control notification handler code here if(m_pBtn) { m_pBtn->DestroyWindow(); delete m_pBtn; m_pBtn=0; } }
|
注意:Create函数的最后一个参数为代表本按钮的ID。
(5)在CDyCtlDlg类中添加创建按钮的单击消息响应函数以及消息映射宏,代码如下:
//.h文件 afx_msg void OnMyButton(); //.cpp文件 BEGIN_MESSAGE_MAP(CMFCDlg, CDialog) //{{AFX_MSG_MAP(CMFCDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(16000, OnMyButton) //这里 //}}AFX_MSG_MAP END_MESSAGE_MAP() void CDyCtlDlg:: OnMyButton () { // TODO: Add your control notification handler code here AfxMessageBox("动态创建的按钮!"); } |
(6)按Ctrl+F5键编译并运行程序。【责任编辑:
夏书 TEL:(010)68476606】