GDI、GDI+、DirectXの描画を実装した。 実行中に切り替えることができる。 前回手を抜いていたインタフェース部分を変更した。
入手先
イメージ
ソースコード一覧
修正したところ
インターフェース変更
- IDrawWndProc追加
- IPartWndProc変更
- 継承class変更
前回言っていたパターン3で修正した。
純粋仮想デストラクタ追加
クラスに仮想メソッドがあるなら、そのクラスのデストラクタは virtual にすべき
http://www.yunabe.jp/docs/cpp_virtual_destructor.html
メモリーリーク系の厄介なバグの原因になる
http://www44.atwiki.jp/bokuyo/pages/131.html
virtual ~IEventListener() = 0 {}
親classにダウンキャストして使っていると、子classのデストラクタが呼ばれなくなってメモリリークする場合があるらしい。 そこで、仮想関数をもっているインタフェースclassである IPartWndProc、IDrawWndProc に純粋仮想デストラクタを追加した。
課題
描画内容だけを実装できるようなインタフェースにしたい。
現在は初期化、終了処理、再描画禁止(WM_ERASEBKGND
)、ダブルバッファリング、の処理を実装している。
でもこれは、やって当たり前レベルの処理である。
固定で自動的にやってほしい。
本当にやりたいことは描画そのものである。 任意の文字列、図形、画像を描画する処理こそが、本来やりたいことである。 そこで、描画する内容だけに注力できるようなインタフェースを提供したい。
問題
描画アーキテクチャごとに渡すべき引数の型が違う。 この差異をどうやって吸収すればいいか。
アーキテクチャ | 型 | ヘッダ | ライブラリ |
---|---|---|---|
GDI | HDC |
Windows.h | デフォルト(user32.lib, kernel32.lib, ...) |
GDI+ | Gdiplus::Graphics |
gdiplus.h | gdiplus.lib |
DirectX9 | LPDIRECT3DDEVICE9 |
d3d9.h | d3d9.dll, dxguid.lib |
所感
もっと描画をいろいろやってみたいけど、今は我慢。 インタフェース部分をおろそかにすると大規模化したときに収拾がつかなくなってしまう。 ただでさえC++のコードは見づらいので極力楽をしたい。