プロが教えるわが家の防犯対策術!

VC++2010 で線形の描画について質問なんですが、
線を描画することはできたんですが、描画中に最小化してふたたび開くと描画されていた線形が
消える現象が発生しました。
どうすれば消えないかよろしくお願いします。

A 回答 (4件)

「消えないようにする」方法はありません.



「消えてないように見える」方法でよければありますが... って, 単に「また描く」だけ.
    • good
    • 0

前回の質問の回答通りにコーディングしているなら、描画処理はOnPaintに書かれいてるはずで、そうであれば質問のような現象は起こりません。



あなたがどのようにコーディングしたのかを示さないと、問題点も指摘できませんよ。

この回答への補足

ボタンのイベントに直接プログラムを記述しています。
ボタンがクリックされたときですね。セットタイマで毎秒毎秒起動するようにしています


具体的にいうと、ボタンのイベントのところにセットタイマを設置(1ミリ秒ごとに読んでいます)して、タイマーのところに描画するプログラムを記述しています。
どうしてもミリ単位で描画しなければならないのでそういう風にしています

補足日時:2012/08/29 12:23
    • good
    • 0

>ボタンのイベントに直接プログラムを記述しています。



ならば、ボタンクリックされたときだけ描画されます。
なんらかの原因で再描画がかかったとき(OnPaintが実行されるとき)はボタンクリックのハンドラ内に書いたコードは走りませんから消えるのは正常な動作です。
# 意図した動作では無いでしょうが。

画面描画に関するモノはOnPaint内に集約しないとそういうコトになります。

最小化/最大化して戻したとか、別のウィンドウが被さって戻したとか…
そういう「クライアント領域の再描画が必要な状況」になったらWM_PAINTメッセージで再描画を指示する。
というのがWindowsでのルールになります。


>ボタンのイベントのところにセットタイマを設置(1ミリ秒ごとに読んでいます)して、タイマーのところに描画するプログラムを記述しています。

ならば、次のタイマーイベントが発生したときに描画されるでしょう。
# 描画した後にWM_PAINTが飛んでくると消えるかも知れませんが。

ちなみに…Windowsのタイマーはそんな精度が出ない場合もありますが、そのヘンは問題ないんですか?
「Windows WM_TIMER 精度」辺りで検索してください。
メッセージキューが溜まっている状態だとWM_TIMERは後回しになれることがあるようですし。
# WM_PAINTも複数のものが1つに纏められる場合がある。
「外部機器から1msごとにデータを読む必要がある。」のであればWM_TIMERは使えませんよ。
# 取りこぼしが発生する。そういう用途にはスレッドを使うことになるでしょう。

まぁ1msで書き換えても認識できませんけどね。描画自体が1msで終わるか…も微妙なところ??
液晶モニタだと垂直同期はあまり意味ありませんけど…
75Hzでも13msいないに書き換えた内容はモニタに表示できません。
    • good
    • 0

回答はOnPaintで描画処理しているわけですから、独自処理のために変更が必要だとしても、問題点が発生した場合は元々のコード(OnPaintで処理)で同じ問題が発生するか確認してみれば、原因の一端がつかめたはずです。



描画処理はOnPaintで行わないといけないのは、回答3にある通りです。
タイマーを使う場合、タイマーイベントで描画処理するのではなく、InvalidateRectで描画を更新したい領域を設定した上で、UpdateWindowを使って強制的に描画させます。
タイマーの精度が足りない場合は、マルチメディアタイマーというものも用意されています。
    • good
    • 0

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