BlackStar
|
|
« : 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_
Шеф-повар
Опытный
Offline
|
|
« Ответ #1 : 19-06-2008 11:05 » |
|
у меня так вообще ничего не появлялось... замучился. потом бросил.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #2 : 19-06-2008 11:06 » |
|
HempStar, в разделе FAQ по Visual C++ есть , как это сделать, я лично вписывал ) ищи по слову BALOON
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #3 : 19-06-2008 11:08 » |
|
|
|
|
Записан
|
|
|
|
marat_
Шеф-повар
Опытный
Offline
|
|
« Ответ #4 : 19-06-2008 11:09 » |
|
HempStar, классно... твой код заработал. только с дополнительным местом. в первый раз такое вижу...
|
|
|
Записан
|
|
|
|
marat_
Шеф-повар
Опытный
Offline
|
|
« Ответ #5 : 19-06-2008 11:10 » |
|
Алексей1153++, а в Visual C++ у меня, например, работало. в билдере нет.
|
|
|
Записан
|
|
|
|
BlackStar
|
|
« Ответ #6 : 19-06-2008 11:12 » |
|
Но при чем здесь Visual С++ ?! Там немного по-другому это сделано. Мне бы для билдера... К тому же, балун-то появляется, но не в том месте, где нужно. Я думаю, что проблема решается как-то совсем просто. Если вы знаете ответ, то, я вас умоляю, напишите его здесь да и всё, а то я уже полдня разнообразные факи перелопачиваю и, поверьте, еще ни один не помог.
|
|
« Последнее редактирование: 19-06-2008 11:32 от HempStar »
|
Записан
|
Программирование на заказ C/C++, Delphi, PHP, javascript
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #7 : 19-06-2008 11:14 » |
|
HempStar, какая разница - вижуал, не вижуал )) Ты вначале прочитай там. Вечером гляну, если что
|
|
|
Записан
|
|
|
|
marat_
Шеф-повар
Опытный
Offline
|
|
« Ответ #8 : 19-06-2008 11:17 » |
|
HempStar, надо как-то хендл получить
|
|
|
Записан
|
|
|
|
BlackStar
|
|
« Ответ #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
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
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
|
|
« Ответ #11 : 19-06-2008 11:42 » |
|
Очень интересно. А как мне получить HINSTANCE программы? Да и имени иконки в Билдере не предусмотрено!
И что за тип у m_ToolTip? Это контрол какой-то?
|
|
« Последнее редактирование: 19-06-2008 11:48 от HempStar »
|
Записан
|
Программирование на заказ C/C++, Delphi, PHP, javascript
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #12 : 19-06-2008 11:54 » |
|
HempStar, сейчас не могу покопаться (( Вечером пороюсь, а сейчас я бесполезен )))
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #13 : 19-06-2008 18:07 » |
|
порылся я в мсдн, тоже только прямоугольного баллона добился, облако не даётся никак ...
|
|
|
Записан
|
|
|
|
BlackStar
|
|
« Ответ #14 : 20-06-2008 10:07 » |
|
Да черт с ним с облаком! Мне любой сойдет, лишь бы над моей иконкой в трее появлялся.
|
|
|
Записан
|
Программирование на заказ C/C++, Delphi, PHP, javascript
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
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);
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #16 : 20-06-2008 10:34 » |
|
кстати, можно поймать движение мыши по иконке в трее , определить координаты курсора и нарисовать какой угодно свой тултип - произведённых, скажем, от встроенного тултипа
|
|
|
Записан
|
|
|
|
marat_
Шеф-повар
Опытный
Offline
|
|
« Ответ #17 : 20-06-2008 12:00 » |
|
Алексей1153++, в билдере или вообще не появляется, или не там, где надо. нам бы твои проблемы...
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #18 : 20-06-2008 14:37 » |
|
marat_, а какие у меня проблемы, которые тебе бы ? ))
|
|
|
Записан
|
|
|
|
marat_
Шеф-повар
Опытный
Offline
|
|
« Ответ #19 : 20-06-2008 22:39 » |
|
Алексей1153++, с облаком)))
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #20 : 20-06-2008 22:40 » |
|
marat_, да нет у меня проблем с облаком, они все у HempStar )
|
|
|
Записан
|
|
|
|
marat_
Шеф-повар
Опытный
Offline
|
|
« Ответ #21 : 20-06-2008 22:42 » |
|
Алексей1153++, а как же 14 пост?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #22 : 21-06-2008 06:18 » |
|
marat_, 14 - это твой а 13-й - это обращение к HempStar
|
|
|
Записан
|
|
|
|
marat_
Шеф-повар
Опытный
Offline
|
|
« Ответ #23 : 21-06-2008 07:42 » |
|
Алексей1153++, ты опять из вапа?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #24 : 21-06-2008 07:46 » |
|
marat_, нет , значок то посмотри у поста какой )
|
|
|
Записан
|
|
|
|
marat_
Шеф-повар
Опытный
Offline
|
|
« Ответ #25 : 21-06-2008 08:32 » |
|
Алексей1153++,
HempStar Участник Offline Re: Балун в трее « Ответ #14 : Вчера в 11:07 » Цитировать -------------------------------------------------------------------------------- Да черт с ним с облаком! Мне любой сойдет, лишь бы над моей иконкой в трее появлялся.
вот, что вижу я
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #26 : 21-06-2008 16:14 » |
|
marat_, странно, может я ник попутал - тогда пост не твой, но и не мой тоже
в общем - проблема то не у меня, а у него
|
|
|
Записан
|
|
|
|
BlackStar
|
|
« Ответ #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 все это должно быть.
|
|
« Последнее редактирование: 24-06-2008 03:59 от zubr »
|
Записан
|
|
|
|
marat_
Шеф-повар
Опытный
Offline
|
|
« Ответ #29 : 24-06-2008 05:25 » |
|
zubr, просто в билдере компонент есть иконка треевская. вот из неё балун ну никак не получится.
|
|
|
Записан
|
|
|
|
|