Sábado, Janeiro 15, 2005

Dicas balão para componentes

Uma outra maneira de criar uma dica balão para os componentes é criar uma janela do tipo Tooltips_Class32 e atribuí-la ao componente desejado, usando a mensagem TTM_ADDTOOL. A criação desta janela de dica é feita com a função CriaTooltip:


function CriaToolTip(WndParent: HWnd;
TipoIcone : Integer; Titulo : PChar) : HWND;
begin
// Cria a janela balão
Result := CreateWindowEx(0, 'Tooltips_Class32', nil,
TTS_ALWAYSTIP or TTS_BALLOON, Integer(CW_USEDEFAULT),
Integer(CW_USEDEFAULT),Integer(CW_USEDEFAULT),
Integer(CW_USEDEFAULT), WndParent, 0, hInstance, nil);
// Traz a janela para a frente
if Result <> 0 then begin
SetWindowPos(Result, HWND_TOPMOST, 0, 0, 0, 0,
SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE);
// Configura o título e ícone da dica
if (TipoIcone > 3) or (TipoIcone < 0) then
TipoIcone:= 0;
SendMessage(Result, TTM_SETTITLE, TipoIcone,
Integer(Titulo));
end;
end;

Para atribuir a janela de dica a um componente, usamos a função AdicionaToolTip:

procedure AdicionaToolTip(Window, ToolTip: HWND;
Texto: PChar);
var
Rect: TRect;
ti: TToolInfo;
begin
if (Window <> 0) then begin
GetClientRect(Window, Rect);
// Preenche a estrutura TToolInfo
FillChar(Ti,Sizeof(TToolInfo),0);
ti.cbSize := SizeOf(TToolInfo);
ti.uFlags := TTF_SUBCLASS;
ti.hInst := hInstance;
ti.hwnd := Window;
ti.Rect := Rect;
ti.lpszText := Texto;
// Atribui a dica
SendMessage(ToolTip, TTM_ADDTOOL, 0, Integer(@ti));
end;
end;

O código para criar e atribuir a dica balão é:

procedure TForm1.FormCreate(Sender: TObject);
var
ToolTip : HWND;
begin
ToolTip := CriaToolTip(Form1.Handle, 1, PChar(Application.Title));
AdicionaToolTip(Memo1.Handle, ToolTip, 'Texto da dica');
AdicionaToolTip(Listbox1.Handle, ToolTip, 'Dica da ListBox');
end;

Note que, embora o texto da dica pode ser atribuído à dica relativa ao componente, o título é atribuído à janela da dica. Assim, se criamos apenas uma janela de dica, usando-a para todos os componentes, teremos apenas um título. Se quisermos títulos diferentes para cada dica, devemos criar novas janelas de dica com CriaToolTip.

Mostrando dicas balão para caixas de edição em Windows XP

Para mostrar uma dica balão para uma caixa de edição, devemos mandar uma mensagem EM_SHOWBALLOONTIP para ela. O texto, título e ícone da dica são mandados prenchendo um record do tipo TEditBalloonTip, definida como



TEditBalloonTip = packed record
cbStruct: DWORD ;
pszTitle: LPCWSTR ;
pszText: LPCWSTR;
ttiIcon: Integer;
end;

Uma vez preenchido record, passamos como o terceiro parâmetro para a função SendMessageW:


procedure ShowBalloonTip(Window : HWnd;
Texto, Titulo : PWideChar;Tipo : Integer);
var
EditBalloonTip : TEditBalloonTip;
begin
EditBalloonTip.cbStruct := SizeOf(TEditBalloonTip);
EditBalloonTip.pszText := Texto;
EditBalloonTip.pszTitle := Titulo;
EditBalloonTip.ttiIcon := Tipo;
SendMessageW(Window, EM_SHOWBALLOONTIP, 0,
Integer(@EditBalloonTip));
end;

O código completo das funções que mostram e escondem a dica é o seguinte:


TEditBalloonTip = packed record
cbStruct: DWORD ;
pszTitle: LPCWSTR ;
pszText: LPCWSTR;
ttiIcon: Integer;
end;

const
ECM_FIRST = $1500;
EM_SHOWBALLOONTIP = (ECM_FIRST + 3);
EM_HIDEBALLOONTIP = (ECM_FIRST + 4);
TTI_NONE = 0;
TTI_INFO = 1;
TTI_WARNING = 2;
TTI_ERROR = 3;

var
Form1: TForm1;

implementation

{$R *.dfm}


procedure ShowBalloonTip(Window : HWnd;
Texto, Titulo : PWideChar;Tipo : Integer);
var
EditBalloonTip : TEditBalloonTip;
begin
EditBalloonTip.cbStruct := SizeOf(TEditBalloonTip);
EditBalloonTip.pszText := Texto;
EditBalloonTip.pszTitle := Titulo;
EditBalloonTip.ttiIcon := Tipo;
SendMessageW(Window, EM_SHOWBALLOONTIP, 0,
Integer(@EditBalloonTip));
end;

procedure HideBalloonTip(Window : HWnd);
begin
SendMessageW(Window, EM_HIDEBALLOONTIP, 0, 0)
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowBalloonTip(Edit1.Handle,'Texto a ser mostrado',
'Título da janela',TTI_INFO);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
HideBalloonTip(Edit1.Handle);
end;

Nota: Esta dica só funciona com os estilos do XP ativados. Assim, você precisa colocar um componente TXpManifest na sua Form.


Sexta-feira, Janeiro 14, 2005

Ícones na barra de tarefas em .NET

Vocês se lembram da complicação para colocar um ícone na barra de tarefas, ao lado do relógio, em Win32? Pois isso é coisa do passado em .NET.
Para colocar um ícone ao lado do relógio, basta adicionar um componente NotifyIcon, categoria Components, um componente ContextMenu, da mesma categoria, configurar o menu de contexto, colocando suas opções e o código do evento Click das opções e configurar a propriedade ContextMenu do NotifyIcon, além de configurar as propriedades Icon e Visible.
Pronto. Fácil, não?