Неверов Евгений Викторович
QR-код
Меню сайта
Категории раздела
Программирование на языке Паскаль [27]
В данной категории представлены новые функции, созданные на языке Паскаль, которые могут пригодиться при написании своих программ
Программирование на Delphi [18]
В данной категории представлены полезные подпрограммы, которые могут пригодиться при написании своих программ, а также рассматриваются примеры готовых проектов, создаваемых в среде программирования Delphi
Программирование на HTML [1]
В данной категории рассматриваются примеры готовых проектов, создаваемых на языке HTML
Мои программы [1]
Описание разработанных автором программ.
Online-программы [2]
Прочее [42]
Свободная тематика
Мини-чат
200
Наш опрос
Как Вы думаете, сколько времени люди проживут на Земле?
Всего ответов: 62
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Операции с иконками на панели задач

Для начала объявим модуль и новый тип, которые необходимы для нашей работы:


uses ShellAPI;

type
   TDUMMYUNIONNAME = record
   case Integer of
      0: (uTimeout: UINT);
      1: (uVersion: UINT);
   end;
   TNewNotifyIconData = record
      cbSize: DWORD;
      Wnd: HWND;
      uID: UINT;
      uFlags: UINT;
      uCallbackMessage: UINT;
      hIcon: HICON;
      szTip: array[0..127] of Char;
      dwState: DWORD;
      dwStateMask: DWORD;
      szInfo: array[0..255] of Char;
      DUMMYUNIONNAME: TDUMMYUNIONNAME;
      szInfoTitle: array[0..63] of Char;
      dwInfoFlags: DWORD;
 end;

1. Создание иконки на панели задач


procedure IkonNaPZSozdat(Form: TForm; Icon: TIcon; nomer: integer;
   hint: string);
var nidata: TNewNotifyIconData;
begin
   With nidata do
   begin
      cbSize:=SizeOf(nidata);
      Wnd:=Form.Handle;
      uID:=nomer;
      uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
      uCallBackMessage:=WM_USER;
      hIcon:=Icon.Handle;
      StrPCopy(szTip, hint);
   end;
   Shell_NotifyIcon(NIM_ADD, @nidata);
end;

где

Form - форма приложения;

Icon - иконка в виде рисунка (она отображается на панели задач);

nomer - идентификационный номер иконки;

hint - текст в виде всплывающей подсказки.

Например, IkonNaPZSozdat(Form1, Application.Icon, 2, 'Иконка на панели задач').


2. Изменение иконки


procedure IkonNaPZIzmenit(Form: TForm; Icon: TIcon; nomer: integer;
   hint: string);
var nidata: TNewNotifyIconData;
begin
   With nidata do
   begin
      cbSize:=SizeOf(nidata);
      Wnd:=Form.Handle;
      uID:=nomer;
      uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
      uCallBackMessage:=WM_USER;
      hIcon:=Icon.Handle;
      StrPCopy(szTip, hint);
   end;
   Shell_NotifyIcon(NIM_MODIFY, @nidata);
end;

Например, IkonNaPZIzmenit(Form1, Application.Icon, 2, 'Изменение иконки на ПЗ'). Здесь изменили текст всплывающей подсказки.


3. Сообщение программы на панели задач


procedure IkonNaPZSoobschenie(Form: TForm; Icon: TIcon; nomer: integer;
   ImagePicture: DWORD; zagolowok, soobschenie: string);
var nidata: TNewNotifyIconData;
begin
   With nidata do
   begin
      cbSize:=SizeOf(nidata);
      Wnd:=Form.Handle;
      uID:=nomer;
      uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP or $10;
      uCallBackMessage:=WM_USER;
      hIcon:=Icon.Handle;
      StrPCopy(szInfo, soobschenie);
      StrPCopy(szInfoTitle, zagolowok);
      dwInfoFlags:=ImagePicture;
   end;
   Shell_NotifyIcon(NIM_MODIFY, @nidata);
end;

где

ImagePicture - номер значка сообщения, значения которых даны ниже:

0 - нет иконки,

1 - информация,

2 - внимание,

3 - ошибка,

4 - значок программы,

5 и более - другие значки;

zagolowok - заголовок сообщения;

soobschenie - текст сообщения.

Например, IkonNaPZSoobschenie(Form1, Application.Icon, 2, 3, 'Сообщение', 'Образец сообщения').


4. Наведение мыши на иконку


