在this question之后,我决定覆盖主窗口PreTranslateMessage
的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 );
}
但是,这不起作用,因为运行时类似乎总是
CWnd
,所以我很想知道是否有办法使它起作用?从dynamic_cast
到CWnd*
使用CComboBox*
似乎也不起作用。提前致谢!
最佳答案
GetClassName
,这是上尉Obvlious所显示的,是可行的解决方案,将按照您的意愿进行。
当然,理智的解决方案(我在您链接到的问题中显示)是简单地创建一个从CComboBox
派生的类,并以您认为适合您的应用程序的任何方式在其中处理WM_MOUSEWHEEL
。然后,只需将CComboBox
更改为CComboBox
或任何您命名的类,就可以使用派生类而不是CNoScrollComboBox
。
这真的很简单,可以为您省去很多麻烦。