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*CComboBox*も機能しないようです。

前もって感謝します!

4

2 に答える 2

2

GetClassName、これは上記のキャプテンオブブリアスが示しているものであり、実行可能なソリューションであり、あなたが望むことを行います.

もちろん、適切な解決策 (リンク先の質問で示しています) は、単に派生クラスを作成し、アプリケーションに適していると思われる方法でそこCComboBoxを処理することです。次に、クラスに名前を付けたり、名前を付けたりするだけでWM_MOUSEWHEELなく、派生クラスを使用できます。CComboBoxCComboBoxCNoScrollComboBox

これは非常に簡単で、多くの手間を省くことができます。

于 2013-02-25T17:55:20.720 に答える
1

CComboBox親ウィンドウがコンボボックスを(または他の適切なCWnd派生クラス)でサブクラス化しない場合、 MFCは一時的なCWndオブジェクトへのポインターを返します。ここには2つのオプションがあります。親が作成されたときにコンボボックスウィンドウをサブクラス化します(でOnCreate) -または-マウスホイールメッセージを処理するときに、ターゲットウィンドウのタイプをOnInitDialog呼び出して確認します。GetClassName()

于 2013-02-24T17:50:58.190 に答える