Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
6-11693
Igorek
2003-10-03 11:45
2003.12.04
Проблема с TServerSocket


4-11740
tim
2003-10-07 10:58
2003.12.04
Как правильно организовать поток?


14-11703
electric
2003-11-12 20:12
2003.12.04
$$$ Money $$$


9-11574
GDI
2003-04-18 18:09
2003.12.04
BSP и GLScene


14-11700
Думкин
2003-11-13 04:53
2003.12.04
С днем рождения! 13 ноября.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский