VC编程心得两则
?牐犑紫榷ㄒ宥丶腎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环境下调试通过。