Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Балун в трее  (Прочитано 52975 раз)
0 Пользователей и 1 Гость смотрят эту тему.
BlackStar
Постоялец

ua
Offline Offline
Пол: Мужской

WWW
« : 19-06-2008 11:04 » 

Коллеги, подскажите, пожалуйста, как можно показать балун на иконке в трее?
Я использую TTrayIcon и всё бы ничего, но никак не могу заставить балун появиться именно относительно этой моей иконки — он постоянно появляется рядом! 
Вот как я это делаю:
Код:
NOTIFYICONDATA nid = { 0 };

nid.cbSize = sizeof( NOTIFYICONDATA );
nid.dwInfoFlags = NIIF_ERROR;
nid.hIcon = NULL; // я не знаю как получить хендл иконки в трее. TTrayIcon использует TImageList
nid.hWnd = this->Handle; // Хэндл основного окна
nid.uID = 0; // Я так и не понял толком что это такое. Мне кажется, что это TTrayIcon->IconIndex...
strcpy( nid.szInfo, "balloon text" );
strcpy( nid.szInfoTitle, "balloon title" );
strcpy( nid.szTip, "tip text" );
//nid.uCallbackMessage = WM_USER + 10;
nid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE | NIF_INFO;
nid.uTimeout = 15000;
Shell_NotifyIcon( NIM_ADD, &nid );

Очень надеюсь на вашу помощь.

ЗЫ: Я использую Builder 6
« Последнее редактирование: 20-06-2008 12:22 от HempStar » Записан

Программирование на заказ   C/C++, Delphi, PHP, javascript
marat_
Шеф-повар
Опытный

ru
Offline Offline

« Ответ #1 : 19-06-2008 11:05 » 

у меня так вообще ничего не появлялось... замучился. потом бросил.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 19-06-2008 11:06 » 

HempStar, в разделе FAQ по Visual C++ есть , как это сделать, я лично вписывал )
ищи по слову BALOON
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 19-06-2008 11:08 » 

тут или тут -
https://forum.shelek.ru/index.php/topic,11802.0/wap2.html

https://forum.shelek.ru/index.php/topic,11731.0/wap2.html

я щас не могу искать (
Записан

marat_
Шеф-повар
Опытный

ru
Offline Offline

« Ответ #4 : 19-06-2008 11:09 » 

HempStar, классно... твой код заработал. только с дополнительным местом. в первый раз такое вижу...
Записан
marat_
Шеф-повар
Опытный

ru
Offline Offline

« Ответ #5 : 19-06-2008 11:10 » 

Алексей1153++, а в Visual C++ у меня, например, работало. в билдере нет.
Записан
BlackStar
Постоялец

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 19-06-2008 11:12 » 

Но при чем здесь Visual С++ ?!  Там немного по-другому это сделано. Мне бы для билдера... К тому же, балун-то появляется, но не в том месте, где нужно. Я думаю, что проблема решается как-то совсем просто.
Если вы знаете ответ, то, я вас умоляю, напишите его здесь да и всё, а то я уже полдня разнообразные факи перелопачиваю и, поверьте, еще ни один не помог.
« Последнее редактирование: 19-06-2008 11:32 от HempStar » Записан

Программирование на заказ   C/C++, Delphi, PHP, javascript
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 19-06-2008 11:14 » 

HempStar, какая разница - вижуал, не вижуал )) Ты вначале прочитай там. Вечером гляну, если что
Записан

marat_
Шеф-повар
Опытный

ru
Offline Offline

« Ответ #8 : 19-06-2008 11:17 » 

HempStar, надо как-то хендл получить
Записан
BlackStar
Постоялец

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 19-06-2008 11:25 » 

Алексей1153++, да есть разница, в том-то и дело Жаль  Взять хотя бы тот же LoadIcon() - я, например, не в курсе как его использовать в билдере. К тому же, я бы не хотел делать в коде новые обработчики и прочие изменения - TrayIcon меня, в общем-то, полностью пока устраивает, не хватает только нормального балуна.

marat_, похоже на то, но, вместе с ним, возможно нужно что-то еще, типа, NIM_ADD сменить на NIM_MODIFY или еще что-то подобное...
И какой хендл получить нужно??? TrayIcon? Я пытался - у меня не получилось :'(
« Последнее редактирование: 19-06-2008 11:29 от HempStar » Записан

Программирование на заказ   C/C++, Delphi, PHP, javascript
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 19-06-2008 11:35 » 

HempStar, нету разницы в этом случае:
Код:
HICON LoadIcon(          HINSTANCE hInstance,
    LPCTSTR lpIconName
);
Parameters

hInstance
[in] Handle to an instance of the module whose executable file contains the icon to be loaded. This parameter must be NULL when a standard icon is being loaded.
lpIconName
[in]
Pointer to a null-terminated string that contains the name of the icon resource to be loaded. Alternatively, this parameter can contain the resource identifier in the low-order word and zero in the high-order word. Use the MAKEINTRESOURCE macro to create this value.

To use one of the predefined icons, set the hInstance parameter to NULL and the lpIconName parameter to one of the following values.

IDI_APPLICATION
Default application icon.
IDI_ASTERISK
Same as IDI_INFORMATION.
IDI_ERROR
Hand-shaped icon.
IDI_EXCLAMATION
Same as IDI_WARNING.
IDI_HAND
Same as IDI_ERROR.
IDI_INFORMATION
Asterisk icon.
IDI_QUESTION
Question mark icon.
IDI_WARNING
Exclamation point icon.
IDI_WINLOGO
Windows logo icon. Windows XP: Default application icon.
Return Value

If the function succeeds, the return value is a handle to the newly loaded icon.

If the function fails, the return value is NULL. To get extended error information, call GetLastError.

а для балона нужно флаг указать

кстати, не для трея я делал, хм, но может поможет:
Код:
m_ToolTip.Create(this,0x40); //TTS_BALLOON==0x40

там имеется недокументированный флаг свойств баллона - 0x40
Записан

BlackStar
Постоялец

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 19-06-2008 11:42 » 

Очень интересно. А как мне получить HINSTANCE программы? Да и имени иконки в Билдере не предусмотрено!

И что за тип у m_ToolTip? Это контрол какой-то?
« Последнее редактирование: 19-06-2008 11:48 от HempStar » Записан

Программирование на заказ   C/C++, Delphi, PHP, javascript
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 19-06-2008 11:54 » 

HempStar, сейчас не могу покопаться (( Вечером пороюсь, а сейчас я бесполезен )))
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #13 : 19-06-2008 18:07 » new

порылся я в мсдн, тоже только прямоугольного баллона добился, облако не даётся никак ...
Записан

BlackStar
Постоялец

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 20-06-2008 10:07 » 

Да черт с ним с облаком! Мне любой сойдет, лишь бы над моей иконкой в трее появлялся.
Записан

Программирование на заказ   C/C++, Delphi, PHP, javascript
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #15 : 20-06-2008 10:32 » 

так прямоугольный то без проблем появляется:

Код:
	NOTIFYICONDATA ndata=
{
sizeof(NOTIFYICONDATA),
m_hWnd, //хендл окна для отлова сообщений
e_tray_puttotray_ID,  //==1000
NIF_ICON|NIF_MESSAGE|NIF_TIP,
WM_COMMAND,
::AfxGetApp()->LoadIcon(IDR_MAINFRAME), //как в билдере не знаю
"текст тултипа"
};

Shell_NotifyIcon(NIM_ADD,&ndata);
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #16 : 20-06-2008 10:34 » 

кстати, можно поймать движение мыши по иконке в трее , определить координаты курсора и нарисовать какой угодно свой тултип - произведённых, скажем, от встроенного тултипа
Записан

marat_
Шеф-повар
Опытный

ru
Offline Offline

« Ответ #17 : 20-06-2008 12:00 » 

Алексей1153++, в билдере или вообще не появляется, или не там, где надо.
нам бы твои проблемы...
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #18 : 20-06-2008 14:37 » 

