アプリ版:「スタンプのみでお礼する」機能のリリースについて

現在、MFCを使ったドローソフトを作成しています。
仕様はキャンバス上にい色々な部品をマウスで配置するといったものです。

画面描画の際の画面チラつき防止にダブルバッファリングという手法があり
裏画面でキャンバスの背景と部品を作成し、表画面に転送するものがある事を知りました。

そこで質問なのですが
マウスで一つの部品を選択し移動する場合、背景はどのように描画すべきなのでしょか?
もしも、キャンバス上に部品がたくさん有る場合、毎回、全てを描画し直していたら処理が
遅くなってしまいます。

選択した部品だけ再描画する効率的な方法をご存知の方がいました教えて下さい。
どうぞ宜しくお願い致します。

A 回答 (2件)

チラツキをなくす一番確実な方法は、



裏画面とは別にベース画面というものを用意して、
ドラッグ開始時に、ベース画面に「選択している部品以外を描画した画面」というのをまず描画します。
ドラッグ中は、そのベース画面を裏画面にコピーした後、そこにドラッグしてる部品だけを描画し、それを表に転送するようにする、というものです。
裏画面は2枚必要ですが、確実です。

部品の描画量が少ない場合、「ベース画面を表に転送し、表画面に部品を描画」方式でも十分でしょう。その場合はメモリ消費量が少なくなりますし2回転送するオーバーヘッドも減りますので、その方がレスポンスが良い場合もあります。

あとは、別解としては、Xorで描画する方法。
裏画面は使う必要はありません。
表画面に「選択している部品以外を描画した画面」を描画したあと、
ドラッグ中の部品だけはXorモードで描画します。
再度同じ条件でXorモードで描画すれば、画面はまた「選択している部品以外を描画した画面」に戻ります。
ドラッグによるマウス移動検知時は、「前回の描画位置でXor描画してから、今回の位置でXor描画する」ことを繰り返します。
この方法では裏画面は要りませんし、それなりなレスポンスでちらつきなしに表示できます。

ただし、Xor描画方式だと、自由な色で描画することができませんし、既存の部品と重なった部分は色が変わってしまいますし、部品描画時に同じところに線が2本以上重なるような描画をすると、その部分は背景に戻ってしまいます。
高速だが簡易な方法としてわりきりは必要です。
    • good
    • 0
この回答へのお礼

丁寧な説明を有難うございます。
教えていただいた方法で実際に実装してみようと思います。
たぶん試行錯誤ですが...
貴重な情報有難うございました。

お礼日時:2012/02/02 19:34

期待した回答でなくてすみません


専門分野でないので・・・

そういうのはXORを使って描画するんだと思いました。
透過処理することにより、自分で再描画することはありません。

あとはゲーム系、つまりDirectxを使えば格段に高速化できます。
MFCは当時は画期的だったけど今は不便なんですよね。

この辺は既に知っているかと思いますが・・・
http://www.t-recipe.com/vc/flicker.html


Inkscapeのソースコードを参考にするといいかもしれませんね。
http://inkscape.org/download/?lang=ja
こっちのほうが圧倒的に速いと思います。
    • good
    • 0
この回答へのお礼

XORの実装やDirectXに関しての情報有難うございました。
時間ができましたらInkscapeのソースコードもみてみたいと思います。
貴重な情報を有難うございました。

お礼日時:2012/02/02 19:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!