Fonte do artigo: Internet Autor: ggg82/CSDN
Hoje em dia, muitas interfaces de usuário usam barras de ferramentas para criar barras de menu. Recentemente, me interessei por isso e pedi ajuda online. Porém, a maior parte da ajuda que recebi foi o código-fonte do BCGControlBar ou o código-fonte do SizableRebar. interface própria para ter isso. Para quem é amigo funcional, essa pode ser uma boa escolha. Basta dar uma olhada na demonstração e depois. Em seguida, basta ligar diretamente para as bibliotecas de classes de outras pessoas, mas para leitores como nós que estão interessados neste tópico e esperam entender os detalhes, devemos olhar diretamente para esses códigos-fonte sem explicações detalhadas e descobrir o motivo deles. fácil, pelo menos para um novato como eu. Por esse motivo, espero que este artigo possa ajudar os leitores que ainda procuram ajuda.
Vamos assistir e conversar abaixo:
Ao receber a mensagem de pressionar o botão da barra de ferramentas, geralmente usamos TrackPopupMenuEx para abrir o menu. A chave do problema é que quando o menu não está fechado, TrackPopupMenuEx não retorna e intercepta mensagens do mouse e do teclado. barra de ferramentas neste momento Se nenhuma mensagem for recebida, é claro que não há como alterar o ponto de acesso. Isso exige que detectemos a posição do mouse e fechemos o menu anterior e exibamos o próximo menu quando o mouse se mover para o próximo ponto de acesso. Aqui usamos a função de gancho SetWindowsHookEx para instalar o gancho WH_MSGFILTER antes de chamar TrackPupupMenuEx.
m_hMsgHook = SetWindowsHookEx(WH_MSGFILTER, MessageProc, 0, GetCurrentThreadId());
MssageProc é uma função de gancho, o código é o seguinte:
void TrackPopup (HWND hWndToolBar, int iButton)
{
enquanto (iButton >= 0)
{
SendMessage(hWndToolBar,TB_SETHOTITEM,iButton,0);
iPopup = iButton;
//Instalar o gancho
g_hMsgHook = SetWindowsHookEx(WH_MSGFILTER, MessageProc, 0, GetCurrentThreadId());
//Menu pop-up
TrackPopupMenuEx(…);
//Desinstala o gancho
DesengancharWindowsHookEx(g_hMsgHook);
iButton = iNextPop; //O próximo item pop-up, se for negativo, sai
}
EnviarMensagem(hWndToolBar,TB_SETHOTITEM,-1,0);
}
(Experiência e sugestões: Se o botão usa o estilo TBSTYLE_DROPDOWN, por favor não chame a função diretamente na mensagem TBN_DROPDOWN. Você deve usar uma mensagem intermediária e depois usar PostMessa para enviar a mensagem para que TBN_DROPDOWN possa retornar diretamente, caso contrário, o primeiro o ponto de acesso destacado será eliminado. É muito problemático.)
iPopup é o item pop-up atual e iNextPop é o próximo item pop-up. Essas variáveis precisam ser processadas na função HookMessageProc.