Fuente del artículo: Internet Autor: ggg82/CSDN
Hoy en día, muchas interfaces de usuario utilizan barras de herramientas para crear barras de menú. Recientemente me interesé en esto y pedí ayuda en línea. Sin embargo, la mayor parte de la ayuda que recibí fue el código fuente de BCGControlBar o el código fuente de SizableRebar. su propia interfaz para tener esto. Para amigos funcionales, esta puede ser una buena opción, simplemente mire la demostración y luego llame directamente a las bibliotecas de clases de otras personas, pero para lectores como yo que están interesados en este tema y esperan comprender los entresijos. , Mirando directamente estos códigos fuente sin una explicación detallada, no es fácil descubrir el motivo, al menos para un novato como yo. Por esta razón, este artículo espera ayudar a las personas que todavía están buscando la ayuda que los lectores puedan brindar. algo de ayuda.
Miremos y hablemos a continuación:
Cuando recibimos el mensaje de presionar el botón de la barra de herramientas, generalmente usamos TrackPopupMenuEx para abrir el menú. La clave del problema es que cuando el menú no está cerrado, TrackPopupMenuEx no regresa e intercepta los mensajes del mouse y el teclado. barra de herramientas en este momento Si no se recibe ningún mensaje, por supuesto no hay forma de cambiar el punto de acceso. Esto requiere que detectemos la posición del mouse nosotros mismos y cierremos el menú anterior y muestremos el siguiente menú cuando el mouse se mueva al siguiente punto de acceso. Aquí usamos la función de enlace SetWindowsHookEx para instalar el enlace WH_MSGFILTER antes de llamar a TrackPupupMenuEx. El código es el siguiente:
m_hMsgHook = SetWindowsHookEx( WH_MSGFILTER, MessageProc, 0, GetCurrentThreadId() );
MssageProc es una función de enlace, el código es el siguiente:
anular TrackPopup (HWND hWndToolBar, int iButton)
{
mientras (iBotón >= 0)
{
EnviarMensaje(hWndToolBar,TB_SETHOTITEM,iButton,0);
iPopup = iBotón;
//Instalar gancho
g_hMsgHook = SetWindowsHookEx(WH_MSGFILTER, MessageProc, 0, GetCurrentThreadId());
//Menú emergente
TrackPopupMenuEx(…);
//Desinstalar gancho
DesengancharWindowsHookEx(g_hMsgHook);
iButton = iNextPop; // El siguiente elemento emergente, si es negativo, salga
}
EnviarMensaje(hWndToolBar,TB_SETHOTITEM,-1,0);
}
(Experiencia y sugerencias: si el botón usa el estilo TBSTYLE_DROPDOWN, no llame a la función directamente en el mensaje TBN_DROPDOWN. Debe usar un mensaje intermedio y luego usar PostMessa para enviar el mensaje para que TBN_DROPDOWN pueda regresar directamente; de lo contrario, el primero El punto de acceso resaltado será eliminado. Es muy problemático).
iPopup es el elemento emergente actual y iNextPop es el siguiente elemento emergente. Estas variables deben procesarse en la función HookMessageProc. El código de muestra es el siguiente.