Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Свернуть окно [D5, WinXP]


Deltas ©   (2010-02-18 01:14:00) 

Когда главное окно сворачивается, то показывается анимация его уменьшения по направлению к соответсвующей ему кнопке на панели задач. Подскажите, пожалуйста, как сделать так, чтобы окно уменьшалось по направлению к области уведомлений (системному трею), так, если бы соответствующая кнопка панели задач была в правом нижнем углу экрана. Такую фишку провернули в Касперском 5.


Deltas   (2010-02-18 11:30:00) [1]

Спасибо! :)


DVM   (2010-02-18 11:09:00) [2]

Ах, да, забыл сказать, код выше заставит все окна сворачиваться в угол, если надо свое только окно, то проверять надо WindowHandleв:

PSHELLHOOKINFO = ^TSHELLHOOKINFO;
TSHELLHOOKINFO = packed record
  WindowHandle: HWND;
  rc: TSmallRect;
end;


DVM   (2010-02-18 11:06:00) [3]


> Deltas ©


Ну раз уж Касперский провернул, то и мы смогем. Координаты области уведомлений или иконки вычислишь сам.

Как то так вот:


{******************************************************************************}
{* Демонстрация работы HSHELL_GETMINRECT                                      *}
{* (c)2003 Дмитрий Муратов                                                    *}
{* e-mail: dvmuratov@yandex.ru                                                *}
{* Данный код создан исключительно в демонстрационных целях                   *}
{******************************************************************************}

program ShellHookDemo;

uses
 Windows, Messages, SysUtils;

const
 RSH_DEREGISTER = 0;
 RSH_REGISTER = 1;
 RSH_REGISTER_PROGMAN = 2;
 RSH_REGISTER_TASKMAN = 3;

 HSHELL_ACTIVATESHELLWINDOW = 3;
 HSHELL_WINDOWCREATED = 1;
 HSHELL_WINDOWDESTROYED = 2;
 HSHELL_WINDOWACTIVATED = 4;
 HSHELL_GETMINRECT = 5;
 HSHELL_REDRAW = 6;
 HSHELL_TASKMAN = 7;
 HSHELL_LANGUAGE = 8;

type
 PSHELLHOOKINFO = ^TSHELLHOOKINFO;
 TSHELLHOOKINFO = packed record
   WindowHandle : HWND;
   rc: TSmallRect;
 end;

var
 wc: TWndClassEx;
 MainWnd: HWND;
 Mesg: TMsg;
 WM_ShellHook:Integer;
 xPos, yPos, nWidth, nHeight: Integer;
 osInfo: OSVERSIONINFO;

procedure RegisterShellHook(Wnd:hWnd;n:dword); stdcall;external 'shell32.dll' index 181;

//------------------------------------------------------------------------------

function WindowProc(wnd: HWND; Msg: Integer; Wparam: Wparam; Lparam: Lparam): Lresult; stdcall;
begin
 if msg = wm_shellhook then
   begin
     case wparam of
       HSHELL_GETMINRECT:
         begin
           with PSHELLHOOKINFO(lParam)^.rc do
             begin
               Left := 10;
               Top := 10;
               Right := 20;
               Bottom := 20;
             end;
           Result := 1;
         end
     else
       Result:=DefWindowProc(wnd,msg,wparam,lparam);
     end;
   end
 else
   case msg of
     wm_destroy :
       begin
         postquitmessage(0);
         Result := 0;
         exit;
       end;
   else
     Result := DefWindowProc(wnd, msg, wparam, lparam);
   end;
End;

//------------------------------------------------------------------------------

begin
 wc.cbSize:=sizeof(wc);
 wc.style:=cs_hredraw or cs_vredraw;
 wc.lpfnWndProc:=@WindowProc;
 wc.cbClsExtra:=0;
 wc.cbWndExtra:=0;
 wc.hInstance:=HInstance;
 wc.hIcon:=LoadIcon(0,idi_application);
 wc.hCursor:=LoadCursor(0,idc_arrow);
 wc.hbrBackground:=COLOR_BTNFACE+1;
 wc.lpszMenuName:=nil;
 wc.lpszClassName:='ShellHookDemo';
 if RegisterClassEx (wc) = 0 then
   MessageBox (0, 'Invalid class registration', 'Error', MB_OK)
 else
   begin
     xPos:=100; yPos:=150;
     nWidth:=430; nHeight:=250;
     MainWnd:=CreateWindowEx(
       0,
       'ShellHookDemo',
       'ShellHookDemo',
       ws_overlappedwindow,
       xPos,
       yPos,
       nWidth,
       nHeight,
       0,
       0,
       Hinstance,
       nil
       );
     if MainWnd = 0 then
       MessageBox (0, 'Window not created', 'Error', MB_OK)
     else
       begin
         ShowWindow(MainWnd,CmdShow);
         WM_ShellHook := RegisterWindowMessage('SHELLHOOK');
         if WM_ShellHook<>0 then
           begin
             osInfo.dwOSVersionInfoSize := sizeof(OSVERSIONINFO);
             GetVersionEx(osInfo);
             RegisterShellHook(0, 1);
             if(osInfo.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS) then
               RegisterShellHook(MainWnd, RSH_REGISTER)
             else
              RegisterShellHook(MainWnd, RSH_REGISTER_TASKMAN);
           end;

         SendMessage(GetDesktopWindow, $400, 0, 0);

         while GetMessage(Mesg,0,0,0) do
         begin
           TranslateMessage(Mesg);
           DispatchMessage(Mesg);
         end;

       end;
   end;
end.


brother   (2010-02-18 06:47:00) [4]

Кажется была подобная тема, попробуй поиск по сайту...


Наверх

Титульная страница Поиск, карта сайта Написать письмо