Quelle des Artikels: Internet Autor: ggg82/CSDN
Heutzutage verwenden viele Benutzeroberflächen Symbolleisten, um Menüleisten zu erstellen. Ich habe mich kürzlich dafür interessiert und die meiste Hilfe, die ich erhalten habe, war der Quellcode von BCGControlBar oder der Quellcode von SizableRebar Ihre eigene Schnittstelle, um dies zu haben. Für diejenigen, die funktionale Freunde sind, ist dies möglicherweise eine gute Wahl. Schauen Sie sich einfach die Demo an und dann Dann rufen Sie einfach die Klassenbibliotheken anderer Leute direkt auf, aber für Leser wie uns, die sich für dieses Thema interessieren und hoffen, die Vor- und Nachteile zu verstehen, sollten wir uns diese Quellcodes ohne detaillierte Erklärungen direkt ansehen und den Grund dafür herausfinden Einfach, zumindest für einen Anfänger wie mich. Aus diesem Grund hoffe ich, dass dieser Artikel Lesern helfen kann, die noch auf der Suche nach Hilfe sind.
Schauen wir uns das unten an und reden wir:
Wenn wir die Meldung zum Drücken der Symbolleistentaste erhalten, verwenden wir im Allgemeinen TrackPopupMenuEx, um das Menü aufzurufen. Der Schlüssel zum Problem besteht darin, dass TrackPopupMenuEx nicht zurückkehrt und Maus- und Tastaturmeldungen abfängt Symbolleiste zu diesem Zeitpunkt Wenn keine Nachricht empfangen wird, gibt es natürlich keine Möglichkeit, den Hotspot zu ändern. Dazu müssen wir die Mausposition selbst erkennen und das vorherige Menü schließen und das nächste Menü anzeigen, wenn die Maus zum nächsten Hotspot bewegt wird. Hier verwenden wir die Hook-Funktion SetWindowsHookEx, um den WH_MSGFILTER-Hook zu installieren, bevor wir TrackPupupMenuEx aufrufen. Der Code lautet wie folgt:
m_hMsgHook = SetWindowsHookEx( WH_MSGFILTER, MessageProc, 0, GetCurrentThreadId() );
MssageProc ist eine Hook-Funktion, der Code lautet wie folgt:
void TrackPopup(HWND hWndToolBar, int iButton)
{
while (iButton >= 0)
{
SendMessage(hWndToolBar,TB_SETHOTITEM,iButton,0);
iPopup = iButton;
//Hook installieren
g_hMsgHook = SetWindowsHookEx(WH_MSGFILTER, MessageProc, 0, GetCurrentThreadId());
//Popup-Menü
TrackPopupMenuEx(…);
//Hook deinstallieren
UnhookWindowsHookEx(g_hMsgHook);
iButton = iNextPop; // Das nächste Popup-Element, wenn es negativ ist, wird es beendet
}
SendMessage(hWndToolBar,TB_SETHOTITEM,-1,0);
}
(Erfahrungen und Vorschläge: Wenn die Schaltfläche den Stil TBSTYLE_DROPDOWN verwendet, rufen Sie die Funktion bitte nicht direkt in der Nachricht TBN_DROPDOWN auf. Sie sollten eine Zwischennachricht verwenden und dann PostMessa verwenden, um die Nachricht zu senden, damit TBN_DROPDOWN direkt zurückkehren kann, andernfalls die erste Der hervorgehobene Hotspot wird entfernt. Dies ist sehr problematisch.)
iPopup ist das aktuelle Popup-Element und iNextPop ist das nächste Popup-Element. Diese Variablen müssen in der Funktion HookMessageProc verarbeitet werden.