Конференция "WinAPI" » Свернуть окно [D5, WinXP]
 
  • Deltas © (18.02.10 01:14) [0]
    Когда главное окно сворачивается, то показывается анимация его уменьшения по направлению к соответсвующей ему кнопке на панели задач. Подскажите, пожалуйста, как сделать так, чтобы окно уменьшалось по направлению к области уведомлений (системному трею), так, если бы соответствующая кнопка панели задач была в правом нижнем углу экрана. Такую фишку провернули в Касперском 5.
  • brother © (18.02.10 06:47) [1]
    Кажется была подобная тема, попробуй поиск по сайту...
  • DVM © (18.02.10 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 © (18.02.10 11:09) [3]
    Ах, да, забыл сказать, код выше заставит все окна сворачиваться в угол, если надо свое только окно, то проверять надо WindowHandle в:

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

  • Deltas © (18.02.10 11:30) [4]
    Спасибо! :)
 
Конференция "WinAPI" » Свернуть окно [D5, WinXP]
Есть новые Нет новых   [134432   +18][b:0][p:0.004]