因为程序需要能够根据XML的内容指定的数量、大小、位置等条件动态生成控件,所以程序的所有控件、包括对话框都是动态生成的。
我想请教一下,在这种情况下,如何让程序来响应按钮、下拉框等等控件的事件?

解决方案 »

  1.   

    跟静态的差不多,简单的方法:
    将需要的事件代码按照静态控件生成,手工copy到项目中略加修改即可,比如一个OnButtonXX,它会关联一个BUTTON的ID,这个ID就是你的动态按钮的ID,另外需要注意的就是动态的事件代码声明要放到MFC ClassWizard自动生成的代码码外面,如AFX_MSG括号对
      

  2.   

    和静态差不多...
    给你看个例子(动态创建BUTTON并响应事件):
    1.public: struct CONTROLINFO
    {
    CMyCheckBox m_Check; //Checkbox
    //CButton m_Check;
    CEdit m_Edit;  //Edit
    BOOL bChecked;  //Checkbox 的状态
    CButton m_Button;
    }GroupBtn[10];
    int mCheckNum;
    2.创建与销毁:
    void CDynamicCreateControlDlg::Oncreatebutton() 
    {
    // TODO: Add your control notification handler code here
    int mCheckID;
    CRect mCheck;
    CString strTemp; for (int i=0;i<mCheckNum;i++)
    {
    GroupBtn[i].m_Button.DestroyWindow();
    GroupBtn[i].m_Button.Detach();
    }
    for ( i=0;i<5;i++)
    {
    mCheckID = 2200+i;
    strTemp.Format("%d",i);
    mCheck.left=20 + 50*i;
    mCheck.right = 50+50*i;
    mCheck.bottom = 210;
    mCheck.top = 180;
    //生成相应的EDIT控件
    GroupBtn[i].m_Button.Create(strTemp,BS_USERBUTTON , mCheck, this, mCheckID);
    GroupBtn[i].m_Button.ShowWindow(TRUE);
    }
    //记录控件个数
    mCheckNum = i;
    }
    3.响应事件:
    //响应点击事件
    //ON_BN_CLICKED_RANGE(2200,2204,ONClickButton)
    ON_COMMAND_RANGE(2200,2204,ONClickButton) afx_msg void ONClickButton(UINT nCmdID);

    void CDynamicCreateControlDlg::ONClickButton(UINT nCmdID)
    {
      AfxMessageBox("1111");
    }注意:ON_COMMAND_RANGE(2200,2204,ONClickButton)是指ID在2200---2204之间的响应同一事件
      

  3.   

    BEGIN_MESSAGE_MAP(CAudio, CDialog)
    //{{AFX_MSG_MAP(CAudio)
    ON_BN_CLICKED(IDC_BTN_OPEN, OnBtnOpen)
    //}}AFX_MSG_MAP
    ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel)
    END_MESSAGE_MAP()是不是放到这段代码“ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel)”放置的地方?
      

  4.   

    菜鸟学编程之C++/MFC: QQ群 41977413  C++/MFC编程开发技术,有问题讨论问题,无事适当吹水;一起讨论学习,习惯潜水者勿加菜鸟学编程之C/C#   : QQ群 41976716  C/C#编程开发技术,有问题讨论问题,无事适当吹水;一起讨论学习,习惯潜水者勿加菜鸟学编程之VB/VBA : QQ群 20772662  VB/VBA编程开发技术群,有问题讨论问题,无事适当吹水;一起讨论学习,习惯潜水者勿加
      

  5.   

    这么快就到大家的回复,十分感谢。关键是我的对话框也是动态创建的。
    在程序的BOOL CWinApp::InitInstance()中,根据XML提供的对话框的属性和对话框上控件的数量、个数等信息,先创建对话框,然后再创建对话框上面的其他控件。所以我也不知道该把事件处理函数放到什么地方,以及怎样让按钮或者别的控件的事件和这个事件处理函数关联起来。
      

  6.   

    先为要动态生成的控件派生自己的类如:
    class CMyEdit::CEdit
    {
    }
    class CMyButton::CButton
    {
    }
    重载他们的消息函数可以用类模版做
      

  7.   

    http://www.wangchao.net.cn/bbsdetail_26784.html
      

  8.   

      如果是动态创建的按钮,我觉得用 范围消息响应来处理还是比较方便的,一类消息可以放到一块处理,根据空间的ID来区分。
       例如处理一组动态创建的按钮的响应事件
      定义消息:
      ON_CONTROL_RANGE(BN_CLICKED,IDO_BTN0,IDO_BTN10,OnBnClickBtn)响应消息
      ::OnBnClickBtn(UINT CXID)
    {
       swich(CXID)
    {
       case IDO_BTN0:
       ....
       break;
      case IDO_BTN1:
      ...
      break;
    }
    }
      

  9.   

    http://blog.csdn.net/smallfishff/archive/2007/11/14/1884671.aspx
    http://download.csdn.net/source/284942
      

  10.   

    在对话框类的OnCreate中动态创建所有需要的控件,然后针对每个控件窗口动态创建(或者已预先建好)窗口类,把窗口类subclass对应的控件窗口句柄就可以处理窗口消息了