ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと

VC++2010 描画処理について質問なんですが、
再描画するさい、前の描画した画像(自分が今作成しているプロジェクトでいうと前、描画した点が消えてしまってあらたに点が描画されるんですが)その前、描画された点を消すことなく新たに点が描画される方法が分からないので質問させていただきました。このままだったら直線にならない、そして点がただ動くだけのプロジェクトになります。点がただ動くだけのじゃない、線が描画される方法をよろしくお願いします。

ではよろしくお願いします。

A 回答 (4件)

同じような質問をぽこぽこ立てますねぇ……。



対策としては既に書かれている通り。

出力する点の位置を覚えておく。
# リングバッファとかですかねぇ。
# 単純に配列でもイイでしょうけど。
=>WM_PAINTが来たときに記憶させていたデータからすべての点を描画する。
  正確にはWM_PAINTで再描画を指示された範囲…でしょうけど。

ビットマップに描いておく。
# 再描画の処理としてはこっちの方がラクでしょうかね。
# WM_PAINTでは転送するだけだし。
# その代わり、点の位置を記憶しておく方法よりメモリを食うかと。
=>データ受信するたびにビットマップに描いていく。
 SetPixel()なんてAPIがあります。遅いのでビットマップデータを直接変更かも知れませんが。


ウィンドウサイズを変更した場合に描画する範囲をどうするのか…とか、
端まで描画し終わった後どうするのか…とかの課題がありますが。
# ウィンドウサイズに関してはサイズ可変にしなければいい(最大化も禁止)だけですけどね。

ちなみに、私なら…まずは簡単に実装できる「点の位置を記憶する」でやってみますかねぇ。
あまりに頻繁に書き換えが発生するようならビットマップの方に切り替えるとは思いますが。
それでも内部データの保持に関しては前者の方法取るでしょうな。
# ウィンドウサイズの変更にも対応できますからねぇ。
    • good
    • 0

例えば、



CMyDailog:OnPaint()
{
 【描画処理】

 CDialog::OnPaint();
}

ってなってるのなら、最後の

CDialog::OnPaint();

を削除、コメント化するとか。

描画した点を消す処理は呼び出されなくなるハズですが、サイズ変更や別のウィンドウが重ねて表示された際の処理も呼ばれないかも。


真っ当な方法なら、
・描画処理の中で、表示されるべき線は全て描画する。
・静的にビットマップを保持しておき、ビットマップへ描画、OnPaintではビットマップの貼り付けのみ行なう。
とか。
    • good
    • 0

これまでに追加された点の「集合」をメンバに用意し、


再描画の時点でその集合に基づいて絵を描けばよろし。
    • good
    • 0

すぐに思いつく方法は2つ。



1. 前回の描画を元にするのではなく、毎回すべて描画する

2. 直接ウィンドウに描画せず、ビットマップオブジェクトに描画し、それをウインドウに転送する
    • good
    • 0

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