簡體   English   中英

從HWND確定MFC對象的類型

[英]Determining type of MFC object from HWND

對於這個問題,我決定覆蓋我的主窗口CMainFramePreTranslateMessage函數,以檢查是否已發送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 ,所以我很好奇是否有辦法使它起作用? CWnd*CComboBox*使用dynamic_cast似乎也不起作用。

提前致謝!

GetClassName ,這是上尉上尉在上面顯示的,是可行的解決方案,並且可以做您想要的。

當然, 理智的解決方案(我在您鏈接到的問題中顯示)是簡單地創建一個從CComboBox派生的類,並以您認為適合您的應用程序的方式在其中處理WM_MOUSEWHEEL 然后,只需將CComboBox更改為CNoScrollComboBox或任何您命名的類,就可以使用派生類而不是CComboBox

這真的很簡單,可以為您省去很多麻煩

如果父窗口未使用CComboBox (或其他合適的CWnd派生類)將組合框作為子類,則MFC將返回一個指向臨時CWnd對象的指針。 您在這里有兩個選擇。 創建父對象時(在OnInitDialog OnCreate上)對組合框窗口進行子類化-或-調用GetClassName()並在處理鼠標滾輪消息時檢查目標窗口的類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM