Программирование - это просто
Advertisement
Главная arrow Уроки программирования arrow Delphi: Маленькие хитрости arrow Как в Delphi 7 вывести значек (иконку) программы в область уведомлений.
29.05.2024 г.
Главное меню
Главная
Интернет магазин
Программные продукты
Биржевые роботы
Искусственный интеллект
Математика и информатика
1С:Предприятие
Уроки C#
Уроки Delphi
Уроки программирования
Web-программирование
Дизайн и графика
Компьютер для блондинок
Исходники
Статьи
Платный раздел
Рассказы про компьютеры
Хитрости и секреты
Системный подход
Размышления
Наука для чайников
Друзья сайта
Excel-это не сложно
Все о финансах
.
Как в Delphi 7 вывести значек (иконку) программы в область уведомлений. Печать E-mail
Автор megabax   
05.07.2009 г.

Как в  Delphi 7 вывести значек (иконку) программы в область уведомлений.

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

 

Delphi 7 компоненты notify область уведомлений иконка значек

 

И так, создаем проект, называем форму frmNotifyIcon, в свойство Caption пишем значение «Пример работы с областью уведомления».

Теперь положим на форму PopupMenu и назовем его pmMenu**.

 

Delphi 7 компоненты notify область уведомлений иконка значек

 

В Object Inspector-е найдем для добавленного компонента свойство Items, откроем редактор свойства, введем всплывающее меню**:

 

Delphi 7 компоненты notify область уведомлений иконка значек

 

А теперь займемся программированием. Откроем модуль формы, нажав на кнопку Toggle Form/Unit**:

 

Delphi 7 компоненты notify область уведомлений иконка значек

 

Тем самым мы переключимся на окно редактирования программы.

Найдем раздел type. Перед ним вставим объявление константы:

 

const

 WM_MYICONNOTIFY = WM_USER + 123;

 

 Далее, в подразделе private самого разедела type, сразу после комментария { Private declarations } вставим объявление переменной ShownOnce:

 

  private

    { Private declarations }

    ShownOnce: Boolean;

 

В подразделе public мы объявим нужные нам процедуры:

 

    { Public declarations }

    procedure WMICON(var msg: TMessage); message WM_MYICONNOTIFY;

    procedure WMSYSCOMMAND(var msg: TMessage);message WM_SYSCOMMAND;

    procedure RestoreMainForm;

    procedure CreateTrayIcon;

    procedure HideMainForm;

    procedure DeleteTrayIcon;

 

 

Теперь опишем процедуру    procedure WMICON(var msg: TMessage); message WM_MYICONNOTIFY;

 

procedure TfrmNotifyIcon.WMICON(var msg: TMessage);

var P : TPoint;

begin

 case msg.LParam of         // обработка обратных сообщений

 WM_LBUTTONUP:             //по нажатию левой клавиши, WM_RBUTTONUP по правой

  begin

   GetCursorPos(p);

   SetForegroundWindow(Application.MainForm.Handle);

   pmMenu.Popup(P.X, P.Y);                         

  end;

 WM_LBUTTONDBLCLK : messageDlg('Программа пример иконки в области уведомлений',mtInformation,[mbOk],0);

 end;

end;

 

В этой процедуре мы обрабатываем сообщение от области уведомления. Проверяем, нажата ли клавиша мыши. Если нажата, то определяем координаты курсора мыши:

 

GetCursorPos(p);

 

Затем мы переводим наше приложение на передний план:

 

SetForegroundWindow(Application.MainForm.Handle);

 

И активизируем всплывающее меню в точке, где пользователь кликнул мышкой

 

pmMenu.Popup(P.X, P.Y);                   

 

Если у нас двойной щелчок мыши, то мы просто выводим демонтсрационное сообщение

 

WM_LBUTTONDBLCLK : messageDlg('Программа пример иконки в области уведомлений',mtInformation,[mbOk],0);

 

 

Теперь перейдем к описанию процедуры WMSYSCOMMAND(var msg: TMessage);message WM_SYSCOMMAND;

 

 