marat_, а какие у меня проблемы, которые тебе бы ? ))
Записан

marat_
Шеф-повар
Опытный

ru
Offline Offline

« Ответ #19 : 20-06-2008 22:39 » 

Алексей1153++, с облаком)))
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #20 : 20-06-2008 22:40 » 

marat_, да нет у меня проблем с облаком, они все у HempStar )
Записан

marat_
Шеф-повар
Опытный

ru
Offline Offline

« Ответ #21 : 20-06-2008 22:42 » 

Алексей1153++, а как же 14 пост?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #22 : 21-06-2008 06:18 » 

marat_, 14 - это твой Улыбаюсь

а 13-й - это обращение к HempStar
Записан

marat_
Шеф-повар
Опытный

ru
Offline Offline

« Ответ #23 : 21-06-2008 07:42 » 

Алексей1153++, ты опять из вапа?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #24 : 21-06-2008 07:46 » 

marat_, нет , значок то посмотри у поста какой )
Записан

marat_
Шеф-повар
Опытный

ru
Offline Offline

« Ответ #25 : 21-06-2008 08:32 » 

Алексей1153++,

HempStar
Участник
Offline
Re: Балун в трее
« Ответ #14 : Вчера в 11:07 »  Цитировать 
--------------------------------------------------------------------------------
Да черт с ним с облаком! Мне любой сойдет, лишь бы над моей иконкой в трее появлялся.

вот, что вижу я


 
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #26 : 21-06-2008 16:14 » 

marat_, странно, может я ник попутал - тогда пост не твой, но и не мой тоже

в общем - проблема то не у меня, а у него
Записан

BlackStar
Постоялец

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #27 : 23-06-2008 09:31 » 

Ну вы и нафлудили Улыбаюсь
в общем, я так понимаю, что в шестом билдере эта проблема не рашаема. Примеры из вижуал студии, к сожаленью, помочь ничем не могут - ну не VCL это. Попробую поискать какой-нибудь кастомный компонент. Всем спасибо за дискуссию.
Записан

Программирование на заказ   C/C++, Delphi, PHP, javascript
zubr
Гость
« Ответ #28 : 23-06-2008 19:19 » 

Ну вы и нафлудили Улыбаюсь
в общем, я так понимаю, что в шестом билдере эта проблема не рашаема. Примеры из вижуал студии, к сожаленью, помочь ничем не могут - ну не VCL это. Попробую поискать какой-нибудь кастомный компонент. Всем спасибо за дискуссию.
Ты не прав, в Delphi решаема, значит и в билдере решаема. VCL здесь не причем. Вот сваял пример на Delphi (билдера давно на компе нет):
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, shellapi, StdCtrls, Menus;

const
  UWM_NOTIFYICON = WM_USER+200;
  WM_CLOSEBALLOON = WM_USER+201;

  NIF_INFO      =        $00000010;

  NIIF_NONE     =        $00000000;
  NIIF_INFO     =        $00000001;
  NIIF_WARNING  =       $00000002;
  NIIF_ERROR    =        $00000003;


type
  TForm1 = class(TForm)
    PopupMenu1: TPopupMenu;
    Mn_exit: TMenuItem;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Mn_exitClick(Sender: TObject);
  private
    { Private declarations }
    procedure OnNotifyIcon(var msg:TMessage); message UWM_NOTIFYICON;
    procedure OnCloseBalloon(var msg:TMessage); message WM_CLOSEBALLOON;
  protected
   function SetIconTray(const hIcon:HICON; const IconID:cardinal;
                              const szTip:string; open:boolean=True):boolean;
   function BalloonTrayIcon(const IconID:cardinal; const Timeout:UINT;
                           const BalloonText, BalloonTitle:String;
                           const BalloonIconType:DWORD):boolean;
  public
    { Public declarations }
  end;

  NotifyIconData_Full = record // определённая в shellapi.h
    cbSize: DWORD;
    Wnd: HWND;
    uID: UINT;
    uFlags: UINT;
    uCallbackMessage: UINT;
    hIcon: HICON;
    szTip: array[0..MAXCHAR] of AnsiChar;
    dwState: DWORD;
    dwStateMask: DWORD;
    szInfo: array[0..MAXBYTE] of AnsiChar;
    uTimeout: UINT; // union with uVersion: UINT;
    szInfoTitle: array[0..63] of AnsiChar;
    dwInfoFlags: DWORD;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.BalloonTrayIcon(const IconID:cardinal; const Timeout:UINT;
                           const BalloonText, BalloonTitle:String;
                           const BalloonIconType:DWORD):boolean;
