おかしかった日付表示をいい加減直しました。

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しています。

それを実行するとこうなります。5_glass_text.png

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))を追加すると、こういうことになりました。6_glass_text_blue.png意図して行えばおもしろいことができそうといえるのですが……。

2008年7月31日: VistaベーシックではDWMは使えないようなので訂正。


スポンサード リンク

この記事のカテゴリ

  • ⇒ Vistaになった記念 (2) アルファチャネルとGDI
  • ⇒ Vistaになった記念 (2) アルファチャネルとGDI
  • ⇒ Vistaになった記念 (2) アルファチャネルとGDI