E-Zine Exclusivo para o Whastapp

Delphi: Como mostrar Menu Item Hints

delphi Delphi: Como mostrar Menu Item Hints
foto_ramos Delphi: Como mostrar Menu Item Hints

Ramos de Souza Janones

Janones, é um empreendedor brasileiro apaixonado por empreendedorismo e tecnologia. Ao longo dos anos trabalhando com o desenvolvimento de softwares desktop desde a linguagem Clipper, passando pelo Delphi e atualmente com Java.

Optou pela formação de Publicidade e Marketing por sua segunda empresa de tecnologia ter participado do "boom" da internet nos anos 90 e na procura de melhorar seus conhecimentos em negócios.

Em razão da principal formação e profundos conhecimentos em programação e banco de dados, é capaz de realizar o desenvolvimento de aplicativos web, desktop e mobile com maior criatividade e inovação que profissionais de desenvolvimento com uma formação única e mais especifica, dedicada somente ao desenvolvimento de softwares.

Com toda sua experiência com empresas de software, sua formação e paixão por negócios escreveu o livro "Marketing para Empresas e Profissionais de Software", publicado pela editora carioca Ciência Moderna em 2012. Além de outros livros sobre programação.
foto_ramos Delphi: Como mostrar Menu Item Hints

Quando o mouse está sobre um componente (um TButton, por exemplo) se a propriedade ShowHint é True e se houver algum texto na propriedade Hint, o hint/tooltip será mostrado para o componente.

Hints para itens de menu?

Por projeto, mesmo se você colocar algo na propriedade Hint de um Menu Item o popup hint não será exibido. No entanto, os Itens do menu Iniciar do Windows mostram hints, e o menu dos Favoritos do Internet Explorer também.

É comum usar o evento OnHint nas variáveis globais da aplicação, nas aplicações Delphi, para mostrar os hints do menu como uma barra de status.

O Windows não expõe as mensagens necessárias que suportem o evento tradicional OnMouseEnter. No entanto, a implementação do WM_MENUSELECT no TCustomForm (ancestral do TForm) tem o item hint de menu no Application.Hint que pode ser usado no evento Application.OnHint.

Se você quer adicionar itens de menu com popup hints nos menus de sua aplicação Delphi você precisa “somente” apontar a mensagem WM_MenuSelect corretamente.

A classe TMenuItemHint – hints popup para itens de menu!

Como não podemos depender do método Application.ActivateHint para mostrar a janela para os itens de menu (o apontamento de menus é feito totalmente pelo Windows), para obter a janela de hint exibida você precisa criar sua própria versão da janela hint – derivando uma nova classe a partir de THintWindow.

Segue como criar a classe TMenuItemHint – uma janela hint que realmente é exibida nos itens de menu.

Primeiro você precisa apontar a mensagem WM_MENUSELECT do Windows:
type
TForm1 = class(TForm)

private
procedure WMMenuSelect(var Msg: TWMMenuSelect) ; message WM_MENUSELECT;
end

implementation

procedure TForm1.WMMenuSelect
(var Msg: TWMMenuSelect) ;
var
menuItem : TMenuItem;
hSubMenu : HMENU;
begin
inherited; // from TCustomForm
//(so that Application.Hint is assigned)

menuItem := nil;
if (Msg.MenuFlag <> $FFFF) or
(Msg.IDItem <> 0) then
begin
if Msg.MenuFlag and MF_POPUP = MF_POPUP then
begin
hSubMenu := GetSubMenu
(Msg.Menu, Msg.IDItem) ;
menuItem := Self.Menu.FindItem
(hSubMenu, fkHandle) ;
end
else
begin
menuItem := Self.Menu.FindItem
(Msg.IDItem, fkCommand) ;
end;
end;
miHint.DoActivateHint(menuItem) ;
end; (WMMenuSelect)

A mensagem WM_MENUSELECT é enviada à janela proprietária do menu (Form 1) quando o usuário seleciona (não quando clica) um item de menu. Usando o método FindItem da classe TMenu, você consegue pegar o item de menu que está selecionado no momento. Os parâmetros da função FindItem relatam as propriedades que a mensagem recebeu. Uma vez que você saiba qual o item de menu sobre qual está o mouse, chamaremos o método DoActivateHint da classe TMenuItemHint. Observe que a variável miHint é definida como “var miHint : TMenuItemHint” e é criada no evento OnCreate do Form.

Agora vamos fazer a implementação da classe TMenuItemHint.

Aqui está a parte da interface:

TMenuItemHint = class(THintWindow)
private
activeMenuItem : TMenuItem;
showTimer : TTimer;
hideTimer : TTimer;
procedure HideTime(Sender : TObject) ;
procedure ShowTime(Sender : TObject) ;
public
constructor Create
(AOwner : TComponent) ; override;
procedure DoActivateHint
(menuItem : TMenuItem) ;
destructor Destroy; override;

