Когда Вы закрываете приложение, которое отображается в трее, приложение фактически не закрывается, а просто скрывается окно. Приложение остается работать в трее. Нет никакого визуального отображения, которое бы отображало - свернуто приложение или нет.
Мы можем изменить это поведение, используя функцию DrawAnimatedRects из Windows API.
unit UTrayZoom;
interface
uses
Windows;
type
TTrayZoom = class(TObject)
private
class function GetTrayRect: TRect;
class procedure DoZoom(const Wnd: HWND; const Src, Dest: TRect);
public
class procedure ZoomToTray(const Wnd: HWND);
class procedure ZoomFromTray(const Wnd: HWND);
end;
implementation
class procedure TTrayZoom.DoZoom(const Wnd: HWND; const Src, Dest: TRect);
begin
DrawAnimatedRects(Wnd, IDANI_CAPTION, Src, Dest);
end;
class function TTrayZoom.GetTrayRect: TRect;
var
TaskbarWnd, TrayWnd: HWND;
begin
TaskbarWnd := FindWindow('Shell_TrayWnd', nil);
TrayWnd := FindWindowEx(TaskbarWnd, 0, 'TrayNotifyWnd', nil);
GetWindowRect(TrayWnd, Result);
end;
class procedure TTrayZoom.ZoomFromTray(const Wnd: HWND);
var
WndRect: TRect;
begin
GetWindowRect(Wnd, WndRect);
DoZoom(Wnd, GetTrayRect, WndRect);
end;
class procedure TTrayZoom.ZoomToTray(const Wnd: HWND);
var
WndRect: TRect;
begin
GetWindowRect(Wnd, WndRect);
DoZoom(Wnd, WndRect, GetTrayRect);
end;
end.
Метод DoZoom просто посылает запрос к DrawAnimatedRects. GetTrayRect получает прямоугольник области панели задач.
Два метода ZoomToTray и ZoomFromTray изменяют масштаб изображения указанного окна. Параметр Wnd для этих методов должен быть дескриптором окна формы, для которой Вы изменяете размер.
Использование
Когда Ваше приложение разворачивается из трея, вызывается TTrayZoom.ZoomFromTray . Вы можете сделать это в обработчике события OnClick.
Когда Ваше приложение сворачивается в трей, вызывается метод TTrayZoom.ZoomToTray . Это может быть сделано в событиях OnClose или OnCloseQuery формы.
Автор: Peter Johnson
|