Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Вниз

FAQ: Добавление иконки в SysTray   Найти похожие ветки 

 
Piter ©   (2004-03-24 18:54) [0]

Пора, я думаю, от слов переходить к делу. Над сайтом надо работать, предлагаю улучшать FAQ. И начать предлагаю с известного всем вопроса. А то говорим - вопросы ламерские, так теперь я понимаю отчего они такие.

Сразу хочу оговорить - пишите только по делу, обсуждать хорошая идея/плохая НЕ НАДО. Только замечания по FAQ"у, по рассматриваемым вопросам. Всякие лишние комментарии оставляйте при себе. Модераторов прошу жестко пресекать разный флуд.

Ведущим назначаю себя, это давайте пока тоже не обсуждать. Кто раньше бы захотел - уже создал подобную ветвь. Пока предлагаю обсудить вопрос про иконку, ибо в FAQ"е видим следующее:

function TaskBarAddIcon( hWindow : THandle; ID  : Cardinal; ICON : hicon; CallbackMessage : Cardinal; Tip  : String ) : Boolean;
var
 NID : TNotifyIconData;
begin
 FillChar( NID, SizeOf( TNotifyIconData ), 0 );
 with NID do
   begin  
     cbSize := SizeOf( TNotifyIconData );  
     Wnd   := hWindow;  
     uID    := ID;  
     uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;  
     uCallbackMessage := CallbackMessage;  
     hIcon  := Icon;  
     if Length( Tip ) > 63 then
       SetLength( Tip, 63 );  
     StrPCopy( szTip, Tip );
   end;
 Result := Shell_NotifyIcon( NIM_ADD, @NID );
end;


Что эта функция делает, что такое TNotifyIconData, чего ей передавать - непонятно.


 
Piter ©   (2004-03-24 18:54) [0]

Пора, я думаю, от слов переходить к делу. Над сайтом надо работать, предлагаю улучшать FAQ. И начать предлагаю с известного всем вопроса. А то говорим - вопросы ламерские, так теперь я понимаю отчего они такие.

Сразу хочу оговорить - пишите только по делу, обсуждать хорошая идея/плохая НЕ НАДО. Только замечания по FAQ"у, по рассматриваемым вопросам. Всякие лишние комментарии оставляйте при себе. Модераторов прошу жестко пресекать разный флуд.

Ведущим назначаю себя, это давайте пока тоже не обсуждать. Кто раньше бы захотел - уже создал подобную ветвь. Пока предлагаю обсудить вопрос про иконку, ибо в FAQ"е видим следующее:

function TaskBarAddIcon( hWindow : THandle; ID  : Cardinal; ICON : hicon; CallbackMessage : Cardinal; Tip  : String ) : Boolean;
var
 NID : TNotifyIconData;
begin
 FillChar( NID, SizeOf( TNotifyIconData ), 0 );
 with NID do
   begin  
     cbSize := SizeOf( TNotifyIconData );  
     Wnd   := hWindow;  
     uID    := ID;  
     uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;  
     uCallbackMessage := CallbackMessage;  
     hIcon  := Icon;  
     if Length( Tip ) > 63 then
       SetLength( Tip, 63 );  
     StrPCopy( szTip, Tip );
   end;
 Result := Shell_NotifyIcon( NIM_ADD, @NID );
end;


Что эта функция делает, что такое TNotifyIconData, чего ей передавать - непонятно.


 
Piter ©   (2004-03-24 18:56) [1]

Моя версия.

Для работы с SysTray"ем (область где часики) в WinApi есть всего лишь одна функция - Shell_NotifyIcon. С помощью нее можно добавлять свои иконки в SysTray, модифицировать их и удалять.
Вот ее описание:

function Shell_NotifyIcon(dwMessage: DWORD; lpData: PNotifyIconData): BOOL; stdcall;

Ее заголовок, а также определение типов TNotifyIconData, PNotifyIconData находится в юните shellapi.pas

Первый параметр dwMessage указывает, что вы хотите сделать: добавить иконку, удалить или модифицировать существующую.
Соответственно, может принимать такие значения:

NIM_ADD
NIM_DELETE
NIM_MODIFY

Следующий параметр lpData - это указатель на запись TNotifyIconData, которая описана так:
TNotifyIconData = record
   cbSize: DWORD;
   Wnd: HWND;
   uID: UINT;
   uFlags: UINT;
   uCallbackMessage: UINT;
   hIcon: HICON;
   szTip: array [0..63] of AnsiChar;
end;

cbSize - размер этой самой структуры TNotifyIconData. Легко вычисляется с помощью sizeof

Wnd - номер окна, которое будет принимать сообщения от иконки

uID - уникальный номер иконки в вашем приложении

uFlags - флаги, показывающие какие поля TNotifyIconData должны быть обработаны системой

uCallbackMessage - если в uFlags установлено NIF_MESSAGE, то uCallbackMessage указывает номер сообщения, которое будет послано окну под номером Wnd

hIcon - если в uFlags установлено NIF_ICON, то hIcon показывает номер иконки, которая будет будет отображаться в SysTray"е

szTip - если в uFlags установлено NIF_TIP, то szTip задает всплывающий текст, который отображается при наведении курсора мышки на иконку

Ну вот собственно и все, что нужно знать для того, чтобы "запуздырить" свою иконку в SysTray.
В программе где-то имеет смысл объявить глобальную переменную, например NID типа TNotifyIconData.
var NID: TNotifyIconData;
Глобально - потому что эта переменная понадобится, чтобы удалять иконку и модифицировать ее.
Осталось рассмотреть конкретную реализацию.

procedure TForm1.Button1Click(Sender: TObject);
begin
 NID.uID :=0;
 NID.Wnd := Handle;
 NID.uCallbackMessage :=WM_USER;
 NID.hIcon := LoadIcon(HINSTANCE,"ICON1");
 NID.szTip := "Моя иконка";
 NID.uFlags :=NIF_ICON or NIF_MESSAGE or NIF_TIP;
 NID.cbSize :=sizeof(NID);
 Shell_NotifyIcon(NIM_ADD,@NID);
end;


NID.uID :=0;
уникальный номер иконки в приложении. Если у вас несколько иконок в одном приложении, то это позволит вам их различать. У нас иконка одна, так что ставим что угодно. Например, ноль.

NID.Wnd := Handle;
Выбираем окно, которое будет обрабатывать сообщение от иконки. В моем тестовом приложении только одна форма, одно окно, его и выбираю.
Выбираемое окно должно иметь процедуру обработки сообщения.

NID.uCallbackMessage :=WM_USER;
Выбираем номер сообщения, которое будет послано нашему окну, как только с иконкой произведут какие-либо действия.
Для наших личных сообщений Microsoft рекомендует использовать номера от WM_USER до 0x7FFF. Выбираем WM_USER

NID.hIcon := LoadIcon(HINSTANCE,"ICON1");
Тут загружаем изображение, иконку, которая будет отображена в SysTtay. По этому пункту почему-то возникает много вопросов, типа "а как загрузить-то?".
Это, наверное, тема для очередного вопроса в FAQ, но кратко расскажу как можно. Запускаете "Tools->ImageEditor" и создаете новый "Resource File" или открываете существующий (только не главный ресурсный файл вашего приложения, типа project1.res).
Рисуете иконку под именем ICON1, сохраняете ресурсный файл под именем icon.res, кладете файл в каталог с программой.
В модуле формы, где используется LoadIcon, после {$R *.dfm} пишете {$R icon.RES}, после чего Delphi включит ресурсы вашего icon1.res в создаваемый exe файл. В том числе включит иконку ICON1.
После чего эту иконку можно загрузить как показано выше.

NID.szTip := "Моя иконка";
Просто задаете текст всплывающей подсказки. Так как объявлено:
szTip: array [0..63] of AnsiChar;
то соответственно, подсказка не должна быть длиннее 64 символов.

NID.uFlags :=NIF_ICON or NIF_MESSAGE or NIF_TIP;
задаются флаги, которые показывают, какие поля TNotifyIconData должны учитываться системой. Мы заполнили и hIcon, и uCallbackMessage, и szTip. Соответственно, пусть они все будут учитываться.

NID.cbSize :=sizeof(NID);
просто задается размер TNotifyIconData. Эта строчка всегда будет именно такой.

Shell_NotifyIcon(NIM_ADD,@NID);
собственно говоря, вызывается функция Shell_NotifyIcon с нужными параметрами (так как должен передаваться указатель на структуру, а не сама TNotifyIconData, то поэтому @NID, а не просто NID). Можно анализировать значение, возвращаемое функцией. True в случае успешного добавления иконки и False в случае неуспеха.

Созданную иконку можно удалить. Например, это следует делать при завершении приложения:
procedure TForm1.FormDestroy(Sender: TObject);
begin
 Shell_NotifyIcon(NIM_DELETE,@NID);
end;


Если вы хотите модифицировать текст всплывающей подсказки или отобразить другую иконку вместо прежней, то просто перезаполните нужное поле NID и вызовете:
Shell_NotifyIcon(NIM_MODIFY,@NID);

Но это не все, иконку мы добавили, но ведь нужно как-то обрабатывать события, такие, например, как клик мышкой по иконке.
Именно для этого форма, которая будет получать события от иконки (на которую указывает параметр Wnd), должна иметь обработчик сообщений. Мы определили сообщение как WM_USER. Соответственно, добавим к нашей форме нужную процедуру:
procedure IconMessage (var Msg: TMessage); message wm_USER;
А теперь остается только реализовать ее. Например, мы хотим, чтобы при клике левой кнопкой по иконке выводился бокс с сообщением:

procedure TForm1.IconMessage(var Msg: TMessage);
begin
if Msg.lParam = WM_LBUTTONDOWN then
 showmessage("По иконке кликнули левой кнопкой мыши!");
end;


А по клику правой кнопки хотим вывести существующее PopUp меню:

procedure TForm1.IconMessage(var Msg: TMessage);
var
 Pt: TPoint;
begin
 if Msg.lParam = wm_RBUTTONDOWN then
 begin
   GetCursorPos (Pt);
   PopupMenu1.Popup (Pt.x, Pt.y);
 end;
end;


Ну и совсем напоследок хочу предупредить, что иконка автоматически удаляется как только окно Wnd, указанное в TNotifyIconData, удаляется из системы. Это может произойти не только при закрытии приложения, а, например, при смене BorderStyle у формы.


 
Piter ©   (2004-03-24 18:56) [1]

Моя версия.

Для работы с SysTray"ем (область где часики) в WinApi есть всего лишь одна функция - Shell_NotifyIcon. С помощью нее можно добавлять свои иконки в SysTray, модифицировать их и удалять.
Вот ее описание:

function Shell_NotifyIcon(dwMessage: DWORD; lpData: PNotifyIconData): BOOL; stdcall;

Ее заголовок, а также определение типов TNotifyIconData, PNotifyIconData находится в юните shellapi.pas

Первый параметр dwMessage указывает, что вы хотите сделать: добавить иконку, удалить или модифицировать существующую.
Соответственно, может принимать такие значения:

NIM_ADD
NIM_DELETE
NIM_MODIFY

Следующий параметр lpData - это указатель на запись TNotifyIconData, которая описана так:
TNotifyIconData = record
   cbSize: DWORD;
   Wnd: HWND;
   uID: UINT;
   uFlags: UINT;
   uCallbackMessage: UINT;
   hIcon: HICON;
   szTip: array [0..63] of AnsiChar;
end;

cbSize - размер этой самой структуры TNotifyIconData. Легко вычисляется с помощью sizeof

Wnd - номер окна, которое будет принимать сообщения от иконки

uID - уникальный номер иконки в вашем приложении

uFlags - флаги, показывающие какие поля TNotifyIconData должны быть обработаны системой

uCallbackMessage - если в uFlags установлено NIF_MESSAGE, то uCallbackMessage указывает номер сообщения, которое будет послано окну под номером Wnd

hIcon - если в uFlags установлено NIF_ICON, то hIcon показывает номер иконки, которая будет будет отображаться в SysTray"е

szTip - если в uFlags установлено NIF_TIP, то szTip задает всплывающий текст, который отображается при наведении курсора мышки на иконку

Ну вот собственно и все, что нужно знать для того, чтобы "запуздырить" свою иконку в SysTray.
В программе где-то имеет смысл объявить глобальную переменную, например NID типа TNotifyIconData.
var NID: TNotifyIconData;
Глобально - потому что эта переменная понадобится, чтобы удалять иконку и модифицировать ее.
Осталось рассмотреть конкретную реализацию.

procedure TForm1.Button1Click(Sender: TObject);
begin
 NID.uID :=0;
 NID.Wnd := Handle;
 NID.uCallbackMessage :=WM_USER;
 NID.hIcon := LoadIcon(HINSTANCE,"ICON1");
 NID.szTip := "Моя иконка";
 NID.uFlags :=NIF_ICON or NIF_MESSAGE or NIF_TIP;
 NID.cbSize :=sizeof(NID);
 Shell_NotifyIcon(NIM_ADD,@NID);
end;


NID.uID :=0;
уникальный номер иконки в приложении. Если у вас несколько иконок в одном приложении, то это позволит вам их различать. У нас иконка одна, так что ставим что угодно. Например, ноль.

NID.Wnd := Handle;
Выбираем окно, которое будет обрабатывать сообщение от иконки. В моем тестовом приложении только одна форма, одно окно, его и выбираю.
Выбираемое окно должно иметь процедуру обработки сообщения.

NID.uCallbackMessage :=WM_USER;
Выбираем номер сообщения, которое будет послано нашему окну, как только с иконкой произведут какие-либо действия.
Для наших личных сообщений Microsoft рекомендует использовать номера от WM_USER до 0x7FFF. Выбираем WM_USER

NID.hIcon := LoadIcon(HINSTANCE,"ICON1");
Тут загружаем изображение, иконку, которая будет отображена в SysTtay. По этому пункту почему-то возникает много вопросов, типа "а как загрузить-то?".
Это, наверное, тема для очередного вопроса в FAQ, но кратко расскажу как можно. Запускаете "Tools->ImageEditor" и создаете новый "Resource File" или открываете существующий (только не главный ресурсный файл вашего приложения, типа project1.res).
Рисуете иконку под именем ICON1, сохраняете ресурсный файл под именем icon.res, кладете файл в каталог с программой.
В модуле формы, где используется LoadIcon, после {$R *.dfm} пишете {$R icon.RES}, после чего Delphi включит ресурсы вашего icon1.res в создаваемый exe файл. В том числе включит иконку ICON1.
После чего эту иконку можно загрузить как показано выше.

NID.szTip := "Моя иконка";
Просто задаете текст всплывающей подсказки. Так как объявлено:
szTip: array [0..63] of AnsiChar;
то соответственно, подсказка не должна быть длиннее 64 символов.

NID.uFlags :=NIF_ICON or NIF_MESSAGE or NIF_TIP;
задаются флаги, которые показывают, какие поля TNotifyIconData должны учитываться системой. Мы заполнили и hIcon, и uCallbackMessage, и szTip. Соответственно, пусть они все будут учитываться.

NID.cbSize :=sizeof(NID);
просто задается размер TNotifyIconData. Эта строчка всегда будет именно такой.

Shell_NotifyIcon(NIM_ADD,@NID);
собственно говоря, вызывается функция Shell_NotifyIcon с нужными параметрами (так как должен передаваться указатель на структуру, а не сама TNotifyIconData, то поэтому @NID, а не просто NID). Можно анализировать значение, возвращаемое функцией. True в случае успешного добавления иконки и False в случае неуспеха.

Созданную иконку можно удалить. Например, это следует делать при завершении приложения:
procedure TForm1.FormDestroy(Sender: TObject);
begin
 Shell_NotifyIcon(NIM_DELETE,@NID);
end;


Если вы хотите модифицировать текст всплывающей подсказки или отобразить другую иконку вместо прежней, то просто перезаполните нужное поле NID и вызовете:
Shell_NotifyIcon(NIM_MODIFY,@NID);

Но это не все, иконку мы добавили, но ведь нужно как-то обрабатывать события, такие, например, как клик мышкой по иконке.
Именно для этого форма, которая будет получать события от иконки (на которую указывает параметр Wnd), должна иметь обработчик сообщений. Мы определили сообщение как WM_USER. Соответственно, добавим к нашей форме нужную процедуру:
procedure IconMessage (var Msg: TMessage); message wm_USER;
А теперь остается только реализовать ее. Например, мы хотим, чтобы при клике левой кнопкой по иконке выводился бокс с сообщением:

procedure TForm1.IconMessage(var Msg: TMessage);
begin
if Msg.lParam = WM_LBUTTONDOWN then
 showmessage("По иконке кликнули левой кнопкой мыши!");
end;


А по клику правой кнопки хотим вывести существующее PopUp меню:

procedure TForm1.IconMessage(var Msg: TMessage);
var
 Pt: TPoint;
begin
 if Msg.lParam = wm_RBUTTONDOWN then
 begin
   GetCursorPos (Pt);
   PopupMenu1.Popup (Pt.x, Pt.y);
 end;
end;


Ну и совсем напоследок хочу предупредить, что иконка автоматически удаляется как только окно Wnd, указанное в TNotifyIconData, удаляется из системы. Это может произойти не только при закрытии приложения, а, например, при смене BorderStyle у формы.


 
Игорь Шевченко ©   (2004-03-24 18:56) [2]

Piter ©   (24.03.04 18:54)  

Есть предложение слить три ветки в одну.

Ко-модератор.


 
Игорь Шевченко ©   (2004-03-24 18:56) [2]

Piter ©   (24.03.04 18:54)  

Есть предложение слить три ветки в одну.

Ко-модератор.


 
Piter ©   (2004-03-24 18:59) [3]

Если у кого-то есть комментарии к ответу по "Добавление иконки в SysTray" - высказывайтесь


 
Piter ©   (2004-03-24 18:59) [3]

Если у кого-то есть комментарии к ответу по "Добавление иконки в SysTray" - высказывайтесь


 
Piter ©   (2004-03-24 19:02) [4]

Игорь Шевченко (24.03.04 18:56) [2]
Есть предложение слить три ветки в одну


какие ветки?


 
Piter ©   (2004-03-24 19:02) [4]

Игорь Шевченко (24.03.04 18:56) [2]
Есть предложение слить три ветки в одну


какие ветки?


 
Игорь Шевченко ©   (2004-03-24 19:05) [5]

Есть предложение дополнить обработку нажатия мышью для различия Click и DoubleClick. У Пачеки этот момент довольно подробно расписан, но набивать лень, а электронной версии нету.


 
Игорь Шевченко ©   (2004-03-24 19:05) [5]

Есть предложение дополнить обработку нажатия мышью для различия Click и DoubleClick. У Пачеки этот момент довольно подробно расписан, но набивать лень, а электронной версии нету.


 
zzet ©   (2004-03-24 19:07) [6]

>Piter ©   (24.03.04 18:56)

Это не ответ фака, это целая статья получилась.. ИМХО, для "копипастнуть в код" сгодится и изначальный вариант, а тот кто захочет копнуть глубже копнет при помощи хельпа. Если на все часто задаваемые вопросы писать такие подробные ответы, то фак получится не фак, а энциклопедия.. Да и обработать таким образом штук 100-200 вопросов, это сколько делов, представляешь?


 
zzet ©   (2004-03-24 19:07) [6]

>Piter ©   (24.03.04 18:56)

Это не ответ фака, это целая статья получилась.. ИМХО, для "копипастнуть в код" сгодится и изначальный вариант, а тот кто захочет копнуть глубже копнет при помощи хельпа. Если на все часто задаваемые вопросы писать такие подробные ответы, то фак получится не фак, а энциклопедия.. Да и обработать таким образом штук 100-200 вопросов, это сколько делов, представляешь?


 
Игорь Шевченко ©   (2004-03-24 19:09) [7]

zzet ©   (24.03.04 19:07)


> для "копипастнуть в код"


А FAQ, он не для этого.


 
Игорь Шевченко ©   (2004-03-24 19:09) [7]

zzet ©   (24.03.04 19:07)


> для "копипастнуть в код"


А FAQ, он не для этого.


 
zzet ©   (2004-03-24 19:17) [8]

Если с подобной тщательностью обработать самые популярные вопросы (штук 200), то получится увесистый труд. Его даже можно компильнуть в е-боок и продавать за 2-3 бакса. Уверен, будет пользоваться спросом.


 
zzet ©   (2004-03-24 19:17) [8]

Если с подобной тщательностью обработать самые популярные вопросы (штук 200), то получится увесистый труд. Его даже можно компильнуть в е-боок и продавать за 2-3 бакса. Уверен, будет пользоваться спросом.


 
nikkie ©   (2004-03-24 19:18) [9]

имхо, для фака длинновато получилось... такой текст скорее как статья для начинающих годится. может так и стоит его оформить? хотя вероятно, что статей про иконку-в-трее уже куча написана.

я бы только добавил побольше вещей связанных с иконкой-в-трее. например, расширение структуры NOTIFYICONDATA в W2K и выше, трюк с SetForegroundWindow и посылкой WM_NULL (PRB: Menus for Notification Icons Do Not Work Correctly, ID: Q135788 - не знаю только насколько эта проблема проявляется при использовании VCL). может у кого еще какие идеи родятся. тогда может и статья станет достаточно оригинальной, чтобы оправдать свое существование. а может и нет.

для фака же покороче надо. имхо.


 
nikkie ©   (2004-03-24 19:18) [9]

имхо, для фака длинновато получилось... такой текст скорее как статья для начинающих годится. может так и стоит его оформить? хотя вероятно, что статей про иконку-в-трее уже куча написана.

я бы только добавил побольше вещей связанных с иконкой-в-трее. например, расширение структуры NOTIFYICONDATA в W2K и выше, трюк с SetForegroundWindow и посылкой WM_NULL (PRB: Menus for Notification Icons Do Not Work Correctly, ID: Q135788 - не знаю только насколько эта проблема проявляется при использовании VCL). может у кого еще какие идеи родятся. тогда может и статья станет достаточно оригинальной, чтобы оправдать свое существование. а может и нет.

для фака же покороче надо. имхо.


 
nikkie ©   (2004-03-24 19:20) [10]

>Его даже можно компильнуть в е-боок и продавать за 2-3 бакса. Уверен, будет пользоваться спросом
первая копия :)
вторую, боюсь тебе уже не удастся продать


 
nikkie ©   (2004-03-24 19:20) [10]

>Его даже можно компильнуть в е-боок и продавать за 2-3 бакса. Уверен, будет пользоваться спросом
первая копия :)
вторую, боюсь тебе уже не удастся продать


 
panov ©   (2004-03-24 19:22) [11]

В примере не хватает скрывания формы приложения при сворачивании.(это навскидку)


 
panov ©   (2004-03-24 19:22) [11]

В примере не хватает скрывания формы приложения при сворачивании.(это навскидку)


 
zzet ©   (2004-03-24 19:25) [12]

>вторую, боюсь тебе уже не удастся продать

Да не мне, я другим зарабатываю. А вот на сайте можно поставить ссылку на загрузку е-версии полного фака через какой-нить е-магазин. При небольшой цене 1-2$ покупать будут с удовольствием, а сайту все вперед, на оплату траффика.


 
zzet ©   (2004-03-24 19:25) [12]

>вторую, боюсь тебе уже не удастся продать

Да не мне, я другим зарабатываю. А вот на сайте можно поставить ссылку на загрузку е-версии полного фака через какой-нить е-магазин. При небольшой цене 1-2$ покупать будут с удовольствием, а сайту все вперед, на оплату траффика.


 
Юрий Зотов ©   (2004-03-24 19:34) [13]

> zzet ©   (24.03.04 19:25) [12]

Вероятно, nikkie имел в виду, что как только будет продана одна копия, так она тут же будет выложена где-нибудь на "народе" (а потом и во множестве других мест) для свободной скачки.

Потому что некоторые люди считают, что "софт маст би фри". А сайт... да пусть себе перебивается, как знает. Его проблемы.


 
Юрий Зотов ©   (2004-03-24 19:34) [13]

> zzet ©   (24.03.04 19:25) [12]

Вероятно, nikkie имел в виду, что как только будет продана одна копия, так она тут же будет выложена где-нибудь на "народе" (а потом и во множестве других мест) для свободной скачки.

Потому что некоторые люди считают, что "софт маст би фри". А сайт... да пусть себе перебивается, как знает. Его проблемы.


 
nikkie ©   (2004-03-24 19:35) [14]

еще идеи для статьи:
1. предупредить, чтобы при выходе из программы посылали DELETE, а то иконка так и останется висеть, пока мышку не подведут. соответственно твой последний абзац почетче сформулировать. и объяснить почему смена BorderStyle приводит к унижтожению окна.
2. пример анимации (смена иконки по таймеру), а можно и анимацию в ответ на WM_MOUSEMOVE.
3. разобраться, что там происходит с иконками в WinXP - недавно проскакивал вопрос на эту тему - как не дать WinXP спрятать мою иконку. правда я так и не понял, решилась проблема или нет. и WinXP нет, чтобы самому поразбираться.

а пишешь ты хорошо, так держать.


 
nikkie ©   (2004-03-24 19:35) [14]

еще идеи для статьи:
1. предупредить, чтобы при выходе из программы посылали DELETE, а то иконка так и останется висеть, пока мышку не подведут. соответственно твой последний абзац почетче сформулировать. и объяснить почему смена BorderStyle приводит к унижтожению окна.
2. пример анимации (смена иконки по таймеру), а можно и анимацию в ответ на WM_MOUSEMOVE.
3. разобраться, что там происходит с иконками в WinXP - недавно проскакивал вопрос на эту тему - как не дать WinXP спрятать мою иконку. правда я так и не понял, решилась проблема или нет. и WinXP нет, чтобы самому поразбираться.

а пишешь ты хорошо, так держать.


 
Дремучий ©   (2004-03-24 19:39) [15]

зачем придумывать велосипед?
UBPFD - бесплатная база готовых решений для Delphi
Здесь находятся ответы на самые разные вопросы по Delphi в виде полностью готовых к употреблению процедур и функций. Просто зайди, возьми и используй в своем проекте!
Поделись и своими готовыми решениями - база постоянно и очень активно расширяется самими пользователями!

http://delphibase.endimus.com/
---------
просто база все никак не передет к мастакам. Если это не планируется -- то я перетащу ее к себе (к дремучим) ;PP


 
Дремучий ©   (2004-03-24 19:39) [15]

зачем придумывать велосипед?
UBPFD - бесплатная база готовых решений для Delphi
Здесь находятся ответы на самые разные вопросы по Delphi в виде полностью готовых к употреблению процедур и функций. Просто зайди, возьми и используй в своем проекте!
Поделись и своими готовыми решениями - база постоянно и очень активно расширяется самими пользователями!

http://delphibase.endimus.com/
---------
просто база все никак не передет к мастакам. Если это не планируется -- то я перетащу ее к себе (к дремучим) ;PP


 
BOA_KAA ©   (2004-03-24 20:12) [16]


> zzet ©   (24.03.04 19:25) [12]

Если я не ошибаюсь, "Delphi - советы программистов" такое называется, т.е. уже есть...


 
BOA_KAA ©   (2004-03-24 20:12) [16]


> zzet ©   (24.03.04 19:25) [12]

Если я не ошибаюсь, "Delphi - советы программистов" такое называется, т.е. уже есть...


 
Piter ©   (2004-03-24 20:36) [17]

nikkie (24.03.04 19:18) [9]
для фака же покороче надо. имхо


согласен. Но просто люди, которые не могут разобраться с хелпом с таким элементарным примером.. ну в общем им надо объяснять очень подробно. А статью не хочу писать, я задумывал это именно как FAQ. Но с другой стороны это такой уже набивший оскомину вопрос, что уж надо разжевать. Если и после этого человек не поймет... ну чтож поделать...

nikkie (24.03.04 19:18) [9]
трюк с SetForegroundWindow


а что за трюк?

Игорь Шевченко (24.03.04 19:05) [5]
Есть предложение дополнить обработку нажатия мышью для различия Click и DoubleClick


а это необходимо для примера как скрыть иконку?

panov (24.03.04 19:22) [11]
В примере не хватает скрывания формы приложения при сворачивании


черт. Тогда в примере не хватает разворачивания формы при нажатии на иконку. И описания многих действий, которые можно сопоставить с действиями с иконкой :)

zzet (24.03.04 19:07) [6]
сгодится и изначальный вариант


ну ни фига. Что в изначальном варианте? Функции передаются все параметры, а она тупо заполняет TNotifyIconData. Так нельзя...

nikkie (24.03.04 19:35) [14]
предупредить, чтобы при выходе из программы посылали DELETE, а то иконка так и останется висеть


Так я ж писал: "Созданную иконку можно удалить. Например, это следует делать при завершении приложения"

объяснить почему смена BorderStyle приводит к унижтожению окна

ок

nikkie (24.03.04 19:35) [14]
2. пример анимации (смена иконки по таймеру), а можно и анимацию в ответ на WM_MOUSEMOVE.


имхо, совсем выходит за рамки FAQ"а

nikkie (24.03.04 19:35) [14]
разобраться, что там происходит с иконками в WinXP


XP тоже нету :(

Дремучий (24.03.04 19:39) [15]
UBPFD - бесплатная база готовых решений для Delphi


блин, одно дело просто код, другое - объяснение

В общем, вы скажите - сойдет? Замечания есть? Если сократить - то что?

P.S. Имхо, добавлять уже не имеет смысла, и так объем нормальный получился

P.S.S. Ветку с Пановым объединять не надо.
Сразу объясню схему работы - Панов выясняет какие вопросы самые популярные. Я предлагаю не писать ответы самому лично, а выкладывать черновики в форум. Народ думает, поправляет, делает замечания. Автор ветки является координатором, составляет конечный вариант. После чего отправляет администрации, которая думаю не откажется разместить обновленный грамотный ответ.
Призываю всех поучаствовать, создавайте ветки, типа с пометкой FAQ: "[вопрос]"

Ладно, ребят, все. Хватит флуда. Выражаемся только по данному вопросу


 
Piter ©   (2004-03-24 20:36) [17]

nikkie (24.03.04 19:18) [9]
для фака же покороче надо. имхо


согласен. Но просто люди, которые не могут разобраться с хелпом с таким элементарным примером.. ну в общем им надо объяснять очень подробно. А статью не хочу писать, я задумывал это именно как FAQ. Но с другой стороны это такой уже набивший оскомину вопрос, что уж надо разжевать. Если и после этого человек не поймет... ну чтож поделать...

nikkie (24.03.04 19:18) [9]
трюк с SetForegroundWindow


а что за трюк?

Игорь Шевченко (24.03.04 19:05) [5]
Есть предложение дополнить обработку нажатия мышью для различия Click и DoubleClick


а это необходимо для примера как скрыть иконку?

panov (24.03.04 19:22) [11]
В примере не хватает скрывания формы приложения при сворачивании


черт. Тогда в примере не хватает разворачивания формы при нажатии на иконку. И описания многих действий, которые можно сопоставить с действиями с иконкой :)

zzet (24.03.04 19:07) [6]
сгодится и изначальный вариант


ну ни фига. Что в изначальном варианте? Функции передаются все параметры, а она тупо заполняет TNotifyIconData. Так нельзя...

nikkie (24.03.04 19:35) [14]
предупредить, чтобы при выходе из программы посылали DELETE, а то иконка так и останется висеть


Так я ж писал: "Созданную иконку можно удалить. Например, это следует делать при завершении приложения"

объяснить почему смена BorderStyle приводит к унижтожению окна

ок

nikkie (24.03.04 19:35) [14]
2. пример анимации (смена иконки по таймеру), а можно и анимацию в ответ на WM_MOUSEMOVE.


имхо, совсем выходит за рамки FAQ"а

nikkie (24.03.04 19:35) [14]
разобраться, что там происходит с иконками в WinXP


XP тоже нету :(

Дремучий (24.03.04 19:39) [15]
UBPFD - бесплатная база готовых решений для Delphi


блин, одно дело просто код, другое - объяснение

В общем, вы скажите - сойдет? Замечания есть? Если сократить - то что?

P.S. Имхо, добавлять уже не имеет смысла, и так объем нормальный получился

P.S.S. Ветку с Пановым объединять не надо.
Сразу объясню схему работы - Панов выясняет какие вопросы самые популярные. Я предлагаю не писать ответы самому лично, а выкладывать черновики в форум. Народ думает, поправляет, делает замечания. Автор ветки является координатором, составляет конечный вариант. После чего отправляет администрации, которая думаю не откажется разместить обновленный грамотный ответ.
Призываю всех поучаствовать, создавайте ветки, типа с пометкой FAQ: "[вопрос]"

Ладно, ребят, все. Хватит флуда. Выражаемся только по данному вопросу


 
Игорь Шевченко ©   (2004-03-24 20:45) [18]


> Есть предложение дополнить обработку нажатия мышью для различия
> Click и DoubleClick
>
> а это необходимо для примера как скрыть иконку?


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

Пример написан хорошо.

P.S. Напиши, будь добр, прямо перед кодом, что

uses
 ShellAPI;


А то не для всех это очевидно. И начнется - я взял пример из FAQ, а он не работает, и т.д. :)


 
Игорь Шевченко ©   (2004-03-24 20:45) [18]


> Есть предложение дополнить обработку нажатия мышью для различия
> Click и DoubleClick
>
> а это необходимо для примера как скрыть иконку?


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

Пример написан хорошо.

P.S. Напиши, будь добр, прямо перед кодом, что

uses
 ShellAPI;


А то не для всех это очевидно. И начнется - я взял пример из FAQ, а он не работает, и т.д. :)


 
nikkie ©   (2004-03-24 21:17) [19]

>имхо, совсем выходит за рамки FAQ"а
все что я предлагал выше - исключительно для статьи. для FAQa не добавлять надо, а вырезать безжалостной рукой.

>>трюк с SetForegroundWindow
>а что за трюк?
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/resources/menus/menure ference/menufunctions/trackpopupmenu.asp
внизу страницы - пример. при программировании на WinAPI важный момент. при использовании VCL - не знаю.

>>UBPFD - бесплатная база готовых решений для Delphi
>блин, одно дело просто код, другое - объяснение
это ты зря. Song там хорошее объяснение написал.
http://delphibase.endimus.com/?action=viewfunc&topic=appctrl&id=10239


 
nikkie ©   (2004-03-24 21:17) [19]

>имхо, совсем выходит за рамки FAQ"а
все что я предлагал выше - исключительно для статьи. для FAQa не добавлять надо, а вырезать безжалостной рукой.

>>трюк с SetForegroundWindow
>а что за трюк?
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/resources/menus/menure ference/menufunctions/trackpopupmenu.asp
внизу страницы - пример. при программировании на WinAPI важный момент. при использовании VCL - не знаю.

>>UBPFD - бесплатная база готовых решений для Delphi
>блин, одно дело просто код, другое - объяснение
это ты зря. Song там хорошее объяснение написал.
http://delphibase.endimus.com/?action=viewfunc&topic=appctrl&id=10239


 
Дремучий ©   (2004-03-24 21:45) [20]


> nikkie ©   (24.03.04 21:17) [19]
> >>UBPFD - бесплатная база готовых решений для Delphi
> >блин, одно дело просто код, другое - объяснение
> это ты зря. Song там хорошее объяснение написал.

угу, никто не мешает НОРМАЛЬНО документировать код. Зачем из 20 строчек кода писать целую статью? ИМХО, БОЛЕЕ ЧЕМ ДОСТАТОЧНО по одной строке коментария до/после каждой строки кода.


 
Дремучий ©   (2004-03-24 21:45) [20]


> nikkie ©   (24.03.04 21:17) [19]
> >>UBPFD - бесплатная база готовых решений для Delphi
> >блин, одно дело просто код, другое - объяснение
> это ты зря. Song там хорошее объяснение написал.

угу, никто не мешает НОРМАЛЬНО документировать код. Зачем из 20 строчек кода писать целую статью? ИМХО, БОЛЕЕ ЧЕМ ДОСТАТОЧНО по одной строке коментария до/после каждой строки кода.


 
TButton ©   (2004-03-24 22:11) [21]

>Зачем из 20 строчек кода писать целую статью

вот веришь нет, я пока статью (не эту, но на эту тему) не прочитал не понимал че да как. "Иногда лучше жевать, чем говорить" (с)АП


 
TButton ©   (2004-03-24 22:11) [21]

>Зачем из 20 строчек кода писать целую статью

вот веришь нет, я пока статью (не эту, но на эту тему) не прочитал не понимал че да как. "Иногда лучше жевать, чем говорить" (с)АП


 
Rouse_ ©   (2004-03-24 22:32) [22]

Мое конечно ИМХО, но самое оптимальное сделать в FAQ так:
в самом начале привести рабочий пример(хотябы из текущего FAQ), а далее, если человек захотел разобраться, привести вот такое подробное описание (если оно есть конечно)
тогда такой FAQ будет один из лучших...

---
Вот такое мое ИМХО


 
Rouse_ ©   (2004-03-24 22:32) [22]

Мое конечно ИМХО, но самое оптимальное сделать в FAQ так:
в самом начале привести рабочий пример(хотябы из текущего FAQ), а далее, если человек захотел разобраться, привести вот такое подробное описание (если оно есть конечно)
тогда такой FAQ будет один из лучших...

---
Вот такое мое ИМХО


 
TButton ©   (2004-03-24 22:38) [23]

[22]
ППКС


 
TButton ©   (2004-03-24 22:38) [23]

[22]
ППКС


 
panov ©   (2004-03-26 12:34) [24]

>Piter
>Rouse_ ©   (24.03.04 22:32) [22]

Принимаю за основу этот вариант.

Сначала будет полностью рабочий пример, затем статейка из топика.


 
panov ©   (2004-03-26 12:34) [24]

>Piter
>Rouse_ ©   (24.03.04 22:32) [22]

Принимаю за основу этот вариант.

Сначала будет полностью рабочий пример, затем статейка из топика.


 
panov ©   (2004-03-26 12:34) [25]

Возможно добавлю еще анимирование иконки.


 
panov ©   (2004-03-26 12:34) [25]

Возможно добавлю еще анимирование иконки.


 
panov ©   (2004-03-26 19:55) [26]

Если ответы на вопросы в FAQ будут выглядеть примерно так:

http://home.ural.ru/~panov/icontray.html

Пойдет такой вариант приподнесения информации?


 
panov ©   (2004-03-26 19:55) [26]

Если ответы на вопросы в FAQ будут выглядеть примерно так:

http://home.ural.ru/~panov/icontray.html

Пойдет такой вариант приподнесения информации?


 
Rouse_ ©   (2004-03-26 20:15) [27]

Мои пожелания:
во первых шрифт нужно бы сделать одинаковым
во вторых полее наглядно когда код находится на другом фоне, сразу видно где код а где объяснение...

PS: Вообщето оформление кода и текста, а также ссылок на дополнительную информацию, принятое в MSDN, считаю наиболее идеальным


 
Rouse_ ©   (2004-03-26 20:15) [27]

Мои пожелания:
во первых шрифт нужно бы сделать одинаковым
во вторых полее наглядно когда код находится на другом фоне, сразу видно где код а где объяснение...

PS: Вообщето оформление кода и текста, а также ссылок на дополнительную информацию, принятое в MSDN, считаю наиболее идеальным


 
panov ©   (2004-03-26 20:24) [28]

Имелась ввиду схема подачи информации-)
оформление будет в едином стиле, как сейчас в FAQ.


 
panov ©   (2004-03-26 20:24) [28]

