| history | TOP |
2005/03/21:作成
| overview | TOP |
Windows2000以降では、フォームのプロパティに「AlphaBlend / AlphaBlendValue」というのがありまして、フォームを透き通らせることができます。ところが、メインメニューやポップアップメニューは透き通りません。コレを透き通らせましょう、というのが目的です。
まず、一つ目に、Windows2000でしか試していません。XPではどうなるか知りません。また、メニューに効果をつけていると駄目です(フェードとか)。
次に、これは The Code Project - Free Source Code and Tutorials からのパクリだということです。単なるバージョンダウンを含んだ C => Delphi 翻訳物です。
| ソースコード | TOP |
基本方針は非常に簡単です。それは結果だけを掠め取らせてもらったからですが。要は、メニューが作られるたびに、透明な効果をつけるということです。
var
HookHandle: HHOOK = 0;
const
FORM_ALPHA = 255;
MENU_ALPHA = 220;
//-----------------------------------------------------------------------------
// フック中
function HookCallWndProc(nCode: Integer; wParam: WPARAM; pEvnt: PEventMsg): LRESULT; stdcall;
var
cwps: TCWPStruct;
szClass: array[0..127] of Char;
begin
// 規則どおり
if (nCode = HC_ACTION) then
begin
// 使いにくいのでキャストする
cwps := PCWPStruct(pEvnt)^;
// 作成のタイミングで
if (cwps.message = WM_CREATE) then
begin
// 作成されるウィンドウのクラス名を取得する
FillChar(szClass, SizeOf(szClass), 0);
GetClassName(cwps.hwnd, szClass, 127);
// コレがダイアログ(メニューもダイアログと同じクラス名)なら
if (szClass = '#32768') then
begin
// 今のスタイルに透き通るスタイルを付け加えて
SetWindowLong(cwps.hwnd, GWL_EXSTYLE,
GetWindowLong(cwps.hwnd, GWL_EXSTYLE) or WS_EX_LAYERED);
// 透明度を設定する
SetLayeredWindowAttributes(cwps.hwnd, 0, MENU_ALPHA, LWA_ALPHA);
end;
end;
end;
// ちゃんとやってくれる人に任せる
Result := CallNextHookEx(WH_CALLWNDPROC, nCode, wParam, Longint(pEvnt));
end;
//-----------------------------------------------------------------------------
// フックする
procedure TForm1.FormCreate(Sender: TObject);
begin
Self.AlphaBlendValue := FORM_ALPHA;
HookHandle := SetWindowsHookEx(WH_CALLWNDPROC, @HookCallWndProc, 0,
GetWindowThreadProcessId(Handle));
end;
//-----------------------------------------------------------------------------
// フックをやめる
procedure TForm1.FormDestroy(Sender: TObject);
begin
if (HookHandle <> 0) then UnhookWindowsHookEx(HookHandle);
HookHandle := 0;
end;
| 実行結果・ダウンロード | TOP |
| EOF | TOP |