var
  data:NotifyIconData_Full;
begin
 ZeroMemory(@data, sizeof(data));
 data.cbSize := sizeof(data);
 data.Wnd := Handle;
 data.uID:= IconID;
 data.uFlags := NIF_INFO;
 StrPCopy(data.szInfo, BalloonText);
 StrPCopy(data.szInfoTitle, BalloonTitle);
 data.dwInfoFlags := BalloonIconType;
 data.uTimeout := Timeout;
 Result := Shell_NotifyIcon(NIM_MODIFY, @data);
end;

function TForm1.SetIconTray(const hIcon:HICON; const IconID:cardinal;
                              const szTip:string; open:boolean=True):boolean;
var
  data:NotifyIconData;
begin
 Result:=False;
 ZeroMemory(@data, sizeof(data));
 data.cbSize := sizeof(data);
 data.Wnd := Handle;
 If open then
 begin
  data.uFlags := NIF_ICON or NIF_TIP or NIF_MESSAGE or NIF_INFO;
  data.uID:=IconID;
  data.hIcon := hIcon;
  if data.hIcon = 0 then
  exit;
  //устанавливаем обработчик сообщений иконки
  data.uCallbackMessage := UWM_NOTIFYICON;
  StrPCopy(data.szTip, szTip);
  Result := Shell_NotifyIcon(NIM_ADD, @data);
 end
 else
 Result := Shell_NotifyIcon(NIM_DELETE, @data);
end;

procedure TForm1.OnNotifyIcon(var msg:TMessage);
var
  point:TPoint;
begin
 inherited;
 if msg.LParam=WM_RBUTTONUP then
 begin
  //вызываем попап-меню
  SetForegroundWindow(Handle);
  GetCursorPos(point);
  PopupMenu1.Popup(point.x, point.y);
  PostMessage(Handle, WM_NULL, 0, 0);
 end;
 if msg.LParam=WM_MOUSEMOVE then
 begin
  //вызываем балун
  BalloonTrayIcon(0, 15000, 'this is the balloon text', 'title', NIIF_WARNING);
  //когда курсор вышел из иконки вызываем закрытие баллуна
  PostMessage(Handle, WM_CLOSEBALLOON, 0, 0);
 end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 //добавляем иконку в трей при открытии приложения
 SetIconTray(Application.Icon.Handle, 0, 'blablabla');
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 SetIconTray(0, 0, '', False);
end;

procedure TForm1.OnCloseBalloon(var msg:TMessage);
begin
 BalloonTrayIcon(0, 0, '', '', 0);
end;

procedure TForm1.Mn_exitClick(Sender: TObject);
begin
 Close;
end;

end.
В аттачменте екзешник примера.

З.Ы. Забыл, констатнты объявленные в исходнике (кроме UWM_NOTIFYICON, WM_CLOSEBALLOON), а также структуру NotifyIconData_Full в билдере объявлять не надо, так как в shellapi.h все это должно быть.

* Project1.rar (154.19 Кб - загружено 1106 раз.)
« Последнее редактирование: 24-06-2008 03:59 от zubr » Записан
marat_
Шеф-повар
Опытный

ru
Offline Offline

« Ответ #29 : 24-06-2008 05:25 » 

zubr, просто в билдере компонент есть иконка треевская. вот из неё балун ну никак не получится.
Записан
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines