株価のチャートを表示するソフトを、MFCアプリで作ろうとしています。
チャートを表示して、マウスをウィンドウ内で動かすと十字カーソルが動いて、
現在ポイントしている場所の株価が表示されるようにしたいと思っています。
そこで十字カーソルの表示の処理をどのように実現したらいいか分かりません。
簡単に思いつく方法では、ビュークラスのOnDraw関数の中にチャートと十字カーソルを
一緒に描く(デバイスコンテキストに描き込む)ようにして、さらにWM_MOUSEMOVEイベント
が発生するたびにRedrawWindow()してチャートと十字カーソルを一緒に再描画する、
という方法で試したのですが、マウスを移動(カーソルを動かす)のたびに、
チャートごと再描画するために画面がチカチカして見栄えが悪くなってしまいます。
チカチカしないように十字カーソルだけ動くように見せるには
どのようなコードを書けば良いでしょうか?
No.2ベストアンサー
- 回答日時:
ANo.1です
ダブルバッファを使えば、カーソルの動きが重くなることはあっても、ちらつかなくなるはずです。
該当するOnDraw以外のどこかで描画をしているところはないでしょうか。
確認としては、メモリデバイスコンテキストから、ウィンドウデバイスコンテキストへ転送する部分をコメントアウトして実行してみてください。
他に描画している部分がなければ、真っ白な画面が出てくるはずですが、何か描画されたら、別の場所でも描画しているということになります。
また、カーソルの描画処理をコメントアウトして実行してみてください。
それでちらつきが止まれば、カーソル描画に原因があります。
地道に、試行錯誤していくしかないですね。
・・・おかげさまで、やっと解決しました。
まずひとつ勘違いしていたのは、描画処理はOnDraw()の中ではなく、
OnPaint()でやっていました。そしてコード上はダブルバッファリングに
してもまだちらついてた原因は、WM_PAINTメッセージを発行するときに
背景を消去するWM_ERASEBKGNDメッセージが処理されているため、ということが
このサイトの過去のQ&Aを見て判明しました。そこでWM_ERASEBKGNDメッセージ
のハンドラ内で背景を消去しないようにしたところ、ちらつきがなく、
期待通りのスムーズな描画処理が行われるようになりました。
どうもありがとうございました。
No.1
- 回答日時:
ちらつきをなくすには、ダブルバッファリング/トリプルバッファリングという方法をとります。
http://www.t-recipe.com/vc/flicker.html
1.チャートだけを描画するメモリデバイスコンテキストを用意しておく
2.チャートメモリデバイスコンテキストにチャートを描画しておく(変更があるまでそのまま保持)
----(ここからがOnDrawの処理)
3.バックバッファ(memDC)にチャートメモリデバイスコンテキストの内容を描画(転送)
4.バックバッファにカーソル(点線)を描画
5.バックバッファをデバイスコンテキスト(この場合は、ウィンドウのデバイスコンテキスト)に描画(フリップ)
ダブルバッファを使うと、ちらつきはなくなりますが動作が重くなる場合があります。
3の手順で、更新が必要な最小限の領域だけを描画すればある程度軽くなります。
とはいえ、最近のPCで、チャート程度の面積なら全面書き換えしてもさして重くないでしょう。
作る簡単さや、更新領域の計算ミスによるバグを考えたら、最初は全面更新で作ってみてはいかがでしょうか。
回答ありがとうございます。
リンク先のサンプルコードをダウンロードして実行してみたところ
確かにちらつきがないことを確認できました。早速その方法を真似て
自分のコードでもやってみたのですが、なぜか効果がなくちらつきがあるままでした。
メモリデバイスコンテキストにチャートとカーソルを一緒に書き込んでから
ウィンドウのデバイスコンテキストに一気に転送するというやり方です。
それ以外にもいじっていくつか試したのですが、ちらつきは消えませんでした。
なぜうまくいかないか原因が全く不明なのですが、何か思い当たる原因はありますか?
なお別の方法として、ダブルバッファリングは行わないで、InvaridateRect()とUpdateWindow()
を使って、カーソルが移動する領域だけ再描画する方法を試したところ、ちらつきが
軽減されました。(ウィンドウ全体のちらつきは消えて、カーソルだけちらつくようになった)
もし、ダブルバッファリングがうまくいかない原因がどうしても分からなかったら、
この方法で妥協しようかと思っています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Windows 10 Windows11タスクバーやエクスプローラー、スタートメニュー 動画全画面時にカーソルが見えない 1 2022/04/08 00:03
- Visual Basic(VBA) VBA 画面上のカーソルに文字数字を入力するコードを教えて下さい 1 2022/10/30 10:31
- モニター・ディスプレイ 「.cur」のアイコン表示について 4 2023/03/04 10:21
- Windows 8 動画の再生とタイトルの変更方法を教えてください。 3 2022/08/01 14:51
- Excel(エクセル) エクセルVBA 任意のセルの選択時、指定のセルの値を表示 1 2023/04/21 08:13
- gooブログ Twitterの動画画面をgooブログに埋め込めない 4 2022/06/03 16:40
- Gmail 携帯電話を使わず Google の二段階認証を登録できる? 2 2023/03/29 21:56
- iPhone(アイフォーン) iphoneの文字入力 フリック入力をよく使っています。 空白が全角なのが気になる点、 空白長押しで 1 2022/06/28 17:49
- モニター・ディスプレイ マルチモニタでのカーソルの動き方 1 2022/06/15 14:59
- モニター・ディスプレイ 新しいPCモニターの購入を考えています。株取引とFX取引。 4 2022/05/01 12:19
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
NVIDIAのシェーダーキャッシュ
-
OpenCV処理画像をpictureBoxへ。
-
VC++プログラムをつかったBMP画...
-
UpdateData( FALSE); による文...
-
コンボボックスの高さを変えたい
-
PCで「使用可能な場合はグラフ...
-
Windowのちらつき防止
-
InvalidateRectの使い方について
-
OnDrawが呼び出されません
-
C#のタブコントロールについて...
-
[VB.net] DataGridViewの列ヘッ...
-
C++にて、塗りつぶされた円を描...
-
vb.netでテキストボックス内の...
-
VB6,リストボックスの特定行の...
-
タブをオーナードローすると、...
-
GDIからDirectXへの移行
-
エクセルでガンチャートを作成...
-
VBAにGDI+を参照させる方法
-
word
-
エクセルで作った新しいウイン...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PCで「使用可能な場合はグラフ...
-
[VB.net] DataGridViewの列ヘッ...
-
UpdateData( FALSE); による文...
-
NVIDIAのシェーダーキャッシュ
-
VB6,リストボックスの特定行の...
-
TextBoxに文字を書いても表示さ...
-
word
-
MFCでOnPaintのタイミング
-
エクセルでガンチャートを作成...
-
MFCのタイマーのつかい方を教え...
-
InvalidateRectの使い方について
-
VC++プログラムをつかったBMP画...
-
CScrollViewの使用方法について
-
CStaticコントロールの静的イメ...
-
VB.netでのライン描画方法がわ...
-
Labelの文字をスクロールする際...
-
Form1 Load で実行されない。
-
VBAにGDI+を参照させる方法
-
C++にて、塗りつぶされた円を描...
-
FlexGridの一部のみ表示を更新...
おすすめ情報