おかしかった日付表示をいい加減直しました。
DWM話が残っていたので、続きです。
DWMことデスクトップウィンドウマネージャは、Vistaの新しい描画の仕組みです。ウィンドウや壁紙の合成をDirect3Dでやっているとか、GDIへのアクセラレーションがなくなったとか、少し検索すればそういう詳しい話がいくつも見付かります。Windows AeroはDWMを必要としていますが、DWM自体は、Windows Aeroとは独立しており、例えばテーマにWindows Vista スタンダードやWindows Vista ベーシックを選んでもDWMは使用されます。
ゴタクはこれくらいにして、DwmExtendFrameIntoClientAreaの続きです。これを使用した状態では、GDIの利用が困ったことになります。
DWMで、全面を半透明化させたはずのウィンドウで次のようなPaintイベントの応答を行います。
Sub MainWnd_Paint(hdc As HDC)
Dim hfntOld = SelectObject(hdc, hfnt)
TextOut(hdc, 20, 20, "hello, world", 12)
SelectObject(hdc, hfntOld)
End Sub
hfntは、HFONT型の変数で、CreateイベントでCreateFontしています。
GDIがアルファチャネルに対応した作りになっておらず、Vistaで対応するようにもなっていないため、GDIでの描画がことごとく半透明処理されてしまうようです。回避策はなく、他の描画API(GDI+やWPFなど、Direct3Dも?)を使えということのようです。
ただし、SRCCOPYでのBitBltだけは、アルファチャネルに対応しており、Vista Goodies in C++: Using Glass in Your UI – The Code Project – Vistaでは、32ビットDIBとXPからのテーマAPIを併用して半透明描画を実現しています。
おまけ:上のコードにSetTextColor(hdc, RGB(0, 0, 255))を追加すると、こういうことになりました。意図して行えばおもしろいことができそうといえるのですが……。
2008年7月31日: VistaベーシックではDWMは使えないようなので訂正。
スポンサード リンク |
[…] […]