27.02.2008, 12:59
|
Специалист
|
|
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
|
|
Код:
const
{ Сообщения от пиктограммы на панели задач }
IconMessage = WM_User + 300;
type
TfmMain = class(TForm)
pmIcon: TPopupMenu; // Меню для пиктограммы
pmIconSetup: TMenuItem;
pmIconabout: TMenuItem;
pmIconClose: TMenuItem;
...
private
{ Private declarations }
FIcon: TIcon; // Новая пиктограмма
FiOldIcon: Integer; // Старая пиктограмма
...
procedure OnWinIconMes(var AMessage: TMessage); message IconMessage;
function TrayMessage(const iList: Integer; const dwMessage, Flags: LongWord): Boolean;
...
procedure TfmMain.FormCreate(Sender: TObject);
...
FIcon:= TIcon.Create;
FiOldIcon:= 0;
TrayMessage(FiOldIcon, NIM_Add, NIF_ICON or NIF_MESSAGE or NIF_TIP);
...
end;
procedure TfmMain.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
...
{ Icon }
FiOldIcon:= 0;
TrayMessage(FiOldIcon, NIM_Delete, 0);
end;
procedure TfmMain.FormDestroy(Sender: TObject);
begin
FIcon.Free;
end; // FormDestroy
function TfmMain.TrayMessage(const iList: Integer;
const dwMessage, Flags: LongWord): Boolean;
var
tnd: TNotifyIconData;
begin
with tnd do
begin
cbSize:= SizeOf(TNotifyIconData);
Wnd:= Handle;
uID:= 1;
uFlags:= Flags;
uCallbackMessage:= IconMessage;
ImageList1.GetIcon(iList, FIcon); { В ImageList1 поместить разные пиктограммки, iList - это номер }
hIcon:= FIcon.Handle;
szTip:= 'Всплывающее название'#0;
end;
Result:= Shell_NotifyIcon(dwMessage, @tnd);
end; // TrayMessage
{ Я решаю менять пиктограмму или нет в таймере }
procedure TfmMain.TimerUpdateTimer(Sender: TObject);
var
iNewIcon: Integer;
begin
iNewIcon:= по какому-то правилу;
if iNewIcon <> FiOldIcon then
begin
FiOldIcon:= iNewIcon; // Запоминаем новое состояние пиктограммы
TrayMessage(FiOldIcon, NIM_Modify, NIF_ICON);
end;
end; // TimerUpdateTimer
procedure TfmMain.OnWinIconMes(var AMessage: TMessage);
var P: TPoint;
begin
case AMessage.LParam of
WM_LButtonDown:
begin
{ SetForegroundWindow(Handle);
GetCursorPos(P);
pmIcon.Popup(P.X, P.Y);}
end;
WM_LButtonDblClk:
begin
SetForegroundWindow(Handle);
pmIcon.Items[0].Click; // Пункт меню по умолчанию
end;
WM_RButtonDown:
begin
SetForegroundWindow(Handle);
GetCursorPos(P);
pmIcon.Popup(P.X, P.Y);
end;
end; // case AMessage.LParam
end; // OnWinIconMes
Это вырезка. Извините, если что-то забыл указать
|