Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ручное создание BalloonTip для иконки в SystemTray 
:(
    Опции темы
jungle
Дата 14.6.2009, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аппаратный кодер



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 17.1.2006
Где: Беларусь

Репутация: нет
Всего: нет



Пытаюсь реализовать отображение всплывающей подсказки в виде 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, чтобы отобразить подсказку над иконкой в трее?
PM MAIL WWW   Вверх
Keeper89
Дата 14.6.2009, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 14
Всего: 58



Посмотрите вот эту ссылку, мне кажется это то, что вам нужно.


--------------------
PM MAIL WWW   Вверх
CodeMonkey
Дата 14.6.2009, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 16
Всего: 89



Я бы не рекомендовал вообще это делать по нескольким причинам:
1. Ваша программа перестанет работать в следующей версии Windows.
2. ОЧЕНЬ не хорошо идти против пользователя. Если пользователь выключил подсказки - значит он не хочет их видеть. А вы хотите плюнуть свой диалог ему в лицо. По этой причине, кстати, значок в трее не получает уведомление, когда пользователь щёлкает по крестику.
3. Иконки в трее - это тоже плохо. По краней мере их нужно делать отключаемыми или показывать только на время показа подсказки.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
jungle
Дата 14.6.2009, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аппаратный кодер



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 17.1.2006
Где: Беларусь

Репутация: нет
Всего: нет



Видимо, я не совсем внятно сформулировал суть проблемы. Дело в том, что я просто хочу заменить стандартный hint значка в системной панели на tooltip (balloontip). Т.е. при наведении курсора мыши на значок появляется "балунтип". Мне это крайне необходимо, потому что в этом случае повышается информативность и эстетичность всплывающей подсказки. Всё что мне нужно, это каким-то образом получить хэндл значка для передачи в процедуру ShowBalloonTip.
PM MAIL WWW   Вверх
Keeper89
Дата 15.6.2009, 02:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 14
Всего: 58



Посмотрите еще вот это и это, с вашим кодом ничего не получилось.

Это сообщение отредактировал(а) Keeper89 - 15.6.2009, 02:11


--------------------
PM MAIL WWW   Вверх
Romikgy
Дата 15.6.2009, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7325
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



Цитата(jungle @  14.6.2009,  21:38 Найти цитируемый пост)
это каким-то образом получить хэндл значка для передачи

передай хендл основной формы


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Keeper89
Дата 15.6.2009, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 14
Всего: 58



Цитата(Romikgy @  15.6.2009,  10:17 Найти цитируемый пост)
передай хендл основной формы 

Не работает, ни хендл основной формы, ни хендл картинки в трее. У меня, по крайней мере.


--------------------
PM MAIL WWW   Вверх
jungle
Дата 15.6.2009, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аппаратный кодер



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 17.1.2006
Где: Беларусь

Репутация: нет
Всего: нет



Keeper89, спасибо за ссылки! К сожалению, в обоих примерах используется структура NotifyIconData для автоматического создания стандартного "балунтипа". В моём случае необходимо самому создавать окно класса tooltips_class32. Повторюсь, код, который я процитировал выше рабочий, если передать Handle кнопки, например.
PM MAIL WWW   Вверх
Keeper89
Дата 15.6.2009, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 14
Всего: 58



Цитата(jungle @  15.6.2009,  13:20 Найти цитируемый пост)
Повторюсь, код, который я процитировал выше рабочий, если передать Handle кнопки, например. 

Я понял, еще вчера сам попробовал. Но как уже я сказал для трея не работает, ни хендл основной формы, ни хендл картинки в трее, уже весь Интернет перерыл.


--------------------
PM MAIL WWW   Вверх
CodeMonkey
Дата 15.6.2009, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 16
Всего: 89



WM_USER на размышления не наводит?
Зачем вам это нужно? Делать свою программу кривой только по той причине, что балун-подсказка выглядит "красивше" прямоугольника?


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
jungle
Дата 15.6.2009, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аппаратный кодер



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 17.1.2006
Где: Беларусь

Репутация: нет
Всего: нет



Keeper89, в исходниках компонента CoolTrayIcon нашел очень любопытный комментарий в коде функции:

Код

function TCoolTrayIcon.GetClientIconPos(X, Y: Integer): TPoint;
// Return the cursor position inside the tray icon
const
  IconBorder = 1;
//  IconSize = 16;
var
  H: HWND;
  P: TPoint;
  IconSize: Integer;
begin
{ The CoolTrayIcon.Handle property is not the window handle of the tray icon.
  We can find the window handle via WindowFromPoint when the mouse is over
  the tray icon. (It can probably be found via GetWindowLong as well).

  BTW: The parent of the tray icon is the TASKBAR - not the traybar, which
  contains the tray icons and the clock. The traybar seems to be a canvas,
  not a real window (?). }

  // Get the icon size
  IconSize := GetSystemMetrics(SM_CYCAPTION) - 3;

  P.X := X;
  P.Y := Y;
  H := WindowFromPoint(P);
  { Convert current cursor X,Y coordinates to tray client coordinates.
    Add borders to tray icon size in the calculations. }
  Windows.ScreenToClient(H, P);
  P.X := (P.X mod ((IconBorder*2)+IconSize)) -1;
  P.Y := (P.Y mod ((IconBorder*2)+IconSize)) -1;
  Result := P;
end;

PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

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

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1509 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.