////////////////// // Virtual CSubclassWnd window proc. All messages come here before frame // window. Isn't it cool? Just like in the old days! // LRESULT CCoolMenuManager::WindowProc(UINT msg, WPARAM wp, LPARAM lp) { switch(msg) { case WM_SYSCOLORCHANGE: case WM_SETTINGCHANGE: Refresh(); break; case WM_MEASUREITEM: if (OnMeasureItem((MEASUREITEMSTRUCT*)lp)) return TRUE; // handled break; case WM_DRAWITEM: if (OnDrawItem((DRAWITEMSTRUCT*)lp)) return TRUE; // handled break; case WM_INITMENUPOPUP: // Very important: must let frame window handle it first! // Because if someone calls CCmdUI::SetText, MFC will change item to // MFT_STRING, so I must change back to MFT_OWNERDRAW. // CSubclassWnd::WindowProc(msg, wp, lp); OnInitMenuPopup(CMenu::FromHandle((HMENU)wp), (UINT)LOWORD(lp), (BOOL)HIWORD(lp)); return 0; case WM_MENUSELECT: OnMenuSelect((UINT)LOWORD(wp), (UINT)HIWORD(wp), (HMENU)lp); break; case WM_MENUCHAR: LRESULT lr = OnMenuChar((TCHAR)LOWORD(wp), (UINT)HIWORD(wp), CMenu::FromHandle((HMENU)lp)); if (lr!=0) return lr; break; } return CSubclassWnd::WindowProc(msg, wp, lp); }
//-------------------------------------------------------------------------------- bool CMenuController::ProcessMessage( COSWindow& Window, Cmp_long_ptr& lResult, unsigned int uMsg, Cmp_uint_ptr wParam, Cmp_long_ptr lParam ) { _WINQ_FCONTEXT( "CMenuController::ProcessMessage" ); bool bProcessed = ProcessHook( Window, lResult, uMsg, wParam, lParam ); switch ( uMsg ) { case COSWindow::wmContextMenu: { COSWindow::refType refWnd = COSWindow::FromHandle( CWindowHandle( 0, (void*)(wParam) ).Ref() ); unsigned short wXPos = LoWord( lParam ); unsigned short wYPos = HiWord( lParam ); OnContextMenu( Window, refWnd, wXPos, wYPos ); bProcessed = true; } break; case COSWindow::wmInitMenu: { CMenu::refType refMenu = CMenu::FromHandle( CMenuHandle( 0, (void*)(wParam) ).Ref() ); OnInitMenu( Window, refMenu ); lResult = 0; bProcessed = true; } break; case COSWindow::wmInitMenuPopup: { CMenu::refType refMenu = CMenu::FromHandle( CMenuHandle( 0, (void*)( wParam ) ).Ref() ); unsigned short wPos = LoWord( lParam ); int bWindowMenu = static_cast< int >( HiWord( lParam ) ); OnInitMenuPopup( Window, refMenu, wPos, bWindowMenu ? true : false ); lResult = 0; bProcessed = true; } break; #if ( WINVER >= 0x0500 ) case COSWindow::wmUninitMenuPopup: { CMenu::refType refMenu = CMenu::FromHandle( CMenuHandle( 0, (void*)(wParam) ).Ref() ); unsigned short wDestroyedMenu = HiWord( lParam ); OnDestroyedMenuPopup( Window, refMenu, wDestroyedMenu ); bProcessed = true; } break; #endif//( WINVER >= 0x0500 ) case COSWindow::wmMenuSelect: { unsigned short wIndex = LoWord( wParam ); unsigned short wFlags = HiWord( wParam ); CMenu::refType refMenu = CMenu::FromHandle( CMenuHandle( 0, (void*)( lParam ) ).Ref() ); OnMenuSelect( Window, refMenu, wIndex, wFlags ); lResult = 0; bProcessed = true; } break; case COSWindow::wmMenuChar: { unsigned short wCharCode = LoWord( wParam ); unsigned short wMenuType = HiWord( wParam ); CMenu::refType refMenu = CMenu::FromHandle( CMenuHandle( 0, (void*)( lParam ) ).Ref() ); lResult = OnMenuChar( Window, refMenu, wCharCode, wMenuType ); bProcessed = true; } break; case COSWindow::wmNextMenu: { MDINextMenu* pNextMenu = reinterpret_cast< MDINextMenu* >( lParam ); CMenu::refType refMenuIn = CMenu::FromHandle( CMenuHandle( 0, (void*)( pNextMenu->hmenuIn ) ).Ref() ); CMenu::refType refMenuNext = CMenu::FromHandle( CMenuHandle( 0, (void*)( pNextMenu->hmenuNext ) ).Ref() ); OnNextMenu( Window, wParam, refMenuIn, refMenuNext ); bProcessed = true; } break; #if ( WINVER >= 0x0500 ) case COSWindow::wmMenuGetObject: { MenuGetObjectInfo* pMenuObjectInfo = reinterpret_cast< MenuGetObjectInfo* >( lParam ); lResult = OnGetObject( Window, pMenuObjectInfo ); bProcessed = true; } break; case COSWindow::wmMenuRButtonUp: { CMenu::refType refMenu = CMenu::FromHandle( CMenuHandle( 0, (void*)( lParam ) ).Ref() ); OnRButtonUp( Window, refMenu, wParam ); bProcessed = true; } break; case COSWindow::wmMenuCommand: { CMenu::refType refMenu = CMenu::FromHandle( CMenuHandle( 0, (void*)( lParam ) ).Ref() ); unsigned short wItemID = static_cast< unsigned short >( -1 ); int iIndex = 0; if( System().Information(QOR_PP_SHARED_OBJECT_ACCESS).IsWindows98orME() ) { wItemID = LoWord( wParam ); iIndex = static_cast< int >( HiWord( wParam ) ); } else { iIndex = wParam; } OnMenuCommand( Window, refMenu, iIndex, wItemID ); bProcessed = true; } break; case COSWindow::wmMenuDrag: { CMenu::refType refMenu = CMenu::FromHandle( CMenuHandle( 0, (void*)( lParam ) ).Ref() ); lResult = OnMenuDrag( Window, refMenu, static_cast< unsigned short >( wParam ) ); bProcessed = true; } break; #endif//( WINVER >= 0x0500 ) case COSWindow::wmCommand: { unsigned short wCode = HiWord( wParam ); if( wCode == 0 ) { unsigned short wMenuID = LoWord( wParam ); OnCommand( Window, wMenuID ); lResult = 0; bProcessed = true; } } break; } return bProcessed; }