Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2016.07.24;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2016.07.24;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.004 c
15-1440522423
кгшзх
2015-08-25 20:07
2016.07.24
календарно космологическое


15-1441565858
Pavia
2015-09-06 21:57
2016.07.24
Хук


15-1447832032
Dimka Maslov
2015-11-18 10:33
2016.07.24
Вот интересно


2-1416468559
Endy
2014-11-20 10:29
2016.07.24
Подскажите литературу, WinAPI, интерфейсы (interfaces)


15-1447058234
K-1000
2015-11-09 11:37
2016.07.24
Record -> String (2)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский