Normalウィンドウの透明化・半透明化あれこれ。

元々は右のような普通の(不透明な)ウィンドウの透過度を、いくつかの方法で変化させてみる。

動作は Windows 7 (64bit) / C++Builder XE で行っているが、別の環境では別の動作になるかも。

* クライアント領域のみ透明化

クライアント領域のみを透明化させるには、フォームの TransparentColor/TransparentColorValue プロパティを使う。
void	TFormTest01::Test01()
{
	TransparentColor = true;
	TransparentColorValue = TColor(0x000001);
	Canvas->Brush->Color = TColor(0x000001);
	Canvas->FillRect(TRect(0, 0, 300, 300));
	Panel2->Color = TColor(0x000001);
}
TransparentColorTransparentColor プロパティを true にすることで透過モードとなり、フォーム上の TransparentColorValue プロパティで指定した色(コンポーネント同士の重なりに関係なく、指定した色で塗られている部分はすべて)が完全透過となる。半透明にすることはできない。

Windows API で言えば、SetLayeredWindowAttributes() を LWA_COLORKEY でコールした状態だと思われる。ただし、Windows API の場合、透過部分ではマウスイベント等を受け取れない(透明と言うよりはウィンドウに穴が空いて、背後のデスクトップ等にイベントが行く)ようだが、C++Builder の場合はイベントを受け取れる。

* ウィンドウ全体を半透明化

ウィンドウ全体を半透明にするには、フォームの AlphaBlend/AlphaBlendValue プロパティを使う。
void	TFormTest01::Test02()
{
	AlphaBlend = true;
	AlphaBlendValue = 128;
}
AlphaBlendAlphaBlendValue = 0 で完全透明、AlphaBlendValue = 255 で完全不透明、その中間で半透明となる。

コンポーネントも含め、ウィンドウ内がすべて一律で透明になる。

Windows API で言えば、SetLayeredWindowAttributes() を LWA_ALPHA でコールした状態だと思われる。

* グラスフレーム(ガラス効果)の拡張

Windows Vista から導入された Aero において、グラスフレーム(タイトルバーのもやもやした半透明)をクライアント領域にまで広げるには、GlassFrame プロパティを使う。
void	TFormTest01::Test07()
{
	GlassFrame->Enabled = true;
	GlassFrame->SheetOfGlass = true;
}
GlassFrameGlassFrame->Enabled を true にするとグラスフレーム拡張モードとなり、GlassFrame->SheetOfGlass も true にすることで、クライアント領域全体でガラス効果を得られる。GlassFrame->SheetOfGlass を false にして、GlassFrame->Bottom などのプロパティで任意の範囲でガラス効果を得るようにすることもできる。

Windows API で言えば、Desktop Window Manager の DwmExtendFrameIntoClientArea() をコールした状態と思われる。