this question之后,我决定覆盖主窗口PreTranslateMessageCMainFrame函数,以检查是否已发送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_castCWnd*使用CComboBox*似乎也不起作用。

提前致谢!

最佳答案

GetClassName,这是上尉Obvlious所显示的,是可行的解决方案,将按照您的意愿进行。

当然,理智的解决方案(我在您链接到的问题中显示)是简单地创建一个从CComboBox派生的类,并以您认为适合您的应用程序的任何方式在其中处理WM_MOUSEWHEEL。然后,只需将CComboBox更改为CComboBox或任何您命名的类,就可以使用派生类而不是CNoScrollComboBox

这真的很简单,可以为您省去很多麻烦。

09-25 20:27