【发布时间】:2020-02-04 12:33:51
【问题描述】:
合作:
- Visual Studio 2017;
- MFC、C++。
我正在尝试修改 MFC 项目,以便 CDialog 派生类检测何时将子控件添加到其中(CButton 派生类)。最好获取这些 CButton 的句柄 (HWND) 以进一步处理它们,就像我可以使用以下代码从父对话框窗口获取一样:
HWND handleParent = ::GetTopWindow(this->GetSafeHwnd());
我已经阅读了一种方法,通过处理 WM_PARENTNOTIFY,但我无法使用主事件函数以任何方式触发它:OnParentNotify(或 @ 987654326@ 来自某些来源)。
我已经完成了以下操作,至少对于OnParentNotify:
- 添加了消息导出:
ON_WM_PARENTNOTIFY()
- 在成员函数
DerivedDialog::OnInitDialog()中从所有可能的控制句柄中删除WS_EX_NOPARENTNOTIFY样式,在CDialog::OnInitDialog()代码行之后:
CDialog::OnInitDialog(); HWND hwnd = ::GetTopWindow(this->GetSafeHwnd()); while (hwnd) { LONG lExStyle; lExStyle = GetWindowLong(hwnd, GWL_EXSTYLE); if (lExStyle & WS_EX_NOPARENTNOTIFY) { lExStyle &= ~WS_EX_NOPARENTNOTIFY; SetWindowLong(hwnd, GWL_EXSTYLE, lExStyle); } hwnd = ::GetNextWindow(hwnd, GW_HWNDNEXT); }
- 声明和定义函数只是为了查看它是否被调用:
OnParentNotify(UINT message, LPARAM lParam) { CDialog::OnParentNotify(message, lParam) { switch (LOWORD(message)) { case WM_CREATE: { int a = 3; int b = 2; } break; case WM_PARENTNOTIFY: { int c = 1; int d = 0; } } }
不幸的是,只有WM_CREATE 被调用一次(不要认为它是相关的或正确的,因为我有 2 个按钮必须添加到对话框中......所以如果是这种情况,我希望有 2 个 WM_CREATES ??)。
我真的不确定如何触发该消息被调用。任何提示都会非常有帮助!
【问题讨论】:
-
如果您的控件由派生类处理,那么您可以覆盖其
OnCreate(CREATESTRUCT *pCreateStruct)成员并从那里向对话框发送一条消息(您已定义)。或者只是在那个被覆盖的函数中做你需要做的事情。新控件的WM_CREATE消息将发送到该控件的处理程序。 -
或者,如果您有
WS_EX_PARENTNOTIFY样式set 用于您的控件,它会将WM_PARENTNOTIFY发送到创建和销毁对话框(测试wParam找出哪个)。 -
我将尝试测试
WS_EX_PARENTNOTIFY替代方案,如果我有任何结果,请告诉您。我推测wparam来自另一个相关函数,例如OnParentNotify(...)?
标签: c++ button mfc modal-dialog message