Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.08.25;
Скачать: CL | DM;

Вниз

Свернуть окно   Найти похожие ветки 

 
Deltas ©   (2010-02-18 01:14) [0]

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


 
brother ©   (2010-02-18 06:47) [1]

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


 
DVM ©   (2010-02-18 11:06) [2]


> 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.



 
DVM ©   (2010-02-18 11:09) [3]

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

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


 
Deltas ©   (2010-02-18 11:30) [4]

Спасибо! :)



Страницы: 1 вся ветка

Текущий архив: 2013.08.25;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.009 c
2-1355671163
dummy_user
2012-12-16 19:19
2013.08.25
Странное поведение функции.


15-1363298274
Макс Черных
2013-03-15 01:57
2013.08.25
Видео "тестдрайва"


2-1355737828
aka
2012-12-17 13:50
2013.08.25
Задания на вычислительную практику


1-1311150598
FosterGrand
2011-07-20 12:29
2013.08.25
Сбой кодировки в ToolBar


15-1363829853
Дмитрий С
2013-03-21 05:37
2013.08.25
XE3 можно ли сделать, чтобы некоторые модули