Конференция "WinAPI" » DrawAnimatedRects не работает в Vista/Win7
 
  • POP (11.06.10 17:32) [0]
    Код ниже (анимация сворачивания в сторону Трея) работает под WinXP, но не работает под Vista/Win7 (форма просто исчезает, без анимации):


    var
    ARect: TRect;
    Wnd, Wnd2: HWND;

    begin
    Wnd:= FindWindow('Shell_TrayWnd', nil);
    Wnd2:= FindWindowEx(Wnd, 0, 'TrayNotifyWnd', nil);
    GetWindowRect(Wnd2, ARect);

    DrawAnimatedRects(Form1.Handle, IDANI_CAPTION, BoundsRect, ARect);
    ..



    FindWindow, FindWindowEx, GetWindowRect, DrawAnimatedRects отрабатывают без ошибок, проверял специально на результат каждую функцию.

    Работаю в Delphi 2007.

    Если установить Application.MainFormOnTaskbar:= true; и поставить DrawAnimatedRects(Application.MainForm.Handle, IDANI_CAPTION, BoundsRect, ARect); - то это ничего не меняет.

    В чем может быть причина неработоспособности?
  • POP (11.06.10 17:42) [1]
    Сейчас посмотрел, в LightAlloy, на который все ориентируются и говорят - вот, хочу такую же анимацию сворачивания в трей, и в том под Vista/Win7 не работает анимация.

    Надо разобраться.
  • DVM © (11.06.10 20:27) [2]
    вот погляди, альтернативный способ заставить окно сворачиваться туда куда тебе нужно:

    program shhook;

    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
              if PSHELLHOOKINFO(lParam)^.WindowHandle = wnd then
              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.

  • POP (11.06.10 20:30) [3]
    Нда.. слишком много кода.. надо разбираться.

    Но вот поднятая проблема интересует, неужели в Vista/Win7 функцию DrawAnimatedRects аннулировали.. такого не может быть.

    Вроде просто все.
  • Виталий____ (23.06.10 13:49) [4]
    Под вистой/семеркой у меня например криво работает AnimateWindow, так что скорей всего Ваш случай наоборот ничем не удивителен.
 
Конференция "WinAPI" » DrawAnimatedRects не работает в Vista/Win7
Есть новые Нет новых   [134431   +10][b:0][p:0.003]