現在、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で質問しましょう!
似たような質問が見つかりました
- 芸術学 画家のカラバッチョと同じ描き方で作品を作りたいのですが、 質問があります。 カラバッチョはどんな布の 1 2023/04/03 05:00
- マンガ・コミック いい加減この議論に蹴りを付けたい・・・納得したい・・・ 3 2022/12/28 11:36
- Illustrator(イラストレーター) Illustrator アンカーポイント選択について 3 2023/01/30 12:31
- Illustrator(イラストレーター) アイビスペイント、原稿作成について 1 2023/07/14 03:01
- その他(パソコン・周辺機器) 呪われた様な.......様々な不具合について 2 2022/08/26 15:52
- Illustrator(イラストレーター) ワードに貼った画像のキャンバスと画像本体のサイズの調整 2 2022/05/19 18:31
- マンガ・コミック AIの発展で、これからの漫画は面白くなると思いますか? 6 2023/05/09 13:42
- フリーソフト GIMPの使い方 1 2022/07/11 13:52
- アニメ アニメのシーンでTwitterやティックトックなどのアプリ名前や画面ををそのまま描写してるアニメとア 1 2023/05/23 00:04
- マウス・キーボード PC画面に表示されているHPなどを上下にスライドさせたい 7 2023/03/17 11:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PCで「使用可能な場合はグラフ...
-
NVIDIAのシェーダーキャッシュ
-
描画を透明にする方法
-
物理シミュレーションの可視化(C#)
-
VC++6.0 MFCダイヤログベースで...
-
UpdateData( FALSE); による文...
-
[VB.net] DataGridViewの列ヘッ...
-
エディットコントロールを再描...
-
MFCのタイマーのつかい方を教え...
-
TextBoxに文字を書いても表示さ...
-
MFCでOnPaintのタイミング
-
[Win32API]JpegをDIBに変換する
-
C# ラバーバンドの描画を快適に...
-
GetGlyphOutline() ご利用経験...
-
ClistBoxでオーナードローがよ...
-
Windowのちらつき防止
-
vb.netでテキストボックス内の...
-
iPhoneアプリで作成したアプリ...
-
フラッシュで正六角形を作る方法
-
Form1 Load で実行されない。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB6,リストボックスの特定行の...
-
[VB.net] DataGridViewの列ヘッ...
-
NVIDIAのシェーダーキャッシュ
-
MFCでOnPaintのタイミング
-
TextBoxに文字を書いても表示さ...
-
word
-
UpdateData( FALSE); による文...
-
VC++プログラムをつかったBMP画...
-
InvalidateRectの使い方について
-
StretchBlt関数について
-
OneNote 2010 文字と描画がずれる
-
C# ラバーバンドの描画を快適に...
-
エクセルでガンチャートを作成...
-
C++にて、塗りつぶされた円を描...
-
VBAにGDI+を参照させる方法
-
MFC DrawText 背景色とフォント
-
GDI+で高速な描画
-
MFCのタイマーのつかい方を教え...
-
Labelの文字をスクロールする際...
-
FlexGridの一部のみ表示を更新...
おすすめ情報