懲りずにいまだ自作コントロール作成について研究しています。
今回は内容のサイズが動的なコントロールの描画です。
リストボックス、エディットコントロール、ブラウザ(IEコンポーネント)といった内容が動的に変化するコントロール(即ちスクロールバーが発生するコントロール)は初期化の段階で内容の大きさを知ることは不可能です。
しかしウィンドウは初期化時点で最大サイズが固定されるため初期化時以上の大きさにすることはできません。
つまりウィンドウを子ウィンドウ化して基盤にしてそこに内容を描画してやり、その子ウィンドウをさらにコントロールの内側に貼り付けてスクロール といったことは不可能です。
ではどう描画するか。仕方がないのでコントロールに直接描画していくしかありません。
ですがコントロールをスクロールしたときに全てをいちいち描画しているようではCPUとメモリを大量に使用してしまいます。スクロールバーのスクロール(サム)位置を取得し表示領域の範囲のみを描画するにせよ内容が多い場合はそのぶん計算や内容値の取得で余計な手間がかかり、これまたCPUの無駄な消費に繋がります。
例えばエディットコントロールであればスクロール位置から 何行目から何行目を描画するか決めてさらにその行分の内容を取得し…と作業が多くなってしまいます。ですがあらかじめ広い領域に描画しておきそれをスクロールするという方式ではこの手間は無くなります。
またIEコンポーネントのようなページを表示するものであればさらにその中身のコントロールもまた置きなおしなんてことに…
なのでこういった内容のサイズが動的なスクロールを含むコントロールはどのように描画するのが良いのでしょうか。
特に既存のこういったコントロールはどのようにして描画を行う仕組みなのでしょうか。
かなりイレギュラーな質問だとは思いますが、ちょっとした知識や方法をご存じであれば是非ともご教授お願い致します。
それと本題とは少しずれますが、こういった自作コントロールのあれこれ または既存のコントロールの仕組み等 GUI開発について解説しているサイトや本がありましたらそちらでも是非お教えいただきたいです。