procedure TfrmNotifyIcon.WMSYSCOMMAND(var msg: TMessage);

begin

 inherited; //обработка минимизирвания окна, не сворачевается а скрывается

 if (Msg.wParam=SC_MINIMIZE) then itHideClick(Self);

end;

 

В этой процедуре мы проверяем событие минимизации окна. Обычно, когда пользователь нажимает на кнопку окна «Свернуть», то окно минимизируется, тоесть, сворачивается. Но здесь мы сделаем, что бы оно  просто исчезало. Для этого используем процедуру itHideClick, которая у нас будет обработчиком события OnClick пункта меню itHide. Давайте напишем его:

 

procedure TfrmNotifyIcon.itHideClick(Sender: TObject);

begin

 HideMainForm;

 CreateTrayIcon;

 itHide.Enabled := False;

 itRestore.Enabled := True;

end;

 

В этом обработчике мы делаем окно программы невидимым, создаем в области уведомления иконку, делаем пункт itHide недоступным, а itRestore наоборот, действующим.

Процедура HideMainForm у нас еще не описана. Давайте опишем ее:

 

procedure TfrmNotifyIcon.HideMainForm;

begin

  //при сокрытии окна

  Application.ShowMainForm := False;

  ShowWindow(Application.Handle, SW_HIDE);

  ShowWindow(Application.MainForm.Handle, SW_HIDE);

end;

 

Теперь перейдем к процедуре создания иконки:

 

procedure TfrmNotifyIcon.CreateTrayIcon;

var nidata : TNotifyIconData;

begin

 with nidata do

  begin

   cbSize := SizeOf(TNotifyIconData);

   Wnd := Self.Handle; //HWND вашего окна (окна принимающего обратные сообщения)

   uID := 1;          // номер значка

   uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP; //обрабатываемые флаги

   uCallBackMessage := WM_MYICONNOTIFY;

   hIcon := Application.Icon.Handle;   // то откуда сдергивается значок

                                     // это может быть и ImageList и т.д.

   StrPCopy(szTip,Application.Title);  // всплывающая строка,

    // может быть любой string главное с нулевым окончанием

  end;

  Shell_NotifyIcon(NIM_ADD, @nidata);    // добавление значка

end;

 

В этой процедуре мы заполняем структуру TNotifyIconData и передаем ее встроенной процедуре Shell_NotifyIcon, которая, собственно говоря, и создает иконку окна уведомления.

 

Теперь опишем процедуру удаления иконки из области уведомления:

 

procedure TfrmNotifyIcon.DeleteTrayIcon;

var nidata : TNotifyIconData;

begin

 with nidata do

  begin

   cbSize := SizeOf(TNotifyIconData);

   Wnd := Self.Handle;

   uID := 1;

  end;

  Shell_NotifyIcon(NIM_DELETE, @nidata);   // удаление значка

end;

 

Как и в предыдущей процедуре, заполняем TNotifyIconData и вызываем Shell_NotifyIcon но уже с командой удалить NIM_DELETE.

 

У нас осталась неописанная процедура RestoreMainForm. Опишем и ее тоже:

 

procedure TfrmNotifyIcon.RestoreMainForm;

var i,j : Integer;

begin

  Application.ShowMainForm := True;

  ShowWindow(Application.Handle, SW_RESTORE);

  ShowWindow(Application.MainForm.Handle, SW_RESTORE);

  if not ShownOnce then

  begin

    for I := 0 to Application.MainForm.ComponentCount -1 do

      if Application.MainForm.Components[I] is TWinControl then

        with Application.MainForm.Components[I] as TWinControl do

          if Visible then

          begin

            ShowWindow(Handle, SW_SHOWDEFAULT);

            for J := 0 to ComponentCount -1 do

              if Components[J] is TWinControl then

                ShowWindow((Components[J] as TWinControl).Handle, SW_SHOWDEFAULT);

          end;

    ShownOnce := True;

  end;