end;

Você pode ver toda a implementação no projeto exemplo.

Basicamente, a função DoActivateHint chama o método ActivateHint do THintWindow usando a propriedade Hint do TMenuItem (se estiver atribuída).

O showTimer é usado para se ter certeza que o HintPause (do Application) transcorre antes do hint ser mostrado.
O hideTimer usa o Application.HintHidePause para esconder a janela do hint após um intervalo específico.

Quando usar os hints nos itens do menu?
Enquanto alguns podem dizer que não é uma boa coisa mostrar hints nos itens de menu, há situações que mostrar hints no menu é muito melhor do que mostrar uma barra de status.

Segue o código fonte do Form, com a implementação da classe TMenuItemHint.

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants,
Classes, Graphics,  Controls, Forms,
Dialogs, Menus, AppEvnts, StdCtrls,
ExtCtrls, ComCtrls;

type
TMenuItemHint = class(THintWindow)
private
activeMenuItem : TMenuItem;
showTimer : TTimer;
hideTimer : TTimer;
procedure HideTime(Sender : TObject) ;
procedure ShowTime(Sender : TObject) ;
public
constructor Create
(AOwner : TComponent) ; override;
procedure DoActivateHint
(menuItem : TMenuItem) ;
destructor Destroy; override;
end;

TForm1 = class(TForm)

procedure FormCreate(Sender: TObject) ;
procedure ApplicationEvents1Hint
(Sender: TObject) ;
private
miHint : TMenuItemHint;
procedure WMMenuSelect
(var Msg: TWMMenuSelect) ;
message WM_MENUSELECT;
end;

var
Form1: TForm1;

implementation
{$R *.dfm}

procedure TForm1.FormCreate
(Sender: TObject) ;
begin
miHint := TMenuItemHint.Create(self) ;
end; (FormCreate)

procedure TForm1.ApplicationEvents1Hint
(Sender: TObject) ;
begin
StatusBar1.SimpleText := ‘App.OnHint :
‘ + Application.Hint;
end; (Application.OnHint)

procedure TForm1.WMMenuSelect
(var Msg: TWMMenuSelect) ;
var
menuItem : TMenuItem;
hSubMenu : HMENU;
begin
inherited; // TCustomForm
// (se certifica que o Application.Hint
// é atribuído)

menuItem := nil;
if (Msg.MenuFlag <> $FFFF) or (Msg.IDItem <> 0) then
begin
if Msg.MenuFlag and MF_POPUP = MF_POPUP then
begin
hSubMenu := GetSubMenu
(Msg.Menu, Msg.IDItem) ;
menuItem := Self.Menu.FindItem
(hSubMenu, fkHandle) ;
end
else
begin
menuItem := Self.Menu.FindItem
(Msg.IDItem, fkCommand) ;
end;
end;

miHint.DoActivateHint(menuItem) ;
end; (WMMenuSelect)

{ TMenuItemHint }
constructor TMenuItemHint.Create
(AOwner: TComponent) ;
begin
inherited;

showTimer := TTimer.Create(self) ;
showTimer.Interval := Application.
HintPause;

hideTimer := TTimer.Create(self) ;
hideTimer.Interval := Application.
HintHidePause;
end; (Create)

destructor TMenuItemHint.Destroy;
begin
hideTimer.OnTimer := nil;
showTimer.OnTimer := nil;
self.ReleaseHandle;
inherited;
end; (Destroy)

procedure TMenuItemHint.DoActivateHint
(menuItem: TMenuItem) ;
begin
//força a remoção da velha janela
//do hint
hideTime(self) ;

if (menuItem = nil) or
(menuItem.Hint = ‘’) then
begin
activeMenuItem := nil;
Exit;
end;

activeMenuItem := menuItem;

showTimer.OnTimer := ShowTime;
hideTimer.OnTimer := HideTime;
end; (DoActivateHint)

procedure TMenuItemHint.ShowTime
(Sender: TObject) ;
var
r : TRect;
wdth : integer;
hght : integer;
begin
if activeMenuItem <> nil then
begin
//position and resize
wdth := Canvas.TextWidth
(activeMenuItem.Hint) ;
hght := Canvas.TextHeight
(activeMenuItem.Hint) ;

r.Left := Mouse.CursorPos.X + 16;

r.Top := Mouse.CursorPos.Y + 16;
r.Right := r.Left + wdth + 6;
r.Bottom := r.Top + hght + 4;

ActivateHint(r,activeMenuItem.Hint) ;
end;

showTimer.OnTimer := nil;
end; (ShowTime)

procedure TMenuItemHint.HideTime(Sender: TObject) ;
begin
//esconde (destroy) a janela hint
self.ReleaseHandle;
hideTimer.OnTimer := nil;
end; (HideTime)

end

Top
%d blogueiros gostam disto: