Пытаюсь реализовать отображение всплывающей подсказки в виде BalloonTip для иконки в системном трее. Для этого я не прибегаю к расширенной структуре TNotifyIconData, а использую ручное создание tooltip-окна. Это гарантирует мне отображение подсказки даже в том случае, если её показ блокируется через параметр в реестре.
В Интернете достаточно материала на тему создания balloontip-ов для контролов – кнопок, едитбоксов и т.д., но нет для иконок в системном трее.
Для ручного создания balloontip-а использую распространенный код:
| Код | procedure ShowBalloonTip(CtrlHandle: HWND; Icon: integer; Title: pchar; Text: PWideChar; BackCL, TextCL: TColor); const TTS_ALWAYSTIP = $01; TTS_BALLOON = $40; TTF_SUBCLASS = $0010; TTF_TRANSPARENT = $0100; 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 := CtrlHandle; hWndTip := CreateWindowEx(WS_EX_TOPMOST,'tooltips_class32', 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 ti.cbSize := SizeOf(ti); ti.uFlags := TTF_TRANSPARENT or TTF_SUBCLASS; ti.hwnd := hWnd; ti.lpszText := Text; // Windows.GetClientRect(hWnd, ti.rect); ti.rect:=Rect(0,0,16,16); 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;
|
Подскажите, какой хэндл передать в процедуру ShowBalloonTip в качестве параметра CtrlHandle, чтобы отобразить подсказку над иконкой в трее? |