Vida

Cómo mostrar sugerencias de elementos de menú en aplicaciones de Delphi

Cómo mostrar sugerencias de elementos de menú en aplicaciones de Delphi

Use un lenguaje de codificación específico para programar las aplicaciones de Delphi para mostrar una sugerencia, o información sobre herramientas, cuando el mouse se desplaza sobre un componente del menú. Si la propiedad "ShowHint" está establecida en "true" y agrega texto a la propiedad "pista", este mensaje se mostrará cuando el mouse se coloque sobre el componente (un TButton, por ejemplo).

Habilitar sugerencias para elementos de menú

Debido a la forma en que está diseñado Windows, incluso si establece el valor de la propiedad de sugerencia en un elemento del menú, la sugerencia emergente no se mostrará. Sin embargo, los elementos del menú de inicio de Windows muestran sugerencias. El menú de favoritos en Internet Explorer también muestra sugerencias de elementos de menú.

Es posible utilizar el evento OnHint de la variable de aplicación global en aplicaciones Delphi para mostrar sugerencias de elementos de menú en una barra de estado.

Windows no expone los mensajes necesarios para admitir un evento OnMouseEnter tradicional. Sin embargo, el mensaje WM_MENUSELECT se envía cuando el usuario selecciona un elemento del menú.

La implementación WM_MENUSELECT del TCustomForm (antepasado del TForm) establece la sugerencia del elemento del menú en "Application.Hint" para que pueda usarse en el evento Application.OnHint.

Si desea agregar sugerencias emergentes de elementos de menú (información sobre herramientas) a los menús de su aplicación Delphi, concéntrese en el mensaje WM_MenuSelect.

Sugerencias emergentes

Dado que no puede confiar en el método Application.ActivateHint para mostrar la ventana de sugerencias para los elementos del menú (dado que Windows maneja completamente el menú), para que se muestre la ventana de sugerencias debe crear su propia versión de la ventana de sugerencias derivando una nueva clase de "THintWindow".

Aquí se explica cómo crear una clase TMenuItemHint. ¡Esta es una pista de viuda que en realidad se muestra para los elementos del menú!

Primero, debe manejar el mensaje WM_MENUSELECT de Windows:

tipo
TForm1 = clase(TForm)

privado
procedimiento WMMenuSelect (var Msg: TWMMenuSelect); mensaje WM_MENUSELECT;
fin
implementación

procedimiento
TForm1.WMMenuSelect (var Msg: TWMMenuSelect);
var
menuItem: TMenuItem; hSubMenu: HMENU;
empezar

heredado; // de TCustomForm (para que se asigne Application.Hint)
menuItem: = nulo;
Si (Msg.MenuFlag $ FFFF) o (Msg.IDItem 0) luego
empezar
Si Msg.MenuFlag y MF_POPUP = MF_POPUP luego
empezar
hSubMenu: = GetSubMenu (Msg.Menu, Msg.IDItem);
menuItem: = Self.Menu.FindItem (hSubMenu, fkHandle);
fin
más
empezar
menuItem: = Self.Menu.FindItem (Msg.IDItem, fkCommand);
fin;
fin; miHint.DoActivateHint (menuItem);
fin
; (* WMMenuSelect *)

Información rápida: el mensaje WM_MENUSELECT se envía a la ventana del propietario del menú cuando el usuario selecciona (pero no hace clic) un elemento del menú. Usando el método FindItem de la clase TMenu, puede obtener el elemento de menú actualmente seleccionado. Los parámetros de la función FindItem se relacionan con las propiedades del mensaje recibido. Una vez que sabemos qué elemento del menú está sobre el mouse, llamamos al método DoActivateHint de la clase TMenuItemHint. La variable miHint se define como "var miHint: TMenuItemHint" y se crea en el controlador de eventos OnCreate del formulario.

Ahora, lo que queda es la implementación de la clase TMenuItemHint.

Aquí está la parte de la interfaz:

TMenuItemHint = clase(THintWindow)
privado

activeMenuItem: TMenuItem;
showTimer: TTimer;
hideTimer: TTimer;
procedimiento HideTime (remitente: TObject);
procedimiento ShowTime (remitente: TObject);
público

constructor Crear (AOwner: TComponent); anular;
procedimiento DoActivateHint (menuItem: TMenuItem);
incinerador de basuras Destruir; anular;
fin
;

Básicamente, la función DoActivateHint llama al método ActivateHint de THintWindow utilizando la propiedad Hint de TMenuItem (si está asignada). ShowTimer se utiliza para garantizar que la sugerencia de pausa de la aplicación transcurra antes de que se muestre la sugerencia. HideTimer usa Application.HintHidePause para ocultar la ventana de sugerencias después de un intervalo especificado.

Uso de sugerencias de elementos de menú

Si bien algunos podrían decir que no es un buen diseño mostrar sugerencias para los elementos del menú, hay situaciones en las que mostrar sugerencias de elementos del menú es mucho mejor que usar una barra de estado. La lista de elementos de menú utilizada más recientemente (MRU) es uno de esos casos. Un menú de barra de tareas personalizado es otro.