- ベストアンサー
VC++2010 描画処理について
VC++2010 描画処理について質問なんですが、 再描画するさい、前の描画した画像(自分が今作成しているプロジェクトでいうと前、描画した点が消えてしまってあらたに点が描画されるんですが)その前、描画された点を消すことなく新たに点が描画される方法が分からないので質問させていただきました。このままだったら直線にならない、そして点がただ動くだけのプロジェクトになります。点がただ動くだけのじゃない、線が描画される方法をよろしくお願いします。 ではよろしくお願いします。
- hanyu-yuugo
- お礼率10% (15/141)
- C・C++・C#
- 回答数4
- ありがとう数0
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
同じような質問をぽこぽこ立てますねぇ……。 対策としては既に書かれている通り。 出力する点の位置を覚えておく。 # リングバッファとかですかねぇ。 # 単純に配列でもイイでしょうけど。 =>WM_PAINTが来たときに記憶させていたデータからすべての点を描画する。 正確にはWM_PAINTで再描画を指示された範囲…でしょうけど。 ビットマップに描いておく。 # 再描画の処理としてはこっちの方がラクでしょうかね。 # WM_PAINTでは転送するだけだし。 # その代わり、点の位置を記憶しておく方法よりメモリを食うかと。 =>データ受信するたびにビットマップに描いていく。 SetPixel()なんてAPIがあります。遅いのでビットマップデータを直接変更かも知れませんが。 ウィンドウサイズを変更した場合に描画する範囲をどうするのか…とか、 端まで描画し終わった後どうするのか…とかの課題がありますが。 # ウィンドウサイズに関してはサイズ可変にしなければいい(最大化も禁止)だけですけどね。 ちなみに、私なら…まずは簡単に実装できる「点の位置を記憶する」でやってみますかねぇ。 あまりに頻繁に書き換えが発生するようならビットマップの方に切り替えるとは思いますが。 それでも内部データの保持に関しては前者の方法取るでしょうな。 # ウィンドウサイズの変更にも対応できますからねぇ。
その他の回答 (3)
- neKo_deux
- ベストアンサー率44% (5541/12319)
例えば、 CMyDailog:OnPaint() { 【描画処理】 CDialog::OnPaint(); } ってなってるのなら、最後の CDialog::OnPaint(); を削除、コメント化するとか。 描画した点を消す処理は呼び出されなくなるハズですが、サイズ変更や別のウィンドウが重ねて表示された際の処理も呼ばれないかも。 真っ当な方法なら、 ・描画処理の中で、表示されるべき線は全て描画する。 ・静的にビットマップを保持しておき、ビットマップへ描画、OnPaintではビットマップの貼り付けのみ行なう。 とか。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
これまでに追加された点の「集合」をメンバに用意し、 再描画の時点でその集合に基づいて絵を描けばよろし。
- m-take0220
- ベストアンサー率60% (472/775)
すぐに思いつく方法は2つ。 1. 前回の描画を元にするのではなく、毎回すべて描画する 2. 直接ウィンドウに描画せず、ビットマップオブジェクトに描画し、それをウインドウに転送する
関連するQ&A
- VC++2010 で線形の描画についてですが・・
VC++2010 で線形の描画について質問なんですが、 線を描画することはできたんですが、描画中に最小化してふたたび開くと描画されていた線形が 消える現象が発生しました。 どうすれば消えないかよろしくお願いします。
- ベストアンサー
- C・C++・C#
- MFC 6.0 VC++ で、処理が重くなります。
MFC 6.0 VC++ で、処理が重くなります。 上記の環境でダイアログベースで処理を作成しています。 画面の再描画を繰り返すと、同じ処理をしていても処理が重くなります。 OnPainメッセージを受け取ったあとに、描画処理を行っているのですが、画面に表示に必要な計算も描画時に行っています。 仮想ウィンドウに描画してBitBlt()を実行する方法も試しましたが、ちらつかなくなった代わりに余計に処理が重くなりました。 描画のやり方が問題なのか、内部の処理が問題なのか良く分からないのですが、何か良い方法が無いでしょうか? そもそもダイアログベースで画像処理をしているのが間違いな気もするのですが・・・。
- ベストアンサー
- 画像・動画・音楽編集
- MFC 6.0 VC++ で、処理が重くなります。
MFC 6.0 VC++ で、処理が重くなります。 上記の環境でダイアログベースで処理を作成しています。 画面の再描画を繰り返すと、同じ処理をしていても処理が重くなります。 OnPainメッセージを受け取ったあとに、描画処理を行っているのですが、画面に表示に必要な計算も描画時に行っています。 仮想ウィンドウに描画してBitBlt()を実行する方法も試しましたが、ちらつかなくなった代わりに余計に処理が重くなりました。 描画のやり方が問題なのか、内部の処理が問題なのか良く分からないのですが、何か良い方法が無いでしょうか? タスクマネージャーを見るとコミットチャージが増えているようです。 このコミットチャージもどう対処してよいのか良く分からないのですが、これが関係しているでしょうか?
- ベストアンサー
- C・C++・C#
- 「VC++6」ウィンドウの再描画
VC++6を使って簡単なプログラムをダイアログベース作っています。 内容はリストを読み込み、1件ずつDBにSQLを発行して情報を取得していくという内容です。 画面には、プログレスバーも設置しており、普通に操作すると正常に、プログレスバーも動きます。しかし、いったん別のウィンドウをアクティブにして、作成した動作中のプログラムを再選択しても、画面は壊れたまま再描画されません。しばらくまって、リストのSQL発行が終わって、画面に結果が表示されたら、きちんと再描画されます。 そこまで処理が終わったら、他のウィンドウに切り替えて戻ってきても画面が壊れることはありません。 時間がかかるプログラムなので、動作中に別の仕事をするため、アクティブでなくても、きちんとウィンドウを更新したいのです。 ちなみに、ループ処理中にRedrawWindow();を入れてみましたがダメでした。 アドバイスよろしくお願いします。
- ベストアンサー
- C・C++・C#
- 【VC++】コントロールの上に描画
【VC++】コントロールの上に描画 Visual C++ 2005環境です。 ニコニコ動画みたいな動画プレイヤを作ろうとしているのですが、 作成するにあたって、コントロールの上にテキストを描画する方法で悩んでいます。 ボタンでもチェックボックスでもなんでも良いのですが、 そういったフォーム上のコントロールの上にテキストなり図形なりを描画するのって どういう方法で実装したら良いのでしょうか? サンプルのコードがあれば嬉しいですが、 無くても「こういうものを調べれば出来る」という取っ掛かりだけでも 教えて頂けると助かります。 すみませんが、方法ご存知の方居ましたらお願いします。
- 締切済み
- C・C++・C#
- Illustratorでの線の描画について
Illustratorでの線の描画について 地図を下絵として道路を書いています。 ペンツールを使用して、1点をクリック、次の点をクリック直線が引けます。 さらに90度方向を変えてクリック。直線がひけるのですが、このときに 始点と最後の点を交えた三角の白い部分ができるのですが(説明が下手ですみません) これができないように線を描く方法を教えていただけませんでしょうか。 よろしくお願いします。
- ベストアンサー
- 画像・動画・音楽編集
- OpenCV処理画像をpictureBoxへ。
VC++にて画像処理を行っています。 OpenCVのライブラリを使って画像処理をしようと考えているのですが、 処理した画像がMFCで作成したpitureBoxに表示の仕方が分かりません。 調べていくうちに、 「IplImage形式の画像を直接ウィンドウに描画することは出来ないので、 画像をDIBセクション形式に変換してWindows固有の描画処理を行うといい。」 ということが分かり、DIBセクション形式への変換には、IPLを入手し、 「iplConvertToDIB()関数」を使うということが分かりました。 このiplConvertToDIB()関数をつかって画像表示の方法を教えてはいただけないでしょうか?サンプルのソースなどありましたらよろしくお願いいたします。
- 締切済み
- C・C++・C#
- vc++のペイント処理。
VC++のマネージ形式でピクチャーボックスにMousDownした時にMouseMoveを使って、絵で落書きするんですが、デバックして絵を書いた後、Formを最小化した後、元に戻すと、絵を書いたのに、書いた絵が消えてます。この時の絵を書くときには、PenとGraphicと配列処理(<arry> Point)を使いました。 今度は、SetPexelを使ってプログラムをくんで、Bitmapとして処理したら、pictureBoxにMousuDownして絵を書くと、点みたいに書けてゆっくりMousuDownしてるときは、線をかけるんですが、早く書こうとすると点々みたいのでかけますし、最小化しても消えません。 前者の方法だとスムーズにかけるんですが、消えちゃいます。 後者の場合はゆっくり書けば何とか線は書けるんですがスムーズに書けません。 どうしたら、最小化しても消えずにスムーズにかけますか?? 書ける方法てあるんですか??
- ベストアンサー
- C・C++・C#