作者:mobiledu2502891853 | 来源:互联网 | 2023-08-08 09:43
看各位前辈的代码,如果将动态生成的控件放在当前dialog类中,可以设置事件,但如果放在dialog里面的子容器比如groupbox,事件就失效了,BEGIN_MESSAGE
看各位前辈的代码, 如果将动态生成的控件放在当前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这里要额外处理的, 不知道怎么办?
12 个解决方案
我也每及具体做过。
不过建议你在百度搜“MFC 动态生成控件 消息映射 事件处理”
据我所知,groupbox里面不是通常放RadioButton或CheckBox吗?
不必 “将parent的this换成cmgArea (group box)”
控件的事件一般传递给其父窗口, 如果你把父窗口指向的是Group控件,自然应该由Group控件处理
简单一点的操作, 不要动态创建, 在资源编辑器中编辑好,布局比较容易掌控
派生你的 groupbox (其实是 static)