MFC动态生成控件并放于子容器group box, 如何为其设置处理事件?

OK_boom 2017-08-04 03:19:57
看各位前辈的代码, 如果将动态生成的控件放在当前dialog类中,可以设置事件, 但如果放在dialog里面的子容器比如group box, 事件就失效了,

BEGIN_MESSAGE_MAP(Cbms_setupDlg, CDialogEx)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_CLOSE()
ON_COMMAND_RANGE(C_BTN_LINE_ID, C_BTN_LINE_ID + 99, &Cbms_setupDlg::OnLineItemClick)
ON_CONTROL_RANGE(BN_CLICKED,C_BTN_AREA_ID, C_BTN_AREA_ID + 2, &Cbms_setupDlg::OnAreaItemClick)
ON_BN_CLICKED(IDCANCEL, &Cbms_setupDlg::OnBnClickedCancel)
END_MESSAGE_MAP()
...
size_t lvnBtnCount = lvvsAreas.size();
mAreaBtns = new CButton[lvnBtnCount];
DWORD dwStyle = WS_CHILD | WS_VISIBLE | BS_COMMANDLINK;
string * lvlpsAreas = &lvvsAreas[0];
for (size_t i = 0; i < lvnBtnCount; i++) {
wstring lvsTitle = freestyle::StrUtils::s2ws(lvlpsAreas[i]);
mAreaBtns[i].Create(lvsTitle.data(), dwStyle, CRect(20 + 250 * i, 30, 180 + 250 * i, 70), &cmgArea, C_BTN_AREA_ID + i);
+ i);

}

如上代码,如果将parent的this换成cmgArea (group box), 事件就失效了, 应该是BEGIN_MESSAGE_MAP这里要额外处理的, 不知道怎么办?
...全文
706 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2017-08-05
  • 打赏
  • 举报
回复
派生你的 groupbox (其实是 static)
OK_boom 2017-08-05
  • 打赏
  • 举报
回复
引用 10 楼 zgl7903 的回复:
简单一点的操作, 不要动态创建, 在资源编辑器中编辑好,布局比较容易掌控
button的内容及数量来自服务器... 而且,请问怎么将button/checkbox这些控件加入到group box容器里面?
zgl7903 2017-08-05
  • 打赏
  • 举报
回复
简单一点的操作, 不要动态创建, 在资源编辑器中编辑好,布局比较容易掌控
OK_boom 2017-08-05
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
据我所知,groupbox里面不是通常放RadioButton或CheckBox吗?
一样的了, radiobutton/checkbox被安置于groupbox里面应该也不能接受消息的, 现在苦恼的是不知道怎么写那个消息映射. 昨晚睡觉前突然想起要不看看自动生成的代码是怎样的, 今天起床就在dialog里面拉了一个group box , 然后试图再拉一个button到group box里面, 但是怎么弄button的parent还是这个dialog . 刚从delphi转到vc不久, 这个真是比较难适应....
OK_boom 2017-08-05
  • 打赏
  • 举报
回复
引用 5 楼 schlafenhamster 的回复:
不必 “将parent的this换成cmgArea (group box)”
如果我想用group box将动态控件分组管理, 一般应该怎么处理呢?
OK_boom 2017-08-05
  • 打赏
  • 举报
回复
引用 6 楼 zgl7903 的回复:
控件的事件一般传递给其父窗口, 如果你把父窗口指向的是Group控件,自然应该由Group控件处理
但是我想用group box将动态生成的控件分组管理 , 如果不将this换成groupbox的类变量, 还有什么好的办法?
zgl7903 2017-08-04
  • 打赏
  • 举报
回复
控件的事件一般传递给其父窗口, 如果你把父窗口指向的是Group控件,自然应该由Group控件处理
schlafenhamster 2017-08-04
  • 打赏
  • 举报
回复
不必 “将parent的this换成cmgArea (group box)”
赵4老师 2017-08-04
  • 打赏
  • 举报
回复
据我所知,groupbox里面不是通常放RadioButton或CheckBox吗?
OK_boom 2017-08-04
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
我也每及具体做过。 不过建议你在百度搜“MFC 动态生成控件 消息映射 事件处理”
不会吧? 我就是找了很久,资料都没涉及到具体应用, 理应用容器将其装起来是最常用的...
赵4老师 2017-08-04
  • 打赏
  • 举报
回复
每及→没
赵4老师 2017-08-04
  • 打赏
  • 举报
回复
我也每及具体做过。 不过建议你在百度搜“MFC 动态生成控件 消息映射 事件处理”
第7章 Windows标准控件 精讲 在前一章,已经学习了在一个对话框中增加控件,用户通过对话框中的控件与应用程序进行交互的方法,在这一章,主要详细讨论不同Windows标准控件的使用特性,你将学会静态控件、按钮控件、编辑框控件、列表框控件、组合框控件、滚动条控件的使用。 7.1 Windows标准控件概述 7.1.1 Winodws 标准控件 Windows系统提供的标准控件主要包括:静态控件、按钮控件、编辑框控件、列表框控件、组合框控件等,如表7-1所示。 表7-1 windows标准控件的类型 类别 MFC控件类型 静态控件 CStatic Static Text、Group Box 按钮控件 CButton Button、Check Box、Radio Button 编辑框控件 CEdit Edit Control 组合框控件 CComboBox Combo Box 列表框控件 CListBox List Box 控件操作的学习要关注以下几个方面: 1. 控件的创建 控件的创建形式分为静态创建和动态创建两种方式。 静态创建是指在对话框模板创建控件,并设置控件的属性,这样,在调用该对话框时,窗口系统会自动按预先的设置为对话框创建控件,程序员可以使用ClassWizard为该控件在对话框类中创建一个控件类的对象。 动态创建是指在程序的运行中根据需要,定义一个控件类的对象,再通过窗口函数CreateWindow()或CreateWindowEx()创建控件,函数ShowWindow()显示控件,正如操作一个窗口。 2. 控件的属性设置 每个控件都有一个属性集,对于静态创建的控件,可以在对话框模板中,打开控件的属性对话框直接设置控件的初始属性。在程序设计过程中,可以通过控件类对象调用方法设置控件的属性。 3. 控件消息类别 表7-1中所列出的控件中,静态控件不发送消息,其它控件对于用户的操作都能发送消息,不同类的控件发送的消息类别是不相同的,可以使用ClassWizard为控件映射各种消息处理函数。 4. 控件对象的常用方法 MFC控件类提供丰富的方法函数,帮助程序员操作控件对象。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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