環境はXP Home SP2、VC++ 6.0、MFCで作成しているプログラムがあります。
MDIのアプリでデータに基づいてViewに図形などを表示させています。
Viewに描画するにあたってちらつきをなくすために、OnDraw()の中で
pDCの互換のあるCDCのメモリバッファーを作成します。
メモリバッファのCDCに対して現在のモニタの大きさくらいのビットマップを作成して、
それを選択をしてメモリーバッファーに対して描画してからpDCにBitBltで一括転送して
表示を行っています。
互換のあるメモリーバッファーのに選択したビットマップのCDCに描画するに
あたって大丈夫か分からない事があり質問しました。
メモリーバッファーの選択したビットマップの大きさの範囲外に図形描画関数を
呼んでも描画しても問題はありませんでしょうか?
範囲外に描画しても不正エラーで終了する事はないのですが、状況により選択したビッ
トマップの大きさの範囲よりも外にはみ出して描画する事もあります。
クリッピングは出来無い?
実際にやってみればすぐわかることですがまったく問題ありません。
マニュアルにも、DCに与えてはいけない座標値などという記述はありません。
また、そうでなければ描画対象として使い物になりません。
描画関数的に考えると全く問題ないのは仲澤@失業者さんが書かれている通りです。
但し、パフォーマンスの面でも問題ないかは別問題だと思います。
範囲外に対する描画関数の呼び出し回数が膨大になるようなケースだと
パフォーマンスに悪影響があると思いますので全く画面に出てこないような
形状の描画は関数の呼び出しそのものをしないと言う考え方もあると思いますよ。
回答者の皆さんありがとうございました。
念のためにマイクロソフトに問い合わせました。
結果としてはOSの方でDCにある大きさのビットマップを選択した場合に、
内部的に選択したビットマップの大きさのクリッピング領域を持っている
ために、Rectangle()で描画した四角形がビットマップの境界に重なって
描画したり領域外に描画してもクリッピングして描画しているとの解答が
得られました。不正なメモリにアクセスしている事はないようです。
これで解決いたしました。ありがとうございました。