继this question后,我决定覆盖主窗口PreTranslateMessage
的{{1}}功能,以检查是否已发送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_cast
的{{1}}似乎也不起作用。
提前致谢!
答案 0 :(得分:2)
GetClassName
,上面显示的Captain Obvlious是可行的解决方案,可以做你想做的事。
当然,理智的解决方案(我在您链接的问题中显示)只是创建一个派生自CComboBox
的类并处理WM_MOUSEWHEEL
中的{无论您认为哪种方式适合您的应用。然后,只需将CComboBox
更改为CComboBox
或您为其命名的任何内容,即可使用派生类而不是CNoScrollComboBox
。
这非常简单,为您节省了很多麻烦。
答案 1 :(得分:1)
如果父窗口没有使用CComboBox
(或其他合适的CWnd派生类)对组合框进行子类化,MFC将返回指向临时CWnd对象的指针。你有两个选择。在创建父项时(在OnCreate
上OnInitDialog
) - 或 - 调用GetClassName()
子类化组合框窗口,并在处理鼠标滚轮消息时检查目标窗口的类型。