VC编程心得两则

Author: 白洁 Date: 2001年 32期

#1    一、如何动态建立控件
  ?牐犑紫榷ㄒ宥丶腎D。本程序基于对话框,定义了4个要动态建立的按钮控件,所以定义了4个ID号,只要把它们加入到主对话框类的头文件即可。由于动态建立的控件往往是大量同类的建立且处理函数很相似,所以在定义其ID号时最好连续;当不能连续时,可用一数组连续存储这些ID号,以后在消息处理函数中可使用这个数组间接连续使用这些ID号。
  ?牐?#define IDC_MYBUTTON0 1050
  ?牐?#define IDC_MYBUTTON1 1051
  ?牐?#define IDC_MYBUTTON2 1052
  ?牐?#define IDC_MYBUTTON3 1053
  ?牐犜谥鞫曰翱蚶嘀卸ㄒ宄稍北淞课赶蚨?立控件的指针,并应在构造函数中赋空值。本程序定义了一个指针数组,并在类的构造函数中为它们赋空值。
  ?牐燙Button* m_pButton[4];?牔?
  ?牐爁or(int i;i<4;i++)??
  ?牐爉_pButton[i]=NULL;??
  ?牐犜谛枰?立控件的地方,为指向动态建立控件的指针分配空间,然后再调用Create()函数建立其风格、大小和位置。本程序中为便于控件的建立和删除,为每个控件定义了一个静态按钮(ID号连续)。当动态按钮没建立时,其相应的静态按钮标题为m_strCreate数组相应的字符串值。当按下次按钮时在对话框的相应位置动态的建立一个按钮,同时为4个静态按钮共同定义了一个单击消息处理函数OnProcession()代码如下:
  ?牐爒oid CDcDlg::OnProcession()??
  ?牐爗
  ?牐燱ORD wParam=GetCurrentMessage()->wParam;??
  ?牐?//得到当前处理消息的wParam参数(该参数保存的是单击按钮的ID值),用来分析哪个静态按钮被按下了
  ?牐爄f(m_pButton[wParam-IDC_BUTTON0]==NULL)??
  ?牐?//动态按钮是否建立
  ?牐爗
  ?牐?//动态建立按钮
  ?牐爉_pButton[wParam-IDC_BUTTON0]=new CButton;??
  ?牐?//为按钮指针分配空间
  ?牐爏tr.Format(“button% d”,wParam-IDC_BUTTON0);?牔?
  ?牐?//形成动态按钮的标题
  ?牐爉_pButton[wParam-IDC_BUTTON0]->Create(str,WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
  ?牐燫ect(20+90*(wParam-IDC_BUTTON0),100,100+90*(wParam-IDC_BUTTON0),140),?牏?
  ?牐爐his,IDC_MYBUTTON1+wParam-IDC_BUTTON0);?牔?
  ?牐燝etDlgItem(wParam)->SetWindowText(m_strDeleteTitle[wParam-IDC_BUTTON0]);?牐牔?
  ?牐?//改变相应静态按钮的标题
  ?牐爙
  ?牐爀lse
  ?牐? {
  ?牐?//删除动态建立的按钮
  ?牐燿elete m_pButton[wParam-IDC_BUTTON0];?牔?
  ?牐?//释放指向该动态按钮指针所指向的空间
  ?牐爉_pButton[wParam-IDC_BUTTON0]=NULL;??
  ?牐燝etDlgItem(wParam)->SetWindowText(m_strCreateTitle[wParam-IDC_BUTTON0]);?牐牔?
  ?牐?//改变相应静态按钮的标题
  ?牐爙
  ?牐爙
  #1    二、如何为动态建立的控件映射消息处理函数
  ?牐犛捎谑嵌?立,所以不能用Wizard来建立消息映射,只能手动建立消息映射。首先,在头文件定义消息处理函数。本程序为这4个动态建立的按钮定义了一个消息处理函数handler(),在主对话框类的头文件里定义如下:
  ?牐燼fx_msg void OnHandler();?煟牔?
  ?牐犎缓笤谠次募锝?立消息映射。在主对话框源文件里定义如下:
  ?牐燘egin_Message_Map(CDcDlg,CDialog)??
  ?牐牎?
  ?牐?//以下就是为动态建立的按钮建立的消息映射函数
  ?牐燨N_BN_CLICKED(IDC_MYBUTTON0,OnHandler)??
  ?牐燨N_BN_CLICKED(IDC_MYBUTTON1,OnHandler)??
  ?牐燨N_BN_CLICKED(IDC_MYBUTTON2,OnHandler)??
  ?牐燨N_BN_CLICKED(IDC_MYBUTTON3,OnHandler)??
  ?牐燛ND_MESSAGE_MAP()
  ?牐犠詈笤谠次募锾砑酉⒋?理函数。本例程在主对话框的源文件里的消息处理函数如下??
  ?牐爒oid CDcDlg::OnHandler()
  ?牐爗
  ?牐?//本消息处理函数是用一个对话框表明不同按钮被按下
  ?牐燙String str;??
  ?牐爏tr.Format(“button%d is pressed”,GetCurrentMessage()->wParam-IDC_MYBUTTON0);?牔?
  ?牐燤essageBox(str,“message”,MB_OK);?牔?
  ?牐爙
  ?牐犠⒁猓河捎诙?立的控件指针在程序运行过程中可能没被全部释放,为了防止内存泄漏所以应虚构Destroy(),以释放空间。代码如下:
  ?牐爒oid CDcDlg::OnDestroy()?煟?
  ?牐爗
  ?牐燙Dialog::OnDestroy?煟牔?
  ?牐爁or (int i=0;i<4;i++)??
  ?牐爄f(m_pButton!=NULL)??
  ?牐燿elete m_pButton[i];?牔?
  ?牐爙
  ?牐犚陨洗朐赪indows 98、VC++ 6.0环境下调试通过。