画像 document の実装 †前節で見たように、Scroll window にとって必要なのは、表示する document の表示上の大きさと指定された位置からの描画関数であって、document の詳細は必要としない。前節では document の内容は text であったが、ここでは document の内容を画像にしてみよう。 元の text 表示機能も残そうとすると、基底 class を作って、text用 class と、image用 class を派生させるのが自然であろう。上で述べたように必要なのは表示上の大きさを返す関数と描画関数であるので、基底 class は、この二つを virtual 関数として持たせておく。基底 class の名前は、ここでは CMyContent とする。 // myconten.h #ifndef MYCONTENT_H_INCLUDED #define MYCONTENT_H_INCLUDED #include <windows.h> namespace mylib { class CMyContent { public: static const int TYPE_UNKNOWN = 0; static const int TEXT_PLAIN = 1; static const int IMAGE_BMP = 11; public: virtual ~CMyContent(); virtual const SIZE& Size(HDC hdc); virtual int Draw(HDC hdc, int x, int y, PAINTSTRUCT& ps); protected: CMyContent(); protected: SIZE m_sz; }; } // namespace mylib #endif // MYCONTENT_H_INCLUDED 基底 class の関数を使って派生 class の関数を呼び出すわけだが、そのためには pointer 経由で呼び出す必要が出てくる(基底 class へ代入してしまうと、基底 class へコピーされたもの以外は削除されてしまう)。この点については考察は後で行うこととして、とりあえずここでは content に応じて new したものを基底 class への pointer へ cast して保持しておくことにする。 |