В типе TForm1 создать процедуру WMICON, которая будет выполняться при манипуляциях мыши на иконках:


type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Image1: TImage;
    procedure FormCreate(Sender: TObject);
    procedure WMICON(var msg: TMessage); message WM_USER;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

...

procedure TForm1.WMICON(var msg: TMessage);
begin
   Label1.Caption:=Format('ID = %d, Signal = %d', [msg.WParam, msg.LParam]);
end;

...

где

msg - переменная типа TMessage, следующие свойства которых необходимы для обработки:

msg.WParam - идентификационный номер иконки,

msg.LParam - числовой код, основные значения которых даны ниже:

WM_MOUSEMOVE - наведена мышь на иконку,

WM_LBUTTONDOWN - нажата левая кнопка мыши на иконке,

WM_LBUTTONDBLCLK - двойной щелчок левой кнопки мыши на иконке,

WM_RBUTTONDOWN - нажата правая кнопка мыши на иконке,

WM_RBUTTONDBLCLK - двойной щелчок правой кнопки мыши на иконке,

1028 - щелчок правой кнопки мыши по всплывающему сообщению программы,

1029 - щелчок левой кнопки мыши по всплывающему сообщению программы.


5. Удаление иконки


procedure IkonNaPZUdalit(Form: TForm; nomer: integer);
var nidata: TNewNotifyIconData;
begin
   With nidata do
   begin
      cbSize:=SizeOf(nidata);
      Wnd:=Form.Handle;
      uID:=nomer;
   end;
   Shell_NotifyIcon(NIM_DELETE, @nidata);
end;

Например, IkonNaPZUdalit(Form1, 2).


6. Программа


Рассмотрим программу, позволяющую делать любые операции с иконками на панели задач.


unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    PopupMenu1: TPopupMenu;
    procedure FormCreate(Sender: TObject);
    procedure WMICON(var msg: TMessage); message WM_USER;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure N1Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure N3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses ShellAPI;

type
   TDUMMYUNIONNAME = record
   case Integer of
      0: (uTimeout: UINT);
      1: (uVersion: UINT);
   end;
   TNewNotifyIconData = record
      cbSize: DWORD;
      Wnd: HWND;
      uID: UINT;
      uFlags: UINT;
      uCallbackMessage: UINT;
      hIcon: HICON;
      szTip: array[0..127] of Char;
      dwState: DWORD;
      dwStateMask: DWORD;
      szInfo: array[0..255] of Char;
      DUMMYUNIONNAME: TDUMMYUNIONNAME;
      szInfoTitle: array[0..63] of Char;
      dwInfoFlags: DWORD;
   end;

procedure IkonNaPZSozdat(Form: TForm; Icon: TIcon; nomer: integer;
   hint: string);
var nidata: TNewNotifyIconData;
begin
   With nidata do
   begin
      cbSize:=SizeOf(nidata);
      Wnd:=Form.Handle;
      uID:=nomer;
      uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
      uCallBackMessage:=WM_USER;
      hIcon:=Icon.Handle;
      StrPCopy(szTip, hint);
   end;
   Shell_NotifyIcon(NIM_ADD, @nidata);
end;

procedure IkonNaPZIzmenit(Form: TForm; Icon: TIcon; nomer: integer;
   hint: string);
var nidata: TNewNotifyIconData;
begin
   With nidata do
   begin
      cbSize:=SizeOf(nidata);
      Wnd:=Form.Handle;
      uID:=nomer;
      uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
      uCallBackMessage:=WM_USER;
      hIcon:=Icon.Handle;
      StrPCopy(szTip, hint);
   end;
   Shell_NotifyIcon(NIM_MODIFY, @nidata);
end;

procedure IkonNaPZSoobschenie(Form: TForm; Icon: TIcon; nomer: integer;
   ImagePicture: DWORD; zagolowok, soobschenie: string);
var nidata: TNewNotifyIconData;
begin
   With nidata do
   begin
      cbSize:=SizeOf(nidata);
      Wnd:=Form.Handle;
      uID:=nomer;
      uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP or $10;
      uCallBackMessage:=WM_USER;
      hIcon:=Icon.Handle;
      StrPCopy(szInfo, soobschenie);
      StrPCopy(szInfoTitle, zagolowok);
      dwInfoFlags:=ImagePicture;
   end;
   Shell_NotifyIcon(NIM_MODIFY, @nidata);
