Source de l'article : Internet Auteur : ggg82/CSDN
De nos jours, de nombreuses interfaces utilisateur utilisent des barres d'outils pour créer des barres de menus. Je me suis récemment intéressé à cela et j'ai demandé de l'aide en ligne. Cependant, la plupart de l'aide que j'ai reçue était le code source de BCGControlBar ou le code source de SizingRebar. leur propre interface pour avoir cela. Pour ceux qui sont des amis fonctionnels, cela peut être un bon choix. Jetez simplement un œil à la démo, puis. Ensuite, appelez directement les bibliothèques de classes d'autres personnes, mais pour les lecteurs comme nous qui sont intéressés par ce sujet et espèrent comprendre les tenants et les aboutissants, nous devrions examiner directement ces codes sources sans explications détaillées et en comprendre la raison. facile, du moins pour un novice comme moi, j'espère que cet article pourra apporter une certaine aide aux lecteurs qui recherchent encore de l'aide.
Regardons et parlons ci-dessous :
Lors de la réception du message d'appui sur le bouton de la barre d'outils, nous utilisons généralement TrackPopupMenuEx pour afficher le menu. La clé du problème est que lorsque le menu n'est pas fermé, TrackPopupMenuEx ne renvoie pas et intercepte les messages de la souris et du clavier. barre d'outils pour le moment Si aucun message n'est reçu, il n'y a bien sûr aucun moyen de changer le point chaud. Cela nous oblige à détecter nous-mêmes la position de la souris, à fermer le menu précédent et à afficher le menu suivant lorsque la souris se déplace vers le point chaud suivant. Ici, nous utilisons la fonction hook SetWindowsHookEx pour installer le hook WH_MSGFILTER avant d'appeler TrackPupupMenuEx. Le code est le suivant :
m_hMsgHook = SetWindowsHookEx( WH_MSGFILTER, MessageProc, 0, GetCurrentThreadId() );
MssageProc est une fonction hook, le code est le suivant :
void TrackPopup (HWND hWndToolBar, int iButton)
{
tandis que (iButton >= 0)
{
SendMessage(hWndToolBar,TB_SETHOTITEM,iButton,0);
iPopup = iBouton ;
//Installer le crochet
g_hMsgHook = SetWindowsHookEx(WH_MSGFILTER, MessageProc, 0, GetCurrentThreadId());
//Menu contextuel
TrackPopupMenuEx(…);
//Désinstaller le crochet
DécrochezWindowsHookEx(g_hMsgHook);
iButton = iNextPop; //L'élément pop-up suivant, s'il est négatif, quittez
}
SendMessage(hWndToolBar,TB_SETHOTITEM,-1,0);
}
(Expérience et suggestions : si le bouton utilise le style TBSTYLE_DROPDOWN, veuillez ne pas appeler la fonction directement dans le message TBN_DROPDOWN. Vous devez utiliser un message intermédiaire, puis utiliser PostMessa pour envoyer le message afin que TBN_DROPDOWN puisse revenir directement, sinon le premier Le point chaud en surbrillance sera éliminé. C’est très gênant.)
iPopup est l'élément contextuel actuel et iNextPop est l'élément contextuel suivant. Ces variables doivent être traitées dans la fonction HookMessageProc. L'exemple de code est le suivant :