[英]Determining type of MFC object from HWND
對於這個問題,我決定覆蓋我的主窗口CMainFrame
的PreTranslateMessage
函數,以檢查是否已發送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.