end;

procedure IkonNaPZUdalit(Form: TForm; nomer: integer);
var nidata: TNewNotifyIconData;
begin
   With nidata do
   begin
      cbSize:=SizeOf(nidata);
      Wnd:=Form.Handle;
      uID:=nomer;
   end;
   Shell_NotifyIcon(NIM_DELETE, @nidata);
end;

procedure TForm1.FormCreate(Sender: TObject);
var Items: array[0..3] of TMenuItem;
begin
   Image1.Picture.LoadFromFile('E:\1.ico');
   IkonNaPZSozdat(Form1, Application.Icon, 1, 'Иконка приложения');
   IkonNaPZSozdat(Form1, Image1.Picture.Icon, 5, 'Иконка файла *.ico');
   Items[0]:=TMenuItem.Create(PopupMenu1);
   Items[0].Caption:='Скрыть окно';
   Items[0].OnClick:=Form1.N1Click;
   PopupMenu1.Items.Add(Items[0]);
   Items[1]:=TMenuItem.Create(PopupMenu1);
   Items[1].Caption:='Отобразить окно';
   Items[1].OnClick:=Form1.N2Click;
   PopupMenu1.Items.Add(Items[1]);
   Items[2]:=TMenuItem.Create(PopupMenu1);
   Items[2].Caption:='-';
   PopupMenu1.Items.Add(Items[2]);
   Items[3]:=TMenuItem.Create(PopupMenu1);
   Items[3].Caption:='Закрыть программу';
   Items[3].OnClick:=Form1.N3Click;
   PopupMenu1.Items.Add(Items[3]);
end;

procedure TForm1.WMICON(var msg: TMessage);
var P: TPoint;
begin
   If (msg.WParam=1) and (msg.LParam=1028) then
      MessageBox(0, 'Вы щелкнули правой кнопкой мыши по всплывающему сообщению',
         'Окно', 0);
   If (msg.WParam=5) and ((msg.LParam=WM_LBUTTONDBLCLK) or
      (msg.LParam=WM_RBUTTONDBLCLK)) then
      Show;
   If (msg.WParam=5) and (msg.LParam=WM_RBUTTONDOWN) then
   begin
      GetCursorPos(P);
      PopupMenu1.Popup(P.X, P.Y);
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   IkonNaPZIzmenit(Form1, Image1.Picture.Icon, 1, 'Обмен иконок (ID = 1)');
   IkonNaPZIzmenit(Form1, Application.Icon, 5, 'Обмен иконок (ID = 5)');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
   IkonNaPZSoobschenie(Form1, Image1.Picture.Icon, 1, 2, 'Сообщение',
      'Образец сообщения. Можно щелкнуть по нему правой кнопкой мыши...');
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
   Hide;
   IkonNaPZSoobschenie(Form1, Application.Icon, 5, 1, 'Окно невидимо!',
      'Для отображения окна кликните ДВОЙНЫМ щелчком мыши на значок. Левая и правая '+
      'кнопка мыши не имеет значения!');
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
   IkonNaPZUdalit(Form1, 1);
   IkonNaPZUdalit(Form1, 5);
   Close;
end;

procedure TForm1.N1Click(Sender: TObject);
begin
   Button3Click(nil);
end;

procedure TForm1.N2Click(Sender: TObject);
begin
   Show;
end;

procedure TForm1.N3Click(Sender: TObject);
begin
   Button4Click(nil);
end;

end.

В этой программе рекомендуется нажимать кнопки по порядку.

При запуске программы иконки на панели задач будут выглядеть следующим образом:


После нажатия на первую кнопку произойдет обмен иконок:


После нажатия на вторую кнопку на панели задач появится всплывающая подсказка. По ней можно щелкнуть правой кнопкой мыши:


После нажатия на третью кнопку окно скроется и появится другая всплывающая подсказка:


После нажатия на четвертую (последнюю) кнопку иконки с панели задач удалятся, а программа закроется.

Примечание. При запуске программы необходимо наличие файла-иконки *.ico.

Категория: Программирование на Delphi | Добавил: newerow1989 (14.08.2016)
Просмотров: 2184 | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Вход на сайт
Поиск
Друзья сайта
Заработок в Интернете
Для начала необходим Электронный PAYEER® кошелек!
Copyright MyCorp © 2024
Версия для мобильных устройств. Яндекс.Метрика БКНС Анализ сайта