从HWND确定MFC对象的类型

时间:2013-02-24 16:34:27

标签: c++ winapi mfc

this question后,我决定覆盖主窗口PreTranslateMessage的{​​{1}}功能,以检查是否已发送CMainFrame消息,是否已发送消息消息的目标是组合框,然后阻止分派消息。

但是,我在确定邮件的目标是否为组合框时遇到问题,以下是我目前正在尝试的内容:

WM_MOUSEWHEEL

但是,这不起作用,因为运行时类似乎总是BOOL CMainFrame::PreTranslateMessage( MSG* pMsg ) { CWnd* pWnd = CWnd::FromHandle( pMsg->hwnd ); if( pWnd ) { if( pMsg->message == WM_MOUSEWHEEL ) { CRuntimeClass* pRuntimeClass = pWnd->GetRuntimeClass(); bool bIsCombo = pRuntimeClass->IsDerivedFrom( RUNTIME_CLASS(CComboBox) ) || pWnd->IsKindOf( RUNTIME_CLASS(CComboBox) ); if( bIsCombo && !reinterpret_cast<CComboBox*>(pWnd)->GetDroppedState() ) return TRUE; } } return CFrameWndEx::PreTranslateMessage( pMsg ); } ,所以我很想知道是否有办法让它工作?使用CWnddynamic_cast的{​​{1}}似乎也不起作用。

提前致谢!

2 个答案:

答案 0 :(得分:2)

GetClassName,上面显示的Captain Obvlious是可行的解决方案,可以做你想做的事。

当然,理智的解决方案(我在您链接的问题中显示)只是创建一个派生自CComboBox的类并处理WM_MOUSEWHEEL中的{无论您认为哪种方式适合您的应用。然后,只需将CComboBox更改为CComboBox或您为其命名的任何内容,即可使用派生类而不是CNoScrollComboBox

这非常简单,为您节省了很多麻烦。

答案 1 :(得分:1)

如果父窗口没有使用CComboBox(或其他合适的CWnd派生类)对组合框进行子类化,MFC将返回指向临时CWnd对象的指针。你有两个选择。在创建父项时(在OnCreateOnInitDialog) - 或 - 调用GetClassName()子类化组合框窗口,并在处理鼠标滚轮消息时检查目标窗口的类型。