Принудительный Balloon Tooltip

  • Автор темы HardFlash
  • Дата начала
Статус
Закрыто для дальнейших ответов.
H

HardFlash

Доброго всем времени суток.
Люди подскажите пожалуйсто такую весч.
Наверняка все видели ToolTip выплывающий из Edit'а заточеного под ввод пароля, при попытке ввода чего нибудь с нажатым CapsLock'ом.
В общем возникла необходимость создать подобное на своем эдите...
Класс этото ToolTip'а как и ожидалось tooltips_class32.
Примеров создания непосредственно тултипов под различные объекты масса, собственно с этим делом у меня проблем никогда не было, я попробывал экспериментировать, но никчему что мне нужно не привело.
В общем вопрос: как заставить Balloon ToolTip показваться однократно с задержкой отображения, и не из курсора мыши при наведении и удержании его над объектом, и принудительно конкретно из текстового курсора из эдита...

Вот один из примеров:
Код:
uses 
Commctrl; 

procedure ShowBalloonTip(Control: TWinControl; Icon: integer; Title: pchar; 
Text: PWideChar; 
BackCL, TextCL: TColor); 
const 
TOOLTIPS_CLASS = 'tooltips_class32'; 
TTS_ALWAYSTIP = $01; 
TTS_NOPREFIX = $02; 
TTS_BALLOON = $40; 
TTF_SUBCLASS = $0010; 
TTF_TRANSPARENT = $0100; 
TTF_CENTERTIP = $0002; 
TTM_ADDTOOL = $0400 + 50; 
TTM_SETTITLE = (WM_USER + 32); 
ICC_WIN95_CLASSES = $000000FF; 
type 
TOOLINFO = packed record 
cbSize: Integer; 
uFlags: Integer; 
hwnd: THandle; 
uId: Integer; 
rect: TRect; 
hinst: THandle; 
lpszText: PWideChar; 
lParam: Integer; 
end; 
var 
hWndTip: THandle; 
ti: TOOLINFO; 
hWnd: THandle; 
begin 
hWnd := Control.Handle; 
hWndTip := CreateWindow(TOOLTIPS_CLASS, nil, 
WS_POPUP or TTS_NOPREFIX or TTS_BALLOON or TTS_ALWAYSTIP, 
0, 0, 0, 0, hWnd, 0, HInstance, nil); 
if hWndTip <> 0 then 
begin 
SetWindowPos(hWndTip, HWND_TOPMOST, 0, 0, 0, 0, 
SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE); 
ti.cbSize := SizeOf(ti); 
ti.uFlags := TTF_CENTERTIP or TTF_TRANSPARENT or TTF_SUBCLASS; 
ti.hwnd := hWnd; 
ti.lpszText := Text; 
Windows.GetClientRect(hWnd, ti.rect); 
SendMessage(hWndTip, TTM_SETTIPBKCOLOR, BackCL, 0); 
SendMessage(hWndTip, TTM_SETTIPTEXTCOLOR, TextCL, 0); 
SendMessage(hWndTip, TTM_ADDTOOL, 1, Integer(@ti)); 
SendMessage(hWndTip, TTM_SETTITLE, Icon mod 4, Integer(Title)); 
end; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
ShowBalloonTip(Button1, 1, 'Title', 
'Balloon tooltip,http://kingron.myetang.com; updated by Calin', clBlue, 
clNavy); 
end;


Наверняка есть какая нибудь хитрость...
Заранее спасибо.
 
K

KatrinNight

Здравствуйте. Я понимаю, спустя 4 года Вы уже наверняка знаете ответ, но может кому еще потом пригодится.
1- пример более симпатичен
2 - так как эта подсказка своего рода тоже окно, то чтобы убрать подсказку, нужно "убить" это всплывающее окно - DestroyWindow(hTooltip) - где hTooltip дескриптор разрушаемого окна (имя переменной из "моего" примера). Эту апи-функцию кидайте на то условие, после которого подсказка должна пропадать, у меня таким условием было нажатие Caps Lock
Код:
begin
if GetKeyState(VK_CAPITAL) and 1 = 0 then
begin
DestroyWindow(hTooltip); //если Caps Lock отключен - не отображать подсказку
end
Вот и все премудрости. Надеюсь, что хоть кому-нибудь помогла :gigi:
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!