VC编程心得两则 白洁 2001年 32期 #1 一、如何动态建立控件   首先定义动态控件的ID。本程序基于对话框,定义了4个要动态建立的按钮控件,所以定义了4个ID号,只要把它们加入到主对话框类的头文件即可。由于动态建立的控件往往是大量同类的建立且处理函数很相似,所以在定义其ID号时最好连续;当不能连续时,可用一数组连续存储这些ID号,以后在消息处理函数中可使用这个数组间接连续使用这些ID号。   #define IDC_MYBUTTON0 1050   #define IDC_MYBUTTON1 1051   #define IDC_MYBUTTON2 1052   #define IDC_MYBUTTON3 1053   在主对话框类中定义成员变量为指向动态建立控件的指针,并应在构造函数中赋空值。本程序定义了一个指针数组,并在类的构造函数中为它们赋空值。   CButton* m_pButton[4];   for(int i;i<4;i++)   m_pButton[i]=NULL;   在需要动态建立控件的地方,为指向动态建立控件的指针分配空间,然后再调用Create()函数建立其风格、大小和位置。本程序中为便于控件的建立和删除,为每个控件定义了一个静态按钮(ID号连续)。当动态按钮没建立时,其相应的静态按钮标题为m_strCreate数组相应的字符串值。当按下次按钮时在对话框的相应位置动态的建立一个按钮,同时为4个静态按钮共同定义了一个单击消息处理函数OnProcession()代码如下:   void CDcDlg::OnProcession()   {   WORD wParam=GetCurrentMessage()->wParam;   //得到当前处理消息的wParam参数(该参数保存的是单击按钮的ID值),用来分析哪个静态按钮被按下了   if(m_pButton[wParam-IDC_BUTTON0]==NULL)   //动态按钮是否建立   {   //动态建立按钮   m_pButton[wParam-IDC_BUTTON0]=new CButton;   //为按钮指针分配空间   str.Format(“button% d”,wParam-IDC_BUTTON0);   //形成动态按钮的标题   m_pButton[wParam-IDC_BUTTON0]->Create(str,WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,   Rect(20+90*(wParam-IDC_BUTTON0),100,100+90*(wParam-IDC_BUTTON0),140),   this,IDC_MYBUTTON1+wParam-IDC_BUTTON0);   GetDlgItem(wParam)->SetWindowText(m_strDeleteTitle[wParam-IDC_BUTTON0]);   //改变相应静态按钮的标题   }   else    {   //删除动态建立的按钮   delete m_pButton[wParam-IDC_BUTTON0];   //释放指向该动态按钮指针所指向的空间   m_pButton[wParam-IDC_BUTTON0]=NULL;   GetDlgItem(wParam)->SetWindowText(m_strCreateTitle[wParam-IDC_BUTTON0]);   //改变相应静态按钮的标题   }   }   #1 二、如何为动态建立的控件映射消息处理函数   由于是动态建立,所以不能用Wizard来建立消息映射,只能手动建立消息映射。首先,在头文件定义消息处理函数。本程序为这4个动态建立的按钮定义了一个消息处理函数handler(),在主对话框类的头文件里定义如下:   afx_msg void OnHandler();   然后在源文件里建立消息映射。在主对话框源文件里定义如下:   Begin_Message_Map(CDcDlg,CDialog)   ……   //以下就是为动态建立的按钮建立的消息映射函数   ON_BN_CLICKED(IDC_MYBUTTON0,OnHandler)   ON_BN_CLICKED(IDC_MYBUTTON1,OnHandler)   ON_BN_CLICKED(IDC_MYBUTTON2,OnHandler)   ON_BN_CLICKED(IDC_MYBUTTON3,OnHandler)   END_MESSAGE_MAP()   最后在源文件里添加消息处理函数。本例程在主对话框的源文件里的消息处理函数如下   void CDcDlg::OnHandler()   {   //本消息处理函数是用一个对话框表明不同按钮被按下   CString str;   str.Format(“button%d is pressed”,GetCurrentMessage()->wParam-IDC_MYBUTTON0);   MessageBox(str,“message”,MB_OK);   }   注意:由于动态建立的控件指针在程序运行过程中可能没被全部释放,为了防止内存泄漏所以应虚构Destroy(),以释放空间。代码如下:   void CDcDlg::OnDestroy()   {   CDialog::OnDestroy   for (int i=0;i<4;i++)   if(m_pButton!=NULL)   delete m_pButton[i];   }   以上代码在Windows 98、VC++ 6.0环境下调试通过。