2013-02-24 4 views
0

В дополнение к this question я решил переписать PreTranslateMessage функцию моего главного окна CMainFrame, чтобы проверить, если WM_MOUSEWHEEL сообщение было отправлено, и если у него есть и цель сообщения является списком а затем запретить отправку сообщения.Определение типа объекта MFC от HWND

Однако, я имею вопрос, определяющий, если цель сообщения является списком, вот что я в настоящее время пытаюсь:

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 от CWnd* до CComboBox* также не работает.

Заранее благодарен!

ответ

1

Если родительское окно не подклассифицирует поле со списком с CComboBox (или другим подходящим производным классом CWnd), MFC вернет указатель на временный объект CWnd. У вас есть два варианта. Подкласс окна combobox при создании родительского элемента (в OnCreate по адресу OnInitDialog) -ИЛИ- звоните GetClassName() и проверьте тип целевого окна, когда вы обрабатываете сообщение колеса мыши.

2

GetClassName, что показывает вышеприведенное доказательство капитана Obvlious, и будет делать то, что вы хотите.

Конечно, здравомыслящий решение (которое я показываю в этом вопросе Вы связываетесь с), чтобы просто создать класс, производный от CComboBox и обрабатывать WM_MOUSEWHEEL там в зависимости от того, как вы чувствуете, подходит для вашего приложения. Затем вы можете использовать производный класс вместо CComboBox, просто изменив CComboBox на CNoScrollComboBox или на то, что вы называете своим классом.

Это действительно очень просто и сэкономит вам весь комплекс проблем.

Смежные вопросы