Windows7でフォームを透過させるには?

解決


くろねこ  2010-05-15 21:10:52  No: 38465

procedure WMEraseBkgnd(var msg: TWMEraseBkgnd);message WM_ERASEBKGND;

として

procedure WMEraseBkgnd(var msg: TWMEraseBkgnd);
begin
  msg.Result := 1;
end;

で背景が透過するフォームを作成できますが、WindowsVista以前だとうまくいくのですがWindows7だと透過しません。
Windows7でフォームを透過させるにはどうすればいいのでしょうか。
Delphi5です。


とある無職の休職中  2010-05-16 20:05:30  No: 38466

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;

とかでも無理?


くろねこ  2010-05-16 21:48:49  No: 38467

コメントありがとうございます。
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);


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加