end;

 

 

В этой процедуре мы посылаем окну и приложению команду , SW_RESTORE

 

  Application.ShowMainForm := True;

  ShowWindow(Application.Handle, SW_RESTORE);

  ShowWindow(Application.MainForm.Handle, SW_RESTORE);

 

Затем проверяем, не показывалось ли наше окно раньше. Если нет то перебираем все компоненты главного окна, делая их видимыми.

 

Процедуры описали. Теперь займемся написанием обработчиков событий. Обработчик события OnClick пункта меню itHide у нас уже есть. Напишем такой же обработчик для itRestore:

 

procedure TfrmNotifyIcon.itRestoreClick(Sender: TObject);

begin

 RestoreMainForm;

 itRestore.Enabled := False;

 itHide.Enabled := True;

end;

 

В этом обработчике мы вызываем процедуру делания формы видимой (ту самую, где перебираются все компоненты), затем делаем неактивным пункт itRestore и доступным itHide.

 

Обработчик OnClick пункта меню itExit («Выход») самый простой, тут всего одна команда – закрыть окно:

 

procedure TfrmNotifyIcon.itExitClick(Sender: TObject);

begin

  Close;

end;

 

Теперь займемся событиями формы. В OnCreate нам нужно создать иконку и установить начальные параметры:

 

procedure TfrmNotifyIcon.FormCreate(Sender: TObject);

begin

 ShownOnce:= False;

 CreateTrayIcon;

 itRestore.Enabled := False;

end;

 

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

 

procedure TfrmNotifyIcon.FormDestroy(Sender: TObject);

begin

  DeleteTrayIcon;

end;

 

Все, программа написана, ее исходник находиться здесь.

 

Запустим программу, увидим вот такое окно:

 

Delphi 7 компоненты notify область уведомлений иконка значек

 

А в области уведомления у нас появиться  иконка*:

 

Delphi 7 компоненты notify область уведомлений иконка значек

 

Щелкните на ней и появится меню*:

 

Delphi 7 компоненты notify область уведомлений иконка значек

Выйдите из программы, иконка исчезнет. Если кликните по иконе два раза, должно выйти сообщение:

 

 

http://easyprog.ru/index.php?option=com_content&task=view&id=28&Itemid=29

 

Давайте так же протестируем, что при выборе пункта меню «Скрыть» окно программы исчезает и становиться доступным пункт «Восстановить». При выборе пункта «Восстановить» окно снова появляется, пункт «Восстановить» становиться недоступным, а пункт «Скрыть» доступным. Проверим, что при нажатии на кнопку «Свернуть»

 

Delphi 7 компоненты notify область уведомлений иконка значек

 

Окно не сворачивается, а исчезает, но его можно восстановить через иконку в области уведомления.

 

Теперь давайте поэкспериментируем. Закомментим (удалим) строку

 

DeleteTrayIcon;

 

из FormDestroy:

 

procedure TfrmNotifyIcon.FormDestroy(Sender: TObject);

begin

//  DeleteTrayIcon;

end;

 

 

Запустим и закроем программу несколько раз. Теперь иконка из области уведомления у нас не исчезает*.

 

Delphi 7 компоненты notify область уведомлений иконка значек

 

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

 


Скриншоты, помеченные знаком * , являются цитатами и иллюстрациями  программного продукта "Microsoft Windows", авторское право на который принадлежит "Microsoft".

Скриншоты, помеченные знаком ** , являются цитатами и иллюстрациями  программного продукта "Delphi", авторское право на который принадлежит "Borland Software Corporation".


 

 

Последнее обновление ( 16.11.2011 г. )
 
« След.   Пред. »
 
© 2024 Программирование - это просто
Joomla! - свободное программное обеспечение, распространяемое по лицензии GNU/GPL.
Русская локализация © 2005-2008 Joom.Ru - Русский Дом Joomla!
Design by Mamboteam.com | Powered by Mambobanner.de
Я принимаю Яндекс.Деньги