Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Иконка на TrayBar - пример

Delphi , Рабочий стол , TrayBar

Иконка на TrayBar - пример


unit shellUnit;

interface

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

const
  WM_MYICONNOTIFY = WM_USER + 123;

type
  TForm1 = class(TForm)
    PopupMenu1: TPopupMenu;
    RestoreItem: TMenuItem;
    N1: TMenuItem;
    FileExitItem1: TMenuItem;
    HideItem: TMenuItem;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure RestoreItemClick(Sender: TObject);
    procedure HideItemClick(Sender: TObject);
    procedure FileExitItem1Click(Sender: TObject);
  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 HideMainForm;
    procedure CreateTrayIcon(n: Integer);
    procedure DeleteTrayIcon(n: Integer);
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}
uses ShellApi, shlobj, registry;

procedure TForm1.WMICON(var msg: TMessage);
var
  P: TPoint;
begin
  case msg.LParam of // обработка обратных сообщений
    WM_LBUTTONUP: //по нажатию левой клавиши, WM_RBUTTONUP по правой
      begin
        GetCursorPos(p);
        SetForegroundWindow(Application.MainForm.Handle);
        PopupMenu1.Popup(P.X, P.Y);
      end;
    WM_LBUTTONDBLCLK: RestoreItemClick(Self); //как Default
  end;
end;

procedure TForm1.WMSYSCOMMAND(var msg: TMessage);
begin
  inherited; //обработка минимизирвания окна, не сворачевается а скрывается
  if (Msg.wParam = SC_MINIMIZE) then
    HideItemClick(Self);
end;

procedure TForm1.HideMainForm;
begin
  //при сокрытии окна
  Application.ShowMainForm := False;
  ShowWindow(Application.Handle, SW_HIDE);
  ShowWindow(Application.MainForm.Handle, SW_HIDE);
end;

procedure TForm1.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;

procedure TForm1.CreateTrayIcon(n: Integer);
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;

procedure TForm1.DeleteTrayIcon(n: Integer);
var
  nidata: TNotifyIconData;
begin
  with nidata do
  begin
    cbSize := SizeOf(TNotifyIconData);
    Wnd := Self.Handle;
    uID := 1;
  end;
  Shell_NotifyIcon(NIM_DELETE, @nidata); // удаление значка
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ShownOnce := False;
  CreateTrayIcon(1);
  HideItem.Enabled := False;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  DeleteTrayIcon(1);
end;

procedure TForm1.RestoreItemClick(Sender: TObject);
begin
  RestoreMainForm;
  //если убрать ремарку то при показывании основного окна значек исчезает
  //DeleteTrayIcon(1);
  RestoreItem.Enabled := False;
  HideItem.Enabled := True;
end;

procedure TForm1.HideItemClick(Sender: TObject);
begin
  HideMainForm;
  CreateTrayIcon(1);
  HideItem.Enabled := False;
  RestoreItem.Enabled := True;
end;

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

end.

{Также есть еще такая фигня Shell_NotifyIcon(NIM_Modify, @nidata) позволяет
менять уже установленный значек, не прибегая к его убиванию и построению заново}

Привет! Я перевёл текст на русский язык:

Это фрагмент кода Delphi, демонстрирующий создание иконки в трее и обработку связанных с ней событий. Вот разбивка кода:

  1. Класс TForm1 наследуется от TForm и имеет несколько методов для обработки событий, связанных с иконкой в трее.
  2. В методе WMICON код обрабатывает события нажатия левой кнопки мыши и двойного клика по иконке в трее, вызывая всплывающее меню на позиции курсора. Когда пользователь выбирает пункт меню, вызывается либо RestoreItemClick, либо HideItemClick.
  3. В методе WMSYSCOMMAND код обрабатывает событие минимизации окна, вызывая HideItemClick.
  4. Методы CreateTrayIcon и DeleteTrayIcon создают и удаляют иконку в трее соответственно.
  5. Метод FormCreate создает иконку в трее при создании формы.
  6. Метод FormDestroy удаляет иконку в трее при уничтожении формы.
  7. Методы RestoreItemClick и HideItemClick обрабатывают события восстановления основной формы и скрытия основной формы, вызывая соответственно RestoreMainForm или HideMainForm.

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

Вот некоторые предложения по улучшению кода:

  1. Рассмотрите использование более robust способа создания и управления иконкой в трее, например, использования третьей-сторонней библиотеки.
  2. Добавьте комментарии для объяснения цели каждого метода и переменной.
  3. Используйте более описательные имена переменных вместо одиночных буквенных переменных, таких как n или i.
  4. Рассмотрите добавление обработки ошибок в случаях, когда создание или удаление иконки в трее не удается.
  5. Вы можете также рассмотреть использование компонента TNotifyIcon, предоставляемого Delphi, который обеспечивает более простой способ создания и управления иконками в трее.

Вот пример рефакторинга кода:

type
  TForm1 = class(TForm)
    ...;
    procedure CreateTrayIcon;
    procedure DeleteTrayIcon;

    procedure RestoreItemClick(Sender: TObject);
    procedure HideItemClick(Sender: TObject);

    procedure HandleTrayIconMessage(var Msg: TMessage);
  end;

procedure TForm1.CreateTrayIcon;
begin
  // Создайте иконку в трее с иконкой приложения и заголовком
  TrayIcon := TNotifyIcon.Create(nil);
  TrayIcon.Icon.Assign(Application.Icon);
  TrayIcon.TipText := Application.Title;
end;

procedure TForm1.DeleteTrayIcon;
begin
  // Удалите иконку в трее
  TrayIcon.Free;
end;

procedure TForm1.RestoreItemClick(Sender: TObject);
begin
  // Восстановите основную форму и скрыть иконку в трее
  MainForm.Show;
  TrayIcon.Visible := False;
end;

procedure TForm1.HideItemClick(Sender: TObject);
begin
  // Скрыть основную форму и показать иконку в трее
  MainForm.Hide;
  TrayIcon.Visible := True;
end;

procedure TForm1.HandleTrayIconMessage(var Msg: TMessage);
begin
  case Msg.Msg of
    WM_LBUTTONDOWN:
      begin
        // Обработайте событие нажатия левой кнопки мыши
      end;
    WM_RBUTTONDOWN:
      begin
        // Обработайте событие нажатия правой кнопки мыши
      end;
    WM_LBUTTONDBLCLK:
      begin
        // Обработайте событие двойного клика по левой кнопке мыши
      end;
  end;
end;

Обратите внимание, что это только пример и может не работать в вашем конкретном случае. Вам нужно будет модифицировать код для соответствия вашим потребностям.

В статье рассмотрен пример создания иконки в области системы уведомлений (TrayBar) приложения Delphi. Показано, как добавлять, удалять и изменять иконку с помощью функций Shell_NotifyIcon.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: TrayBar ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 15:45:43/0.0062031745910645/1