Вопрос Прозрачное окно инсталлятора при его перетаскивании

hexep

Мимокрокодил
сделал так:
Код:
const
  WM_NCLBUTTONDOWN = $00A1;
  HTCAPTION = 2;
  WM_NCMOUSEMOVE = $00A0;
  GWL_EXSTYLE = -20;
  WS_EX_LAYERED = $80000;
  LWA_ALPHA = 2;
  TransparentPercent = 50;


function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
function SetLayeredWindowAttributes(hwnd: HWND; crKey: TColor; bAlpha: BYTE; dwFlags: DWORD): Boolean; external 'SetLayeredWindowAttributes@user32.dll stdcall';


procedure EnableTransparencyOnDrag(var Msg: TMsg; var Handled: Boolean);
begin
  if (Msg.message = WM_NCLBUTTONDOWN) and (Msg.wParam = HTCAPTION) then
  begin
    SetWindowLong(WizardForm.Handle, GWL_EXSTYLE, GetWindowLong(WizardForm.Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
    SetLayeredWindowAttributes(WizardForm.Handle, 0, (255 * TransparentPercent) / 100, LWA_ALPHA);
    Handled := False;
  end;
  if  Msg.message = WM_NCMOUSEMOVE then
  begin
    SetWindowLong(WizardForm.Handle, GWL_EXSTYLE, GetWindowLong(WizardForm.Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
    SetLayeredWindowAttributes(WizardForm.Handle, 0, 255, LWA_ALPHA);
    Handled := False;
  end;
end;


procedure InitializeWizard;
begin
 
  ...

  Application.OnMessage := @EnableTransparencyOnDrag;

  ...

end;

Работает на всех страницах инсталлятора, кроме wpInstalling.
Видел такую функцию в инсталляторах R.G. Catalyst, там работает везде.
Подскажите, пожалуйста, как сделать чтобы работало и у меня.
 

Nemko

Дилетант
Модератор
hexep, вот подправлено чуть, прозрачность работает только при перетаскивание окна, пример #1. Если нужна просто прозрачность окна, то пример #2.

Код:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Code]
const
  WM_NCLBUTTONDOWN = $00A1;
  HTCAPTION = 2;
  WM_NCMOUSEMOVE = $00A0;
  GWL_EXSTYLE = -20;
  WS_EX_LAYERED = $80000;
  LWA_ALPHA = 2;
  TransparentPercent = 50;

function GetWindowLong(hWnd, nIndex: Integer): Longint; external 'GetWindowLongA@user32.dll';
function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
function SetLayeredWindowAttributes(hwnd: HWND; crKey: TColor; bAlpha: BYTE; dwFlags: DWORD): Boolean; external 'SetLayeredWindowAttributes@user32.dll stdcall';


procedure EnableTransparencyOnDrag(var Msg: TMsg; var Handled: Boolean);
begin
  if (Msg.message = WM_NCLBUTTONDOWN) and (Msg.wParam = HTCAPTION) then
  begin
    SetWindowLong(WizardForm.Handle, GWL_EXSTYLE, GetWindowLong(WizardForm.Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
    SetLayeredWindowAttributes(WizardForm.Handle, 0, (255 * TransparentPercent) / 100, LWA_ALPHA);
    Handled := False;
  end;
  if  Msg.message = WM_NCMOUSEMOVE then
  begin
    SetWindowLong(WizardForm.Handle, GWL_EXSTYLE, GetWindowLong(WizardForm.Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
    SetLayeredWindowAttributes(WizardForm.Handle, 0, 255, LWA_ALPHA);
    Handled := False;
  end;
end;

procedure InitializeWizard;
begin
  Application.OnMessage:=@EnableTransparencyOnDrag;
end;
Код:
[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

[Code]const
TransparentPercent = 50; ///процент прозрачности

WS_EX_LAYERED = $80000;
WS_EX_TRANSPARENT = $20;
LWA_COLORKEY = 1;
LWA_ALPHA = 2;
GWL_EXSTYLE = (-20);

function SetLayeredWindowAttributes(hwnd: HWND; crKey: TColor; bAlpha: BYTE; dwFlags: DWORD): Boolean;
external 'SetLayeredWindowAttributes@user32.dll stdcall';

function GetWindowLong(Wnd: HWnd; Index: Integer): Longint;
external 'GetWindowLongA@user32.dll stdcall';

function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint;
external 'SetWindowLongA@user32.dll stdcall';

procedure InitializeWizard();
begin
SetWindowLong(WizardForm.Handle, GWL_EXSTYLE, GetWindowLong(WizardForm.Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
SetLayeredWindowAttributes(WizardForm.Handle, 0, (255 * TransparentPercent) / 100, LWA_ALPHA);
end;

P.S.: Пример от nik1967 => http://krinkels.org/threads/faq-po-inno-setup.7/page-4#post-29184
 
Последнее редактирование:
Сверху