Форум: "WinAPI";
Текущий архив: 2003.12.04;
Скачать: [xml.tar.bz2];
Внизпрограмма в Sys Tray-е Найти похожие ветки
← →
nika_ufc (2003-09-16 22:22) [0]этот код помешает программу в Sys Tray. У меня есть 2 вопроса:
1.в етом коде я не понимаю несколько строк (я их помечу жирным шрифтом), объясните их мне пожалуйста.
2.можно ли сделать это более простым методом (без компонента конечно) ?
unit uSysTray;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus;
const
WM_MYICONNOTIFY=WM_USER+123; //что это константа делает?
type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
RestoreItem: TMenuItem;
ExitItem: TMenuItem;
HideItem: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure RestoreItemClick(Sender: TObject);
procedure ExitItemClick(Sender: TObject);
procedure HideItemClick(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; // почему этим функциям приписани message WM_MYICONNOTIFY и 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;
{ TForm1 }
procedure TForm1.CreateTrayIcon(n: Integer);
var nidata:TNotifyIconData;
begin
with nidata do
begin
cbSize:=SizeOf(TNotifyIconData);
Wnd:=Self.Handle;
uID:=1;
uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
uCallBackMessage:=WM_MYICONNOTIFY;
hIcon:=Application.Icon.Handle;
StrpCopy(szTip,Application.Title);
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.HideMainForm;
begin
Application.ShowMainForm:=False;
ShowWindow(Application.Handle,SW_HIDE);
ShowWindow(Application.MainForm.Handle,SW_HIDE);
end;
procedure TForm1.RestoreMainForm; // ясно что этот обработчик активизирует мое приложение, но как оно это делает? и пожалуйста объсните этот обработчик досконально (PLEASE).
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.WMICON(var msg: TMessage);
var P:TPoint;
begin
case msg.LParam of
WM_LBUTTONUP:
begin
GetCursorPos(P);
SetForegroundWindow(Application.Mainform.Handle);
PopupMenu1.Popup(P.X,P.Y);
end;
WM_LBUTTONDBLCLK: RestoreItemClick(Self);
end;
end;
procedure TForm1.WMSYSCOMMAND(var msg: TMessage);
begin
inherited;
if (msg.WParam=SC_MINIMIZE) then HideItemClick(Self);
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;
CreateTrayIcon(1);
HideItem.Enabled:=True;
RestoreItem.Enabled:=False;
end;
procedure TForm1.HideItemClick(Sender: TObject);
begin
HideMainForm;
CreateTrayIcon(1);
HideItem.Enabled:=False;
RestoreItem.Enabled:=True;
end;
procedure TForm1.ExitItemClick(Sender: TObject);
begin
Close;
end;
end.
БОЛЬЩОЕ СПОСИБО ЗАРАНЕЕ.
← →
MBo (2003-09-17 07:20) [1]//что это константа делает?
Ничего не делает, просто объявлен уникальный номер сообщения, которое посылается при срабатывании трей-иконки - ты же используешь это здесь:
uCallBackMessage:=WM_MYICONNOTIFY;
>почему этим функциям приписани message WM_MYICONNOTIFY и message WM_SYSCOMMAND ?
Это ты назначил обработчики сообщений Windows с указанными номерами
← →
nika_ufc (2003-09-17 07:50) [2]>>>>>>>>>>>..
ясно что этот обработчик активизирует мое приложение, но как оно это делает? и пожалуйста объсните этот обработчик досконально (PLEASE).
procedure TForm1.RestoreMainForm; // ясно что этот обработчик активизирует мое приложение, но как оно это делает? и пожалуйста объсните этот обработчик досконально (PLEASE).
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;
← →
MBo (2003-09-17 08:33) [3]По этому поводу нужно читать книги - система обработки сообщений Windows и Delphi.
windows - для начала Петцольд, потом Рихтер.
Delphi - Конопка (если найдешь) и Тейксейра с Пачеко
Кратко - см. в хелпе SendMessage b PostMessage.
← →
nika_ufc (2003-09-17 08:41) [4]>>>>>>>>По этому поводу нужно читать книги - система обработки сообщений Windows и Delphi.
>>>>>>>windows - для начала Петцольд, потом Рихтер.
у меня есть Рихтер, но по англиский. если есть по русский (Documentation) скин на мило nika@ufc.ge буду благодарен.
← →
MBo (2003-09-17 08:48) [5]на мыло не буду.
www.podgoretsky.com
← →
microprogs (2003-10-11 23:52) [6]Скачал с этого сайта код для создания иконки в SysTray.
Почему-то не реботает (не знает типа TNotifyIconData), может
в uses еще что-то надо писать???
Можете написать .pas и .dpr файл для создания иконки в Ttay, ПЛЗ.
КОД:
function TaskBarAddIcon( hWindow : THandle; ID : Cardinal;
ICON : hicon; CallbackMessage : Cardinal; Tip : String ) : Boolean;
var
NID : TNotifyIconData;
begin
FillChar( NID, SizeOf( TNotifyIconData ), 0 );
with NID do begin
cbSize := SizeOf( TNotifyIconData );
Wnd := hWindow;
uID := ID;
uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
uCallbackMessage := CallbackMessage;
hIcon := Icon;
if Length( Tip ) > 63 then SetLength( Tip, 63 );
StrPCopy( szTip, Tip );
end;
Result := Shell_NotifyIcon( NIM_ADD, @NID );
end;
← →
jonni (2003-10-12 00:03) [7]uses ShellApi
← →
Аскар (2003-10-12 00:55) [8]Никак нельзя но есть компонент которы решит твой проблеммы
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.12.04;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.004 c