如何响应动态创建控件的事件 因为程序需要能够根据XML的内容指定的数量、大小、位置等条件动态生成控件,所以程序的所有控件、包括对话框都是动态生成的。我想请教一下,在这种情况下,如何让程序来响应按钮、下拉框等等控件的事件? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 跟静态的差不多,简单的方法:将需要的事件代码按照静态控件生成,手工copy到项目中略加修改即可,比如一个OnButtonXX,它会关联一个BUTTON的ID,这个ID就是你的动态按钮的ID,另外需要注意的就是动态的事件代码声明要放到MFC ClassWizard自动生成的代码码外面,如AFX_MSG括号对 和静态差不多...给你看个例子(动态创建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之间的响应同一事件 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)”放置的地方? 菜鸟学编程之C++/MFC: QQ群 41977413 C++/MFC编程开发技术,有问题讨论问题,无事适当吹水;一起讨论学习,习惯潜水者勿加菜鸟学编程之C/C# : QQ群 41976716 C/C#编程开发技术,有问题讨论问题,无事适当吹水;一起讨论学习,习惯潜水者勿加菜鸟学编程之VB/VBA : QQ群 20772662 VB/VBA编程开发技术群,有问题讨论问题,无事适当吹水;一起讨论学习,习惯潜水者勿加 这么快就到大家的回复,十分感谢。关键是我的对话框也是动态创建的。在程序的BOOL CWinApp::InitInstance()中,根据XML提供的对话框的属性和对话框上控件的数量、个数等信息,先创建对话框,然后再创建对话框上面的其他控件。所以我也不知道该把事件处理函数放到什么地方,以及怎样让按钮或者别的控件的事件和这个事件处理函数关联起来。 先为要动态生成的控件派生自己的类如:class CMyEdit::CEdit{}class CMyButton::CButton{}重载他们的消息函数可以用类模版做 http://www.wangchao.net.cn/bbsdetail_26784.html 如果是动态创建的按钮,我觉得用 范围消息响应来处理还是比较方便的,一类消息可以放到一块处理,根据空间的ID来区分。 例如处理一组动态创建的按钮的响应事件 定义消息: ON_CONTROL_RANGE(BN_CLICKED,IDO_BTN0,IDO_BTN10,OnBnClickBtn)响应消息 ::OnBnClickBtn(UINT CXID){ swich(CXID){ case IDO_BTN0: .... break; case IDO_BTN1: ... break;}} http://blog.csdn.net/smallfishff/archive/2007/11/14/1884671.aspxhttp://download.csdn.net/source/284942 在对话框类的OnCreate中动态创建所有需要的控件,然后针对每个控件窗口动态创建(或者已预先建好)窗口类,把窗口类subclass对应的控件窗口句柄就可以处理窗口消息了 如何禁用启用设备???? 有关dll加载的问题 vc6 custom wizard 捕获对话框的消息 我利用属性表建立了几个属性页怎么一按回车就退出了,怎么解决 Navigate2 一执行就错误 vc6.0下mfc里面选中某行点button按钮跳转到另一个页面的问题 如何从注册表的某一子键下读出一个DWORD值? 请问如何得到工具栏的指针并使某个工具按钮灰化? 请问:哪里有MCIWndX控件下载? 用线将两台电脑的串口连接,怎样才能知道两台电脑间的串口是正常通讯的? 怎样在静态MFC DLL中获得DLL的hInstance?
将需要的事件代码按照静态控件生成,手工copy到项目中略加修改即可,比如一个OnButtonXX,它会关联一个BUTTON的ID,这个ID就是你的动态按钮的ID,另外需要注意的就是动态的事件代码声明要放到MFC ClassWizard自动生成的代码码外面,如AFX_MSG括号对
给你看个例子(动态创建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之间的响应同一事件
//{{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)”放置的地方?
在程序的BOOL CWinApp::InitInstance()中,根据XML提供的对话框的属性和对话框上控件的数量、个数等信息,先创建对话框,然后再创建对话框上面的其他控件。所以我也不知道该把事件处理函数放到什么地方,以及怎样让按钮或者别的控件的事件和这个事件处理函数关联起来。
class CMyEdit::CEdit
{
}
class CMyButton::CButton
{
}
重载他们的消息函数可以用类模版做
例如处理一组动态创建的按钮的响应事件
定义消息:
ON_CONTROL_RANGE(BN_CLICKED,IDO_BTN0,IDO_BTN10,OnBnClickBtn)响应消息
::OnBnClickBtn(UINT CXID)
{
swich(CXID)
{
case IDO_BTN0:
....
break;
case IDO_BTN1:
...
break;
}
}
http://download.csdn.net/source/284942