Для начала объявим модуль и новый тип, которые необходимы для нашей работы:
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.
|