Вопрос Как реализовать прозрачность появляющуюся при перемещении окна

audiofeel

Старожил
вопрос как реализовать прозрачность появляющуюся при перемещении окна
, а также "медленный" выход(исчезновение) как на видео ?
 

EvilAlex

Старожил
Пример 1
Код:
[Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program
OutputDir=userdocs:InnoSetupTest.
[Code]
const
   AW_BLEND = $00080000;
   AW_HIDE = $00010000;
function AnimateWindow(hWnd: HWND; dwTime: DWORD; dwFlags: DWORD): Boolean;
external 'AnimateWindow@user32 stdcall';
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  if MsgBox(SetupMessage(msgExitSetupMessage), mbConfirmation, MB_OKCANCEL) = IDOK then
  begin
    Confirm := False;
    AnimateWindow(WizardForm.Handle, 2500, AW_BLEND or AW_HIDE);
    Cancel := True;
  end else
  Cancel := False;
end;
Пример 2
Код:
; Функция AnimateWindow дает Вам возможность производить специальные эффекты
; при показе или сокрытии окон. Имеются четыре типа мультипликации:
; ролик, слайд, свертывание или развертывание и плавное альфа-перетекание.
; Синтаксис:
; function AnimateWindow(hwnd: HWND, dwTime: DWord, dwFlags: DWord);
; Параметры:
; hwnd - Дескриптор окна, которое анимируется. Вызывающий поток должен владеть этим окном.
; dwTime - Устанавливает, сколько необходимо времени, чтобы воспроизвести мультипликацию, в миллисекундах. Как правило, воспроизведение мультипликации занимает 200 миллисекунд.
; dwFlags - Определяет тип мультипликации. Этот параметр может быть одно или несколько нижеследующих значений. Обратите внимание! что, по умолчанию, эти флажки дают желаемый результат при показе окна. Чтобы получать желаемый результат при сокрытии окна, используйте флажок AW_HIDE и логический оператор OR с соответствующими флажками.
; AW_SLIDE Использует слайдовую анимацию. По умолчанию используется анимационный ролик (прокрутка мультипликации). Этот флажок игнорируется тогда, когда пользуется с флажком AW_CENTER.
; AW_ACTIVATE Активизирует окно (при показе окна). Не используйте это значение совместно с AW_HIDE.
; AW_BLEND Использует эффект постепенного изменения прозрачности окна. Этот флажок может быть использован только в том случае, если параметр hwnd - окно верхнего уровня.
; AW_HIDE Скрывает окно. По умолчанию, окно показывается на экран.
; AW_CENTER Делает вид окна сжатым в точку, если используется флажок AW_HIDE или раскрытым из точки до полного размера, если флажок AW_HIDE не используется. Различные предписывающие флаги не имеют никакого действия.
; AW_HOR_POSITIVE Анимирует окно слева направо. Этот флажок может быть использован с роликом или слайдом мультипликации. Он игнорируется, когда используется с флажком AW_CENTER или AW_BLEND.
; AW_HOR_NEGATIVE Анимирует окно справа налево. Этот флажок может быть использован с роликом или слайдом мультипликации. Он игнорируется, когда используется с флажком AW_CENTER или AW_BLEND.
; AW_VER_POSITIVE Анимирует окно сверху вниз. Этот флажок может быть использованы с роликом или слайдом мультипликации. Он игнорируется, когда используется с флажком AW_CENTER или AW_BLEND.
; AW_VER_NEGATIVE Анимирует окно снизу вверх. Этот флажок может быть использован с роликом или слайдом мультипликации. Он игнорируется, когда используется с флажком AW_CENTER или AW_BLEND.
; Возвращаемые значения:
; Если функция завершается успешно, величина возвращаемого значения - не ноль.
; Если функция завершается с ошибкой, величина возвращаемого значения - ноль.
; Функция завершится ошибкой в нижеследующих ситуациях: Если окно использует регион окна.
; Windows XP: Это обстоятельство не заставляет функцию завершаться ошибкой.
; Если окно уже видимое, и Вы пробуете выводить на экран окно.
; Если окно уже скрытое, и Вы пробуете скрыть окно.
; Если нет заданного направления прокрутки для слайда или ролика.
; При попытке анимировать дочернее окно с флажком AW_BLEND. Если поток не владеет окном.
; Обратите внимание! что, в этом случае функция AnimateWindow завершается ошибкой,
; а GetLastError возвращает значение ERROR_SUCCESS.
; Чтобы получать расширенные данные об ошибках, вызовите функцию GetLastError.
; Замечания:
; При использовании слайда или прокрутки мультипликации, Вы должны задать направление.
; Это может быть или AW_HOR_POSITIVE, AW_HOR_NEGATIVE, AW_VER_POSITIVE, или AW_VER_NEGATIVE.
; Вы можете комбинировать флажки AW_HOR_POSITIVE или AW_HOR_NEGATIVE с AW_VER_POSITIVE или AW_VER_NEGATIVE,
; чтобы анимировать окно по диагонали.
; Оконные процедуры для окна и его дочерних окон должны обрабатывать любое сообщение WM_PRINT или WM_PRINTCLIENT.
; Диалоговые окна, органы управления и стандартные органы управления уже обрабатывают WM_PRINTCLIENT.
; Заданная по умолчанию оконная процедура уже обрабатывает WM_PRINT.
; Если дочернее окно отображается частично отсеченным, когда оно анимируется, то будет иметь дырки, где оно отсечено.
; AnimateWindow поддерживает окна RTL.
; Избегайте анимировать окно, которое имеет тень, потому что оно производит видимое спонтанное дерганье мультипликации.
;######################################################################################################################
[Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program
OutputDir=userdocs:InnoSetupTest.
[Code]
const
   AW_ACTIVATE = $00020000;
   AW_BLEND = $00080000;
   AW_CENTER = $00000010;
   AW_HIDE = $00010000;
   AW_HOR_POSITIVE = $00000001;
   AW_HOR_NEGATIVE = $00000002;
   AW_SLIDE = $00040000;
   AW_VER_POSITIVE = $00000004;
   AW_VER_NEGATIVE = $00000008;                   
   AW_FADE_IN = $00080000;
   AW_FADE_OUT = $00090000;
   AW_SLIDE_IN_LEFT = $00040001;
   AW_SLIDE_OUT_LEFT = $00050002;
   AW_SLIDE_IN_RIGHT = $00040002;
   AW_SLIDE_OUT_RIGHT = $00050001;
   AW_SLIDE_IN_TOP = $00040004;
   AW_SLIDE_OUT_TOP = $00050008;
   AW_SLIDE_IN_BOTTOM = $00040008;
   AW_SLIDE_OUT_BOTTOM = $00050004;
   AW_DIAG_SLIDE_IN_TOPLEFT = $00040005;
   AW_DIAG_SLIDE_OUT_TOPLEFT = $0005000a;
   AW_DIAG_SLIDE_IN_TOPRIGHT = $00040006;
   AW_DIAG_SLIDE_OUT_TOPRIGHT = $00050009;
   AW_DIAG_SLIDE_IN_BOTTOMLEFT = $00040009;
   AW_DIAG_SLIDE_OUT_BOTTOMLEFT = $00050006;
   AW_DIAG_SLIDE_IN_BOTTOMRIGHT = $0004000a;
   AW_DIAG_SLIDE_OUT_BOTTOMRIGHT = $00050005;
   AW_EXPLODE = $00040010;
   AW_IMPLODE = $00050010;
function AnimateWindow(hWnd: HWND; dwTime: DWORD; dwFlags: DWORD): Boolean;
external 'AnimateWindow@user32 stdcall';
procedure InitializeWizard;
begin
  AnimateWindow(WizardForm.Handle, 1000, AW_SLIDE_IN_LEFT);
end;
 

audiofeel

Старожил
Пример 1
Код:
[Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program
OutputDir=userdocs:InnoSetupTest.
[Code]
const
   AW_BLEND = $00080000;
   AW_HIDE = $00010000;
function AnimateWindow(hWnd: HWND; dwTime: DWORD; dwFlags: DWORD): Boolean;
external 'AnimateWindow@user32 stdcall';
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  if MsgBox(SetupMessage(msgExitSetupMessage), mbConfirmation, MB_OKCANCEL) = IDOK then
  begin
    Confirm := False;
    AnimateWindow(WizardForm.Handle, 2500, AW_BLEND or AW_HIDE);
    Cancel := True;
  end else
  Cancel := False;
end;
Пример 2
Код:
; Функция AnimateWindow дает Вам возможность производить специальные эффекты
; при показе или сокрытии окон. Имеются четыре типа мультипликации:
; ролик, слайд, свертывание или развертывание и плавное альфа-перетекание.
; Синтаксис:
; function AnimateWindow(hwnd: HWND, dwTime: DWord, dwFlags: DWord);
; Параметры:
; hwnd - Дескриптор окна, которое анимируется. Вызывающий поток должен владеть этим окном.
; dwTime - Устанавливает, сколько необходимо времени, чтобы воспроизвести мультипликацию, в миллисекундах. Как правило, воспроизведение мультипликации занимает 200 миллисекунд.
; dwFlags - Определяет тип мультипликации. Этот параметр может быть одно или несколько нижеследующих значений. Обратите внимание! что, по умолчанию, эти флажки дают желаемый результат при показе окна. Чтобы получать желаемый результат при сокрытии окна, используйте флажок AW_HIDE и логический оператор OR с соответствующими флажками.
; AW_SLIDE Использует слайдовую анимацию. По умолчанию используется анимационный ролик (прокрутка мультипликации). Этот флажок игнорируется тогда, когда пользуется с флажком AW_CENTER.
; AW_ACTIVATE Активизирует окно (при показе окна). Не используйте это значение совместно с AW_HIDE.
; AW_BLEND Использует эффект постепенного изменения прозрачности окна. Этот флажок может быть использован только в том случае, если параметр hwnd - окно верхнего уровня.
; AW_HIDE Скрывает окно. По умолчанию, окно показывается на экран.
; AW_CENTER Делает вид окна сжатым в точку, если используется флажок AW_HIDE или раскрытым из точки до полного размера, если флажок AW_HIDE не используется. Различные предписывающие флаги не имеют никакого действия.
; AW_HOR_POSITIVE Анимирует окно слева направо. Этот флажок может быть использован с роликом или слайдом мультипликации. Он игнорируется, когда используется с флажком AW_CENTER или AW_BLEND.
; AW_HOR_NEGATIVE Анимирует окно справа налево. Этот флажок может быть использован с роликом или слайдом мультипликации. Он игнорируется, когда используется с флажком AW_CENTER или AW_BLEND.
; AW_VER_POSITIVE Анимирует окно сверху вниз. Этот флажок может быть использованы с роликом или слайдом мультипликации. Он игнорируется, когда используется с флажком AW_CENTER или AW_BLEND.
; AW_VER_NEGATIVE Анимирует окно снизу вверх. Этот флажок может быть использован с роликом или слайдом мультипликации. Он игнорируется, когда используется с флажком AW_CENTER или AW_BLEND.
; Возвращаемые значения:
; Если функция завершается успешно, величина возвращаемого значения - не ноль.
; Если функция завершается с ошибкой, величина возвращаемого значения - ноль.
; Функция завершится ошибкой в нижеследующих ситуациях: Если окно использует регион окна.
; Windows XP: Это обстоятельство не заставляет функцию завершаться ошибкой.
; Если окно уже видимое, и Вы пробуете выводить на экран окно.
; Если окно уже скрытое, и Вы пробуете скрыть окно.
; Если нет заданного направления прокрутки для слайда или ролика.
; При попытке анимировать дочернее окно с флажком AW_BLEND. Если поток не владеет окном.
; Обратите внимание! что, в этом случае функция AnimateWindow завершается ошибкой,
; а GetLastError возвращает значение ERROR_SUCCESS.
; Чтобы получать расширенные данные об ошибках, вызовите функцию GetLastError.
; Замечания:
; При использовании слайда или прокрутки мультипликации, Вы должны задать направление.
; Это может быть или AW_HOR_POSITIVE, AW_HOR_NEGATIVE, AW_VER_POSITIVE, или AW_VER_NEGATIVE.
; Вы можете комбинировать флажки AW_HOR_POSITIVE или AW_HOR_NEGATIVE с AW_VER_POSITIVE или AW_VER_NEGATIVE,
; чтобы анимировать окно по диагонали.
; Оконные процедуры для окна и его дочерних окон должны обрабатывать любое сообщение WM_PRINT или WM_PRINTCLIENT.
; Диалоговые окна, органы управления и стандартные органы управления уже обрабатывают WM_PRINTCLIENT.
; Заданная по умолчанию оконная процедура уже обрабатывает WM_PRINT.
; Если дочернее окно отображается частично отсеченным, когда оно анимируется, то будет иметь дырки, где оно отсечено.
; AnimateWindow поддерживает окна RTL.
; Избегайте анимировать окно, которое имеет тень, потому что оно производит видимое спонтанное дерганье мультипликации.
;######################################################################################################################
[Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program
OutputDir=userdocs:InnoSetupTest.
[Code]
const
   AW_ACTIVATE = $00020000;
   AW_BLEND = $00080000;
   AW_CENTER = $00000010;
   AW_HIDE = $00010000;
   AW_HOR_POSITIVE = $00000001;
   AW_HOR_NEGATIVE = $00000002;
   AW_SLIDE = $00040000;
   AW_VER_POSITIVE = $00000004;
   AW_VER_NEGATIVE = $00000008;                 
   AW_FADE_IN = $00080000;
   AW_FADE_OUT = $00090000;
   AW_SLIDE_IN_LEFT = $00040001;
   AW_SLIDE_OUT_LEFT = $00050002;
   AW_SLIDE_IN_RIGHT = $00040002;
   AW_SLIDE_OUT_RIGHT = $00050001;
   AW_SLIDE_IN_TOP = $00040004;
   AW_SLIDE_OUT_TOP = $00050008;
   AW_SLIDE_IN_BOTTOM = $00040008;
   AW_SLIDE_OUT_BOTTOM = $00050004;
   AW_DIAG_SLIDE_IN_TOPLEFT = $00040005;
   AW_DIAG_SLIDE_OUT_TOPLEFT = $0005000a;
   AW_DIAG_SLIDE_IN_TOPRIGHT = $00040006;
   AW_DIAG_SLIDE_OUT_TOPRIGHT = $00050009;
   AW_DIAG_SLIDE_IN_BOTTOMLEFT = $00040009;
   AW_DIAG_SLIDE_OUT_BOTTOMLEFT = $00050006;
   AW_DIAG_SLIDE_IN_BOTTOMRIGHT = $0004000a;
   AW_DIAG_SLIDE_OUT_BOTTOMRIGHT = $00050005;
   AW_EXPLODE = $00040010;
   AW_IMPLODE = $00050010;
function AnimateWindow(hWnd: HWND; dwTime: DWORD; dwFlags: DWORD): Boolean;
external 'AnimateWindow@user32 stdcall';
procedure InitializeWizard;
begin
  AnimateWindow(WizardForm.Handle, 1000, AW_SLIDE_IN_LEFT);
end;
а как его к ISDone? вот к этому ?
кнопка у меня не через ботву, придется делать еще одну procedure? на не ISDone?

Код:
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  if CurPageID = wpInstalling then begin
    SuspendProc;
    Confirm := False;
    Cancel := False;
    if ExitSetupMsgBox then ISDoneCancel:=1;
    ResumeProc;
  end;
end;
 
Последнее редактирование:

EvilAlex

Старожил
Сделал себе вот так, после нажатия кнопки отмена, вылазит сообщение, и если нажать подтвердить отмену, то он плавно пропадает...
Код:
const
AW_BLEND = $00080000;
AW_HIDE = $00010000;
function AnimateWindow(hWnd: HWND; dwTime: DWORD; dwFlags: DWORD): Boolean; external 'AnimateWindow@user32 stdcall';

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  Confirm := False;
  MyExitMessage();
  if MyExit.ShowModal() = mrNo then
    Cancel := False;
  AnimateWindow(WizardForm.Handle, 500, AW_BLEND or AW_HIDE);
end;

хотя если нажать продолжить то тоже пропадает но не закрывается...
 
Последнее редактирование:

audiofeel

Старожил
все это понятно. но как с ISDone? быть, кнопка у меня не через ботву, как его встроить и в обычную кнопку отмены и на страницу wpInstalling
допустим=
wpWelcome и др. кроме wpInstalling
1. инсталл закрывается без предупреждения с анимацией
----------
wpInstalling
1. инсталл закрывается С предупреждением и с анимацией
 

EvilAlex

Старожил
все это понятно. но как с ISDone? быть, кнопка у меня не через ботву, как его встроить и в обычную кнопку отмены и на страницу wpInstalling
AnimateWindow добавить после кнопки отмены, например так...

Код:
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
if CurPageID = wpInstalling then begin
SuspendProc;
Confirm := False;
Cancel := False;
if ExitSetupMsgBox then ISDoneCancel:=1;
AnimateWindow(WizardForm.Handle, 500, AW_BLEND or AW_HIDE);
ResumeProc;
end;
end;

Кнопки может и по разному сделаны, но процедура через которую они закрывают инсталл, одна и та же почти - procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
 
Сверху