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

Anmelden zum Antworten