如何响应动态创建控件的事件

glacierful 2007-11-12 05:01:49
因为程序需要能够根据XML的内容指定的数量、大小、位置等条件动态生成控件,所以程序的所有控件、包括对话框都是动态生成的。
我想请教一下,在这种情况下,如何让程序来响应按钮、下拉框等等控件的事件?
...全文
483 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
pptor 2007-11-14
  • 打赏
  • 举报
回复
无非是消息 消息响应函数 以及消息和消息响应函数的关联
3个地方同时加入代码就ok了。
jameshooo 2007-11-14
  • 打赏
  • 举报
回复
在对话框类的OnCreate中动态创建所有需要的控件,然后针对每个控件窗口动态创建(或者已预先建好)窗口类,把窗口类subclass对应的控件窗口句柄就可以处理窗口消息了
smallfishff 2007-11-14
  • 打赏
  • 举报
回复
http://blog.csdn.net/smallfishff/archive/2007/11/14/1884671.aspx
http://download.csdn.net/source/284942
huamoran 2007-11-14
  • 打赏
  • 举报
回复
路过
xtaddqqug 2007-11-13
  • 打赏
  • 举报
回复
先为要动态生成的控件派生自己的类如:
class CMyEdit::CEdit
{
}
class CMyButton::CButton
{
}
重载他们的消息函数可以用类模版做
glacierful 2007-11-13
  • 打赏
  • 举报
回复
程序启动时就创建一个对话框。其他对话框根据不同情况创建。
hope_learn 2007-11-13
  • 打赏
  • 举报
回复
如果是动态创建的按钮,我觉得用 范围消息响应来处理还是比较方便的,一类消息可以放到一块处理,根据空间的ID来区分。
例如处理一组动态创建的按钮的响应事件
定义消息:
ON_CONTROL_RANGE(BN_CLICKED,IDO_BTN0,IDO_BTN10,OnBnClickBtn)

响应消息
::OnBnClickBtn(UINT CXID)
{
swich(CXID)
{
case IDO_BTN0:
....
break;
case IDO_BTN1:
...
break;
}
}
ccpaishi 2007-11-13
  • 打赏
  • 举报
回复
想做一个的时候自己添加一个相同的控件,然后设置变量,看看哪里变化了,最后去掉,留下代码就可以了
qeq2008 2007-11-12
  • 打赏
  • 举报
回复
可不可以建一个对话框模板,当你需要创建对话框时调用然后在这个对话框上动态创建控件..

...........就是不知道你会不会同时创建多个对话框!
zhourenyun 2007-11-12
  • 打赏
  • 举报
回复
无非是消息 消息响应函数 以及消息和消息响应函数的关联
3个地方同时加入代码就ok了。
glacierful 2007-11-12
  • 打赏
  • 举报
回复
这么快就到大家的回复,十分感谢。

关键是我的对话框也是动态创建的。
在程序的BOOL CWinApp::InitInstance()中,根据XML提供的对话框的属性和对话框上控件的数量、个数等信息,先创建对话框,然后再创建对话框上面的其他控件。

所以我也不知道该把事件处理函数放到什么地方,以及怎样让按钮或者别的控件的事件和这个事件处理函数关联起来。
  • 打赏
  • 举报
回复


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

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

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

glacierful 2007-11-12
  • 打赏
  • 举报
回复
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)”放置的地方?
jacklzw88 2007-11-12
  • 打赏
  • 举报
回复
一样,无非系统响应鼠标的事件的区域变化。
Snow_Ice11111 2007-11-12
  • 打赏
  • 举报
回复
最省事的方法:先在界面上放置上你动态创建出来的控件,注意各控件的ID号一定要和你动态创建的一模一样,然后按标准的方法添加、处理各控件的事件,就象普通方式下处理的方法一样。一切都处理完后,再在界面设计窗口中删去相应的控件,最后加上你动态创建控件的代码即可。
qeq2008 2007-11-12
  • 打赏
  • 举报
回复
和静态差不多...
给你看个例子(动态创建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之间的响应同一事件
Elysium 2007-11-12
  • 打赏
  • 举报
回复
跟静态的差不多,简单的方法:
将需要的事件代码按照静态控件生成,手工copy到项目中略加修改即可,比如一个OnButtonXX,它会关联一个BUTTON的ID,这个ID就是你的动态按钮的ID,另外需要注意的就是动态的事件代码声明要放到MFC ClassWizard自动生成的代码码外面,如AFX_MSG括号对

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