Problem mit der Internet Explorer-style Menu Bar
-
Hallo,
ich habe ein Problem mit der "Internet Explorer-style Menu Bar", wie sie in der MSDN beschrieben wird
Weiter unten habe ich ein Stück Code angefügt.Das Problem ist, dass der Hook zwar das MouseMove-Ereignis weiter reicht, die Toolbar reagiert aber nicht darauf. Mehr noch: Im Spy++ beobachte ich merkwürdige Dinge und zwar, so bald ein Menüpunkt angezeigt wird, bekommt die Toolbar bei Mausbewegung immer die Ereignisse: WM_PAINT, WM_ERASEBKGND, WM_MOUSEMOVE und WM_MOUSELEAVE hintereinander und das bei jeder Mausbewegung.
Und was noch komisch ist: Bei jeder Mausbewegung wird ein Pünktchen vor die Message gesetzt, so dass ich wenigen Bewegungen ein riesiges Dreieck im Spy habe .
Wo kommen diese Punkte her und wie bekomme ich eine Reaktion bei den anderen Menüpunkten ?
Ich bin sehr dankbar für jägliche Anregungen!!!
Micha
HIER DER CODE:
Ich habe eine Rebar mit einer Toolbar erstellt. Die Toolbar beinhaltet Dropdown-Buttons und ich reagiere auf das folgende Ereignis:
case TBN_DROPDOWN: lpnmtb = (LPNMTOOLBAR) lParam; GetWindowRect(g_pFrame->GetToolbarMenuWindow(), &rcmenuToolbar); rc = lpnmtb->rcButton; hmenu = ::LoadMenuA(g_pFrame->GetLanguageInstance(), MAKEINTRESOURCEA(MNU_USE_MAIN)); g_pFrame->m_PopUpMenu = GetSubMenu(hmenu, lpnmtb->iItem); g_pFrame->m_HookMsg = SetWindowsHookEx( WH_MSGFILTER, HookWndProc, NULL, GetCurrentThreadId() ); nReturn = (UINT) ::TrackPopupMenuEx( g_pFrame->m_PopUpMenu, TPM_NONOTIFY | TPM_RETURNCMD | TPM_VERTICAL, rcmenuToolbar.left + rc.left, rcmenuToolbar.bottom + (rc.bottom - rc.top - 15), g_pFrame->GetMainWindow(), NULL); UnhookWindowsHookEx(g_pFrame->m_HookMsg); g_pFrame->m_HookMsg = NULL; break;Die dazu passende Hookprocedur sieht wie folgt aus:
LRESULT CALLBACK COrgDataFrame::HookWndProc(int iCode, WPARAM wParam, LPARAM lParam) { MSG * hookMessage; POINT px; POINTS pt; LPARAM ppp; hookMessage = (MSG *) lParam; if (iCode == MSGF_MENU) { switch (hookMessage->message) { case WM_MOUSEMOVE: ClearMemory(px); ClearMemory(pt); pt = MAKEPOINTS(hookMessage->lParam); px.x = pt.x; px.y = pt.y; ScreenToClient(g_pFrame->GetToolbarMenuWindow(), (LPPOINT) &px); swprintf(Buf, L"%d,%d:%d", px.x, px.y, count++); g_pFrame->SetStatusWndText(1, Buf); ppp = MAKELPARAM(px.x, px.y); if (g_pFrame->GetToolbarMenuWindow()){ SendMessage(g_pFrame->GetToolbarMenuWindow(), WM_MOUSEMOVE, hookMessage->wParam, ppp); } break; default: break; } } return CallNextHookEx(g_pFrame->m_HookMsg, iCode, wParam, lParam); }