dポイントプレゼントキャンペーン実施中!

株価のチャートを表示するソフトを、MFCアプリで作ろうとしています。

チャートを表示して、マウスをウィンドウ内で動かすと十字カーソルが動いて、
現在ポイントしている場所の株価が表示されるようにしたいと思っています。

そこで十字カーソルの表示の処理をどのように実現したらいいか分かりません。
簡単に思いつく方法では、ビュークラスのOnDraw関数の中にチャートと十字カーソルを
一緒に描く(デバイスコンテキストに描き込む)ようにして、さらにWM_MOUSEMOVEイベント
が発生するたびにRedrawWindow()してチャートと十字カーソルを一緒に再描画する、
という方法で試したのですが、マウスを移動(カーソルを動かす)のたびに、
チャートごと再描画するために画面がチカチカして見栄えが悪くなってしまいます。

チカチカしないように十字カーソルだけ動くように見せるには
どのようなコードを書けば良いでしょうか?

「MFCで株価チャートソフトを作りたい」の質問画像

A 回答 (2件)

ANo.1です



ダブルバッファを使えば、カーソルの動きが重くなることはあっても、ちらつかなくなるはずです。
該当するOnDraw以外のどこかで描画をしているところはないでしょうか。

確認としては、メモリデバイスコンテキストから、ウィンドウデバイスコンテキストへ転送する部分をコメントアウトして実行してみてください。
他に描画している部分がなければ、真っ白な画面が出てくるはずですが、何か描画されたら、別の場所でも描画しているということになります。

また、カーソルの描画処理をコメントアウトして実行してみてください。
それでちらつきが止まれば、カーソル描画に原因があります。

地道に、試行錯誤していくしかないですね。
    • good
    • 0
この回答へのお礼

・・・おかげさまで、やっと解決しました。

まずひとつ勘違いしていたのは、描画処理はOnDraw()の中ではなく、
OnPaint()でやっていました。そしてコード上はダブルバッファリングに
してもまだちらついてた原因は、WM_PAINTメッセージを発行するときに
背景を消去するWM_ERASEBKGNDメッセージが処理されているため、ということが
このサイトの過去のQ&Aを見て判明しました。そこでWM_ERASEBKGNDメッセージ
のハンドラ内で背景を消去しないようにしたところ、ちらつきがなく、
期待通りのスムーズな描画処理が行われるようになりました。

どうもありがとうございました。

お礼日時:2010/01/28 04:39

ちらつきをなくすには、ダブルバッファリング/トリプルバッファリングという方法をとります。



http://www.t-recipe.com/vc/flicker.html


1.チャートだけを描画するメモリデバイスコンテキストを用意しておく
2.チャートメモリデバイスコンテキストにチャートを描画しておく(変更があるまでそのまま保持)
----(ここからがOnDrawの処理)
3.バックバッファ(memDC)にチャートメモリデバイスコンテキストの内容を描画(転送)
4.バックバッファにカーソル(点線)を描画
5.バックバッファをデバイスコンテキスト(この場合は、ウィンドウのデバイスコンテキスト)に描画(フリップ)


ダブルバッファを使うと、ちらつきはなくなりますが動作が重くなる場合があります。
3の手順で、更新が必要な最小限の領域だけを描画すればある程度軽くなります。

とはいえ、最近のPCで、チャート程度の面積なら全面書き換えしてもさして重くないでしょう。
作る簡単さや、更新領域の計算ミスによるバグを考えたら、最初は全面更新で作ってみてはいかがでしょうか。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

リンク先のサンプルコードをダウンロードして実行してみたところ
確かにちらつきがないことを確認できました。早速その方法を真似て
自分のコードでもやってみたのですが、なぜか効果がなくちらつきがあるままでした。
メモリデバイスコンテキストにチャートとカーソルを一緒に書き込んでから
ウィンドウのデバイスコンテキストに一気に転送するというやり方です。
それ以外にもいじっていくつか試したのですが、ちらつきは消えませんでした。
なぜうまくいかないか原因が全く不明なのですが、何か思い当たる原因はありますか?

なお別の方法として、ダブルバッファリングは行わないで、InvaridateRect()とUpdateWindow()
を使って、カーソルが移動する領域だけ再描画する方法を試したところ、ちらつきが
軽減されました。(ウィンドウ全体のちらつきは消えて、カーソルだけちらつくようになった)
もし、ダブルバッファリングがうまくいかない原因がどうしても分からなかったら、
この方法で妥協しようかと思っています。

お礼日時:2010/01/25 06:58

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