如何判断发送AFX_WM_ON_MOVE_TAB消息的CMFCTabCtrl控件?
确定发送AFX_WM_ON_MOVE_TAB的CMFCTabCtrl控件
其实这个问题的核心是利用MFC消息机制里的隐藏信息——虽然SendMessage调用里没直接传控件句柄,但消息本身会携带发送者的窗口句柄。你可以按下面的步骤来操作:
- 第一步,在你的消息处理函数里,调用
GetCurrentMessage()获取当前的MSG结构体。这个结构体里的hwnd成员就是发送这条消息的CMFCTabCtrl的窗口句柄。 - 第二步,用
CWnd::FromHandle()把这个句柄转换成CMFCTabCtrl指针。比如:MSG* pMsg = GetCurrentMessage(); if (pMsg != nullptr) { CMFCTabCtrl* pTabCtrl = dynamic_cast<CMFCTabCtrl*>(CWnd::FromHandle(pMsg->hwnd)); if (pTabCtrl != nullptr) { // 这里pTabCtrl就是发送消息的那个选项卡控件了,可以做后续处理 } } - 为什么这个方法可行?因为
SendMessage在发送消息时,会自动把发送窗口的句柄填充到MSG结构体的hwnd字段里,不管你显式传没传。MFC的消息循环会把这个MSG传递给你的处理函数,所以你能拿到这个关键信息。
另外,如果你后续有自定义通知的需求,也可以考虑修改SendMessage的参数,把控件句柄放到WPARAM或者LPARAM里(比如把句柄转成WPARAM),这样处理起来更直接,但对于现有代码来说,上面的方法不需要修改发送消息的逻辑,成本更低。
内容的提问来源于stack exchange,提问作者user9444860
相关产品推荐
相关产品推荐

