M
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);
}