0

对于这个问题,我决定覆盖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_castfrom CWnd*toCComboBox*似乎也不起作用。

提前致谢!

4

2 回答 2

2

GetClassName,这就是上面 Obvlious 船长显示的可行解决方案,并且会做你想做的事。

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

这真的很简单,为您省去了很多麻烦

于 2013-02-25T17:55:20.720 回答
1

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

于 2013-02-24T17:50:58.190 回答