2013-02-24 96 views
0

this question我已決定重寫我的主窗口CMainFramePreTranslateMessage功能,以檢查是否已發送一個WM_MOUSEWHEEL消息,如果它已經和消息的目標是組合框然後阻止該消息被分派。決定類型從HWND MFC對象

不過,我有一個問題,確定該消息的目標是一個組合框,這裏是我目前正在:

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也似乎不起作用。

在此先感謝!

回答

1

如果父窗口沒有用CComboBox(或其他合適的CWnd派生類)繼承組合框,MFC將返回一個指向臨時CWnd對象的指針。你有兩個選擇。在創建父項時(在OnCreateOnInitDialog上)子組合框窗口 - 或 - 調用GetClassName()並在處理鼠標滾輪消息時檢查目標窗口的類型。

2

GetClassName,這是Obvlious上尉在上面顯示的是可行的解決方案,並且會做你想做的。

當然,理智解決方案(我顯示您鏈接到的問題)是簡單地創建CComboBox派生類,並在你覺得哪個方法是適合您的應用程序處理WM_MOUSEWHEEL那裏。然後,您可以簡單地通過將CComboBox更改爲CNoScrollComboBox或任何其他您命名的類來使用派生類而不是CComboBox

這真的很簡單,併爲您節省了很多麻煩

相關問題