Имелась ввиду схема подачи информации-)
оформление будет в едином стиле, как сейчас в FAQ.


 
Rouse_ ©   (2004-03-26 20:33) [29]

Смема самая идеальная - краткое описание - пример - полное обьяснение...

ИМХО можно добавить несколько ссылок в конце на сторонние статьи (если таковые существует)

т.е. 4 уровня подачи информации...


 
Rouse_ ©   (2004-03-26 20:33) [29]

Смема самая идеальная - краткое описание - пример - полное обьяснение...

ИМХО можно добавить несколько ссылок в конце на сторонние статьи (если таковые существует)

т.е. 4 уровня подачи информации...


 
panov ©   (2004-04-02 19:15) [30]



 
panov ©   (2004-04-02 19:15) [30]



 
VMcL ©   (2004-04-02 20:54) [31]

>>Piter ©  (24.03.04 18:56) [1]
>есть всего лишь одна функция - Shell_NotifyIcon

Вообще-то две: Shell_NotifyIconA (Shell_NotifyIcon) и Shell_NotifyIconW.


 
VMcL ©   (2004-04-02 20:54) [31]

>>Piter ©  (24.03.04 18:56) [1]
>есть всего лишь одна функция - Shell_NotifyIcon

Вообще-то две: Shell_NotifyIconA (Shell_NotifyIcon) и Shell_NotifyIconW.


 
Игорь Шевченко ©   (2004-04-02 21:15) [32]

panov ©   (26.03.04 19:55)

Шрифт глаза режет. Может, лучше с такими же настройками, как в форуме ?


 
Игорь Шевченко ©   (2004-04-02 21:15) [32]

panov ©   (26.03.04 19:55)

Шрифт глаза режет. Может, лучше с такими же настройками, как в форуме ?


 
panov ©   (2004-04-02 21:47) [33]

>Игорь Шевченко ©   (02.04.04 21:15) [32]

Да там просто выложен пример подачи информации(верстка) в FAQ будет по-другому-)


 
panov ©   (2004-04-02 21:47) [33]

>Игорь Шевченко ©   (02.04.04 21:15) [32]

Да там просто выложен пример подачи информации(верстка) в FAQ будет по-другому-)


 
blackman ©   (2004-04-02 21:57) [34]

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/resources/menus/menure  ference/menufunctions/trackpopupmenu.asp
Page Cannot Be Found


 
blackman ©   (2004-04-02 21:57) [34]

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/resources/menus/menure  ference/menufunctions/trackpopupmenu.asp
Page Cannot Be Found


 
23423423   (2004-04-03 02:05) [35]

Удалено модератором


 
23423423   (2004-04-03 02:05) [35]

Удалено модератором


 
Иксик ©   (2004-04-03 13:28) [36]

Ребята, идеально. Я еще в ветке про 20 популярных вопросов хотел предложить давать развернутое объяснение, а то там начали обсуждать только куски кода. А так
Piter ©   (24.03.04 18:56) [1]
Rouse_ ©   (24.03.04 22:32) [22]
просто супер! Идеальный вариант!


 
Иксик ©   (2004-04-03 13:28) [36]

Ребята, идеально. Я еще в ветке про 20 популярных вопросов хотел предложить давать развернутое объяснение, а то там начали обсуждать только куски кода. А так
Piter ©   (24.03.04 18:56) [1]
Rouse_ ©   (24.03.04 22:32) [22]
просто супер! Идеальный вариант!


 
nikkie ©   (2004-04-03 13:39) [37]

>blackman
не первый день на форуме же... :)
скопировать в адресную строку браузера, удалить пробел.


 
nikkie ©   (2004-04-03 13:39) [37]

>blackman
не первый день на форуме же... :)
скопировать в адресную строку браузера, удалить пробел.


 
Piter ©   (2004-04-03 15:35) [38]

panov, я не то, чтобы самовлюбленный кретин... но в FAQ копирайты предусмотрены?


 
Piter ©   (2004-04-03 15:35) [38]

panov, я не то, чтобы самовлюбленный кретин... но в FAQ копирайты предусмотрены?


 
Думкин ©   (2004-04-03 15:40) [39]


> [38] Piter ©   (03.04.04 15:35)

Да, конечно. Но... что ты хочешь?


 
Думкин ©   (2004-04-03 15:40) [39]


> [38] Piter ©   (03.04.04 15:35)

Да, конечно. Но... что ты хочешь?


 
Piter ©   (2004-04-03 18:13) [40]

Панов, а это тобой написанный пример: http://home.ural.ru/~panov/icontray.html ?
Для FAQ"а пример, имхо, слишком сложен. И совершенно не понимаю - зачем WindowProc переназначать?!
Если хочешь все расписать (анимирование иконки и т.д.), то пиши лучше статью, nikkie там советовал о чем можно рассказать


 
Piter ©   (2004-04-03 18:13) [40]

Панов, а это тобой написанный пример: http://home.ural.ru/~panov/icontray.html ?
Для FAQ"а пример, имхо, слишком сложен. И совершенно не понимаю - зачем WindowProc переназначать?!
Если хочешь все расписать (анимирование иконки и т.д.), то пиши лучше статью, nikkie там советовал о чем можно рассказать



Страницы: 1 2 вся ветка

Форум: "Потрепаться";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.73 MB
Время: 0.033 c
14-1082109682
Voland2000
2004-04-16 14:01
2004.05.09
Nokia 8110-forever


3-1081927997
Вячеслав
2004-04-14 11:33
2004.05.09
Как получить выделенный текст в DBGrid


1-1082538504
M@X
2004-04-21 13:08
2004.05.09
Адресация порта Longint ?? Как?


1-1082430074
-Maximus-
2004-04-20 07:01
2004.05.09
PopupMenu


1-1082371215
Dimaz
2004-04-19 14:40
2004.05.09
Нужен способ определения - файл бинарный/нет.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский