微信公众号 
图码生活

每天发布有五花八门的文章,各种有趣的知识等,期待您的订阅与参与
电脑报 1992-2001 十年文章全集
电脑报 1992-2001 十年文章全集
包含从 1992 年 - 2001 年间,两万余篇期刊文章,查询最少输入两个字符
随便看看
读取中
读取中
标题VC编程心得两则
栏目软件世界
作者白洁
发布2001年32期
  一、如何动态建立控件
  首先定义动态控件的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]);
  //改变相应静态按钮的标题
  }
  }
  二、如何为动态建立的控件映射消息处理函数
  由于是动态建立,所以不能用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环境下调试通过。