階層化されたウィンドウのどの側面が問題を引き起こすのかは正確には非常に不明です。それらがどのように実装されているか、そしてそこからの制限を説明するだけです。
レイヤード ウィンドウは、「レイヤー」と呼ばれるビデオ アダプターのハードウェア機能を使用して実装されます。アダプターには、ビデオ メモリの個別のチャンクからのピクセルを組み合わせて、モニターに送信する前に混合する基本的な機能があります。その明らかな例はマウス カーソルです。マウス カーソルはデスクトップ フレーム バッファーのピクセルに重ねられるため、マウスを動かしたときにアニメーション化するのに多くの労力がかかりません。または、ビデオの表示に使用されるオーバーレイ、ビデオ ストリーム デコーダーは、ビデオ ピクセルを別のフレーム バッファーに直接書き込みます。または、その背後のウィンドウの上にあるトップレベル ウィンドウのフレームによって投じられる影。
ビデオ アダプタでは、2 つのピクセル値を結合するときに、2 つのピクセル値に対して簡単な論理演算を実行できます。最初のものは明らかなもので、ピクセル値の一部を背景ピクセルにオーバーラップさせるミキシング操作です。その効果はopacityを提供し、ウィンドウの背後にある背景を部分的に見ることができます。
2 つ目はカラー キーイングです。これは、テレビの天気予報士が天気図の前に立っているときに使用される効果です。彼は実際に緑色のスクリーンの前に立ち、カメラのミキシング パネルが緑色を除去し、天気図のピクセルに置き換えます。その効果は純粋な透明性を提供します。
これは、UpdateLayeredWindow() に渡される引数で確認できます。この関数は、レイヤード ウィンドウをセットアップするためにコードで呼び出す必要があります。dwFlags 引数は、ビデオ ハードウェアによってサポートされる基本操作を選択します。ULW_ALPHA フラグは不透明効果を有効にし、ULW_COLORKEY フラグは透明効果を有効にします。透過効果には、crKey 引数値で指定されたカラー キーが必要です。不透明度効果は pblend 引数で制御されます。これは将来の拡張のために構築されたもので、まだ実現していません。BLENDFUNCTION 構造体の唯一の興味深いフィールドは SourceConstantAlpha で、不透明度を制御します。
そのため、レイヤード ウィンドウで使用できる基本的な効果は、背景ウィンドウを重ねて部分的に見えるようにする不透明度です。境界線とタイトル バーを含め、ウィンドウ全体が部分的に不透明であるという 1 つの制限。それは見栄えがよくありません。通常は、ボーダレス ウィンドウを作成し、独自のウィンドウ フレームを作成する負担を負います。ところで、たくさんのコードが必要です。
基本的な効果は透過性で、ウィンドウの一部を完全に隠します。2 つの効果を組み合わせたい場合がよくあり、それには2 つのレイヤード ウィンドウが必要です。1 つは部分的な不透明度を提供し、もう 1 つは上部にあり、コントロールなどの不透明なウィンドウの部分を表示する下部が所有します。カラーキーを使用して背景を透明にし、下部のウィンドウを表示します。
これ以外に、カスタム ウィンドウのもう 1 つの重要な機能が SetWindowRgn() によって有効になります。ウィンドウに長方形以外の形状を与えることができます。ここでも、枠線とタイトル バーを省略することが重要です。これらは整形されたウィンドウでは機能しません。プログラミング作業は、これらの機能を、他のアプリケーションによって作成されたウィンドウのルック アンド フィールとあまり大きく変わらないような上品な方法で組み合わせ、代わりのウィンドウ パーツをペイントし、ウィンドウを通常の窓口。たとえば、ウィンドウのサイズ変更や移動などは、通常、WM_NCHITTEST メッセージをカスタム処理して行います。