現在、MFCを使ったドローソフトを作成しています。
仕様はキャンバス上にい色々な部品をマウスで配置するといったものです。
画面描画の際の画面チラつき防止にダブルバッファリングという手法があり
裏画面でキャンバスの背景と部品を作成し、表画面に転送するものがある事を知りました。
そこで質問なのですが
マウスで一つの部品を選択し移動する場合、背景はどのように描画すべきなのでしょか?
もしも、キャンバス上に部品がたくさん有る場合、毎回、全てを描画し直していたら処理が
遅くなってしまいます。
選択した部品だけ再描画する効率的な方法をご存知の方がいました教えて下さい。
どうぞ宜しくお願い致します。
No.2ベストアンサー
- 回答日時:
チラツキをなくす一番確実な方法は、
裏画面とは別にベース画面というものを用意して、
ドラッグ開始時に、ベース画面に「選択している部品以外を描画した画面」というのをまず描画します。
ドラッグ中は、そのベース画面を裏画面にコピーした後、そこにドラッグしてる部品だけを描画し、それを表に転送するようにする、というものです。
裏画面は2枚必要ですが、確実です。
部品の描画量が少ない場合、「ベース画面を表に転送し、表画面に部品を描画」方式でも十分でしょう。その場合はメモリ消費量が少なくなりますし2回転送するオーバーヘッドも減りますので、その方がレスポンスが良い場合もあります。
あとは、別解としては、Xorで描画する方法。
裏画面は使う必要はありません。
表画面に「選択している部品以外を描画した画面」を描画したあと、
ドラッグ中の部品だけはXorモードで描画します。
再度同じ条件でXorモードで描画すれば、画面はまた「選択している部品以外を描画した画面」に戻ります。
ドラッグによるマウス移動検知時は、「前回の描画位置でXor描画してから、今回の位置でXor描画する」ことを繰り返します。
この方法では裏画面は要りませんし、それなりなレスポンスでちらつきなしに表示できます。
ただし、Xor描画方式だと、自由な色で描画することができませんし、既存の部品と重なった部分は色が変わってしまいますし、部品描画時に同じところに線が2本以上重なるような描画をすると、その部分は背景に戻ってしまいます。
高速だが簡易な方法としてわりきりは必要です。
丁寧な説明を有難うございます。
教えていただいた方法で実際に実装してみようと思います。
たぶん試行錯誤ですが...
貴重な情報有難うございました。
No.1
- 回答日時:
期待した回答でなくてすみません
専門分野でないので・・・
そういうのはXORを使って描画するんだと思いました。
透過処理することにより、自分で再描画することはありません。
あとはゲーム系、つまりDirectxを使えば格段に高速化できます。
MFCは当時は画期的だったけど今は不便なんですよね。
この辺は既に知っているかと思いますが・・・
http://www.t-recipe.com/vc/flicker.html
Inkscapeのソースコードを参考にするといいかもしれませんね。
http://inkscape.org/download/?lang=ja
こっちのほうが圧倒的に速いと思います。
XORの実装やDirectXに関しての情報有難うございました。
時間ができましたらInkscapeのソースコードもみてみたいと思います。
貴重な情報を有難うございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
WM_PAINT
-
VB6,リストボックスの特定行の...
-
CStaticコントロールの静的イメ...
-
panelのスクロール表示について
-
UpdateData( FALSE); による文...
-
MFCでOnPaintのタイミング
-
OneNote 2010 文字と描画がずれる
-
VB.netでのライン描画方法がわ...
-
FlexGridの一部のみ表示を更新...
-
MFC FormViewの背景色
-
GDI+のDrawStringを使って文字...
-
Labelの文字をスクロールする際...
-
タスクバーを再描画
-
C++にて、塗りつぶされた円を描...
-
InvalidateRectの使い方について
-
pset関数について
-
Minecraft 統合版(PC)の描画距...
-
ダイアログボックスについて。
-
Web上で指定したプロットを基に...
-
word
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB6,リストボックスの特定行の...
-
word
-
NVIDIAのシェーダーキャッシュ
-
MFCでOnPaintのタイミング
-
Minecraft 統合版(PC)の描画距...
-
google Colabでmatplotlibの描...
-
TextBoxに文字を書いても表示さ...
-
[VB.net] DataGridViewの列ヘッ...
-
UpdateData( FALSE); による文...
-
OneNote 2010 文字と描画がずれる
-
Labelの文字をスクロールする際...
-
InvalidateRectの使い方について
-
VB.netでのライン描画方法がわ...
-
CStaticコントロールの静的イメ...
-
VC++プログラムをつかったBMP画...
-
WM_SIZEとWM_SIZINGの違い (Win...
-
エクセルでガンチャートを作成...
-
c言語を使いダイアログにbmpを...
-
WM_PAINT
-
MFCのタイマーのつかい方を教え...
おすすめ情報