• ベストアンサー

VISTAでGDI

Windows XP + SDKで開発をしています。 今まで開発をしてきたプログラムをVistaでも動作させようとしたところ、不具合が発生してしまいました。 STATICコントロールにDirectXで画像を表示させて、その上に矩形や円を表示しているのですがXPではブラシをNULL_BRUSHに指定、SetBKModeでTRANSPARENTを指定していれば矩形や円は輪郭だけ表示されていたのですがVistaでは背景がグレーになってしまい、更に今まで描画した矩形や円が残ってしまいます。 Vistaでも同様な結果を得る方法がありましたら大変助かります。

質問者が選んだベストアンサー

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.3

> StretchRectとPresentの間にバックバッファに出力している そのタイミング(Presentの直前)で問題ないはずです。 あとは、 「ちゃんとバックバッファから GetDC しているかどうか(別のサーフェイスからGetDCしたりしていないか)」 「描画後にちゃんと ReleaseDC しているかどうか」 あたりを確認でしょうか。 GDIを使った描画プログラムの例 http://www13.plala.or.jp/kmaeda/directx9/backbuf.htm http://toruweb.web.fc2.com/sample/dxg2.html なんかを見て、記述方法に間違いがないか確認してみてください。

sakichichi
質問者

お礼

D3DPRESENT_PARAMETERSのFlagsパラメータにD3DPRESENTFLAG_LOCKABLE_BACKBUFFERが設定されていませんでした。 設定したところ表示できました。 本当にありがとうございました。

その他の回答 (2)

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.2

> SurfaceにGDIで描画すると画面を縮小した際に細い線が見えなくなるケースが出てきてしまった どのサーフェイスに描画しているのでしょうか? 最終的に表示される「バックバッファ」のサーフェイスに描画すれば、 それがそのまま等倍で表示されて、縮小などが行われることはありませんから、 「細い線が見えなくなる」といった状況は発生しないと思います。

sakichichi
質問者

お礼

回答ありがとうございます。 リプライ遅くなりました。 教えて頂いたようにバックバッファのデバイスコンテキストに 出力してみたのですが表示されません。 StretchRectとPresentの間にバックバッファに出力しているのですが 何かバックバッファに出力する為の条件があるのでしょうか?

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.1

Windows XP までは、ウィンドウ描画の基本はGDIで、その上にDirectXの描画機能を載せている形になっていたため、DirectXによる描画が行われたウィンドウに、さらにGDIによる描画を行うことができましたが、 Vista で Aero が有効な場合、ウィンドウ描画の基本はDirectXになったため、DirectXで描画したウィンドウの上にGDIで描画しても、結果が正しく反映されません。 ウィンドウに直接描画する(ウィンドウから取得したDC を使う)のではなく、 DirectXでの描画画像が記録されているサーフェイスに描画する(DirectDrawSurface に対し GetDC で取得したDCを使う)ようにすれば、 DirectXの描画とGDIの描画が共存出来ます。 (DirectDrawSurface のDCに描画するコードは、XP でも問題なく動作します。)

sakichichi
質問者

お礼

回答ありがとうございます。 DirectXで描画したウィンドウの上にGDIで描画している理由は SurfaceにGDIで描画すると画面を縮小した際に細い線が見えなくなるケースが出てきてしまったのでそのようにしていました。 現在はSurfaceをロックして画像を書き込んでいるのですがテクスチャーに書き込むようにしてMINFILTERをかければ大丈夫なものでしょうか? 

関連するQ&A