Direct Composition
UI作りに役立ちそうだということで、またDirect Compositionをいじっている。これは親ウィンドウ上で複数のビットマップ(サーフェース)を合成して表示できるライブラリである。重ね合わせする際にオフセット座標を設定して表示位置をずらしたり、エフェクトやアニメーションすることもできる。こう書くと特徴的なものは何もないし、ビットマップ合成など昔からできる。しかしこれをできるだけHW(GPU)に任せるようにするところが「Direct」と頭につくこのライブラリの特徴的なところである。
Direct CompositionではDCompositionSurfaceを合成元のソースとして使用する。このDCompositionSurfaceはDXGIサーフェースのほか、レイヤード・ウィンドウも対象としている。Windows8以降では子ウィンドウもレイヤード・ウィンドウ化することができようになっている。これを使用することで子ウィンドウをDCompositionSurface化し合成対象とすることでDXGIサーフェースで描画したDirect2D/3Dコンテンツと親ウィンドウ上で合成できるようになる。つまりUIとDirect2D/3D描画を重ね合わせることがとても簡単にできる。
DirectCompositionは「Visual Tree」によってサーフェースの合成をコントロールする。絵にすると下のような感じある。VisualオブジェクトにDCompositionSurfaceを関連付け、木構造とする。 DirectCompositionは木構造に従いDCompositionSurfaceを合成するのである。
詳細については「Direct Composition Concepts」に書いてある。私も今読み返しているところである。
UI作りはDirectCompositionをベースに作っていくことにする。
子ウィンドウのレイヤードウィンドウ
レイヤードウィンドウとはWindows2000から使えるようになった半透明ウィンドウのことである。Windows7以前ではレイヤードウィンドウは親ウィンドウにしか設定することができない。しかしWindows8からは子ウィンドウもレイヤードウィンドウにすることができるように拡張されている。これを利用可能にするためにはアプリケーション・マニフェストの<supportedOS>をWindows8以上に設定しなければならない。ここで少しハマってしまった。