ОБСУЖДЕНИЕ

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

1 ответов 8,8 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Статус
Закрыто для дальнейших ответов.
Автор темы
Доброго всем времени суток.
Люди подскажите пожалуйсто такую весч.
Наверняка все видели 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;


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