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

Вниз

DrawAnimatedRects не работает в Vista/Win7   Найти похожие ветки 

 
POP   (2010-06-11 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   (2010-06-11 17:42) [1]

Сейчас посмотрел, в LightAlloy, на который все ориентируются и говорят - вот, хочу такую же анимацию сворачивания в трей, и в том под Vista/Win7 не работает анимация.

Надо разобраться.


 
DVM ©   (2010-06-11 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   (2010-06-11 20:30) [3]

Нда.. слишком много кода.. надо разбираться.

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

Вроде просто все.


 
Виталий____   (2010-06-23 13:49) [4]

Под вистой/семеркой у меня например криво работает AnimateWindow, так что скорей всего Ваш случай наоборот ничем не удивителен.



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

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

Наверх




Память: 0.48 MB
Время: 0.014 c
6-1281092171
__REA
2010-08-06 14:56
2016.07.24
TIdIRC away


15-1445526860
Dimka Maslov
2015-10-22 18:14
2016.07.24
Чем теперь давить рекламу?


15-1445203802
Юрий
2015-10-19 00:30
2016.07.24
С днем рождения ! 19 октября 2015 понедельник


2-1415206334
M.A.
2014-11-05 19:52
2016.07.24
Помогите переписать с VCL на Api


2-1414317120
Вован Петрович
2014-10-26 13:52
2016.07.24
Как правильно передать параметры запросу?