procedure WMEraseBkgnd(var msg: TWMEraseBkgnd);message WM_ERASEBKGND;
として
procedure WMEraseBkgnd(var msg: TWMEraseBkgnd);
begin
msg.Result := 1;
end;
で背景が透過するフォームを作成できますが、WindowsVista以前だとうまくいくのですがWindows7だと透過しません。
Windows7でフォームを透過させるにはどうすればいいのでしょうか。
Delphi5です。
var
hw: HWND;
Style: Integer;
begin
hw := Self.Handle;
Style := GetWindowLong(hw, GWL_EXSTYLE);
Style := Style or WS_EX_LAYERED;
SetWindowLong(hw, GWL_EXSTYLE, Style);
SetLayeredWindowAttributes(hw, 0, 175, LWA_ALPHA); //175は適当
end;
とかでも無理?
コメントありがとうございます。
LWA_ALPHAではフォームのCanvasに書いたものも含めて全て透明になってしまい今回はうまくいきません。(背景のみ透明にしたいため)
苦肉の策としてフォームのCanvasを全面clRedで塗りつぶしてから(clRed以外で)目的のものをCanvasに書き、SetLayeredWindowAttributesを呼び出す際、crKeyにclRedを、LWA_COLORKEYを指定するという方法で一応の目的は達成できました。
すっきりしませんが、一応目的の動作にはなるので解決としておきます。
(もしもっとスマートな方法があればご教授ください。)
なお、Delphi5以前ではSetLayeredWindowAttributesが定義されていないので自分で呼び出します。(後の資料として書いておきます)
cconst
WS_EX_LAYERED = $80000;
LWA_COLORKEY =1;
LWA_ALPHA = 2;
function SetLayeredWindowAttributes(hwnd: HWND; crKey: COLORREF; bAlpha: BYTE; dwFlags: DWORD): Bool; stdcall;
function SetLayeredWindowAttributes; external user32 name 'SetLayeredWindowAttributes';
(これで呼び出す)
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
SetLayeredWindowAttributes(Handle, clRed, Byte(255), LWA_COLORKEY);
ツイート | ![]() |