• ベストアンサー

文字のちらつきを抑えるには

VisualStudio2005でAPIをを使ってマウスの位置を表示するソフトを作っています。WM_MOUSEMOVEメッセージがきたら位置を取得して、InvalidateRect関数を使って再描画しています。再描画する際に文字のちらつきが気になります。HPを調べたりいろいろやってみたのですが、ちらつきを起こす原因と対処法(ダブルバッファリング)の大まかな部分しか分かりませんでした。もし、参考になるサイトや詳しい方がいらっしゃったらご教授ください。※MFCは使っていません。

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★次の過去質問のサンプルを活用して下さい。 ・http://oshiete1.goo.ne.jp/qa3052870.html→『画面がチカチカする』  プロシージャ関数の部分だけです。  今表示するソフトのプロシージャ関数と入れ替えて動作を見て下さい。  ちらつかないはずです。これを元に『ダブルバッファリング』を実装して下さい。  ※過去質問を『ダブルバッファ』で検索すると見つかることもあります。  ※質問する前に検索しましたか? ・以上。

参考URL:
http://oshiete1.goo.ne.jp/qa3052870.html
oeilvert
質問者

お礼

お返事が遅れて申し訳ありません。 ありがとうございました。

関連するQ&A

  • クライアント領域を再描画させない方法

    クライアント領域で左クリックを押したままマウスを移動させた時の処理 (WM_MOUSMOVE)として、マウスの位置情報を、 InvalidateRect(hWnd, NULL, FALSE); でWM_PAINTに送り、WM_PAINTで描画処理をさせます。 右クリックでの処理として、 case WM_RBUTTONDOWN:    InvalidateRect(NULL, NULL, TRUE);    return 0; とした時、WM_PAINTでは 右クリックによるWM_PAINTでは、クライアント領域を 再描画させない様にしたいのですが、 どのようにしたら良いのでしょうか? クライアント領域に描画されたのを再描画させないことで、 消したいのです。 MS VC++ & Win98 の環境で作成しています。

  • MFC ビットマップ描画で残像が残る

    MFCです。 ワーカースレッドで取得したDIBを定期的に描画するプログラムを作っています。 ダブルバッファリングで実現しているのですが、画面リサイズを繰り返すと、再描画の後に、拡大して発生した新しいクライアント領域に古い画像が残ってしまいます。 SelectObject()で選択したコンパチDCのビットマップを選択前のものに戻してなかったのですが、これが原因なんでしょうか?

  • タブをオーナードローすると、ちらついてしまいます

    質問させていただきます。 WindowsSDKを用いて、画面を作成しています。 MFCは使用していません。 タブを使っていますが、タブは作成時にTCS_OWNERDRAWFIXEDを指定しています。 WM_DRAWITEMメッセージが来たら、タブを描画していますが どうしてもちらつきが目立ってしまいます。 WM_DRAWITEMでの処理は、初めにタブの裏画面に描画し 最後にタブに通知された、DRAWITEMSTRUCTのhDCに裏画面の内容をBitBltで転送しています。 メイン画面もダブルバッファリングを行っておりますが、メイン画面はちらついていません。 タブ側で、WM_ERASEBKGNDで何もせずreturnすると、ちらつきはなくなりますが 背景色で塗りつぶされなくなるため、タブが表示される箇所にウィンドウを上に置いたりすると そこが残ってしまいます。 WM_DRAWITEMが頻繁によばれているため、これはちらついているのでしょうか? 解消方法に頭を悩ませております。 どうぞご教授の程お願いいたします。

  • お絵かきソフトにUNDO、REDOを実装したい

    始めまして、TKOZといいます。 今、WIN32APIの勉強の一環として、お絵かきソフトを作っています。 しかし、アンドゥ、リドゥをどうやって実装すればいいのか分からないです。 描画クラスは、基本的にはCreateDIBSectionを使って描画しています。 LPDWORD lpPixel;←が画像バッファです。 LPDWORD UNDOTABLE[100];これがUNDOバッファーのつもりです。 case WM_LBUTTONUP: で UNDOTABLE[CD.DrawCount]=lpPixel; CD.DrawCount++; として、 case IDM_UNDO: {//SendMessage(hWnd,EM_CANUNDO,0,0); CD.DrawCount--; if(CD.DrawCount==0)break; lpPixel=UNDOTABLE[CD.DrawCount]; InvalidateRect(hWnd,NULL,NULL); } としています。しかし、全然UNDOにならず、困っています。 誰か分かる方いましたら、よろしくお願いします。

  • ドローソフトのダブルバッファリングプログラム

    現在、MFCを使ったドローソフトを作成しています。 仕様はキャンバス上にい色々な部品をマウスで配置するといったものです。 画面描画の際の画面チラつき防止にダブルバッファリングという手法があり 裏画面でキャンバスの背景と部品を作成し、表画面に転送するものがある事を知りました。 そこで質問なのですが マウスで一つの部品を選択し移動する場合、背景はどのように描画すべきなのでしょか? もしも、キャンバス上に部品がたくさん有る場合、毎回、全てを描画し直していたら処理が 遅くなってしまいます。 選択した部品だけ再描画する効率的な方法をご存知の方がいました教えて下さい。 どうぞ宜しくお願い致します。

  • MFCで株価チャートソフトを作りたい

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

  • Windowのちらつき防止

    WEB検索をしますと結構情報がヒットしますが、 解決に至ってませんので、よろしくお願いします。 Win32アプリケーションです。 WM_PAINTのタイミングでWindowに文字を描画してますが、 背景の塗りつぶしが原因でちらつきます。 WM_ERASEBKGNDメッセージをつぶせない仕様ですので、 よく用いられる方法で、ビットマップによるダブルバッファリングを行ったところ、 ちらつきが抑えられましたが、極端に遅くなってしまいました。 質問1 ビットマップに描画して画面に転送するという動作は どうしたら早くできるでしょうか? 質問2 どんな方法でも結構ですので、画面のちらつきを抑える方法はないでしょうか? どんなささいなことでもかまいませんので お願いします。 不足している情報がありましたら、ご指摘ください。 補足させていただきます。 こちらの掲示版はなにか返答がなければ、もう本人は何もできませんので。

  • PictureBoxのダブルバッファリングについて

    長文、失礼致します。 私は現在、趣味でRPGを作っているプログラム初心者です。 開発環境はVB2005 ExpressEditionです。 ゲーム中の描画処理は全て1つのPictureBoxで行っています。 PictureBoxのサイズは544×416ピクセルで、描画する画像はGIFやJPEGです。 そして、描画速度がちょっと遅いのが気になっています…。 (縦64、横58ピクセルのキャラが、2cmくらい移動するのに1秒くらい掛かります) どうにか描画速度を速くできないか調べたところ、 ダブルバッファリングという手法を見つけました。 それについて調べたところ、VB2005ではデフォルトでダブルバッファが有効になっているらしい事が分りました。 しかし、以下のように確認したところ「False」と表示され、ダブルバッファが有効になっていないようでした。 Me.Text = Me.GetStyle(ControlStyles.OptimizedDoubleBuffer) また、フォームのロード時に以下のように記述しても、描画速度に変化は見られませんでした。 Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True) Me.SetStyle(ControlStyles.UserPaint, True) Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True) ここで質問なのですが、既にダブルバッファリングされてこの程度の描画速度なら、もっと高速にするには、やはりWin32APIやDirectX等を使うしか方法が無いでしょうか…? あと、現在使っているPCの仕様です。 OS : Windows Vista Home Basic CPU : Celeron(1.73GHz) メモリ : 1GB 何だか色々と叩かれそうな予感がしますが、 ご回答のほど、宜しくお願い致します。

  • JPanel上での描画と各コンポーネントの配置について

    JPanel上で描画とコンポーネントを共存させたいと思っています。例えば、レイアウトはボーダーレイアウトで、North側にcomboboxとbuttonを、Center側に描画領域をとりたいときには、どうすればいいのでしょうか? 描画はダブルバッファリングを持っているのでどうしてもJPanel上でやりたいのです。よろしくお願いします。

    • ベストアンサー
    • Java
  • WM_PAINTとBitBlt

    レベルはWindowsプログラミングを始めて1月半、それ以前にプログラミング経験はありません。 環境は、VC++6.0 WindowsXP SP2です。 WINAPIしか使えません(MFCは分かりません)。 宜しくお願い致します。 定期的に図形を動かすプログラムを副スレッドを用いて作りました。 副スレッドにはSleep(5msスリープ)を入れてあり、スレッドの最後にInvalidateRectを実行し、WM_PAINTを発行して再描画させているのですが、動作は所望な通りなものの、画面がちらついてしまいます。 所持している参考書を読むと、図形を動かす処理を直接ディスプレイに出すのではなく、メモリDCに一度出力し、その後BitBltでディスプレイに出力すればよい(ダブルバッファのことらしい?)、と書いてありました。 また、あるサイトには、WM_PAINTが実行されるとOnEraseBkgndが走るからちらつくとも書いてあり、何だか良く分かりません。 (別のサイトにはOnPaintが走るとか、OnPaintBackgroundが走ると書いてあり、何が本当なのか???) 自分の知りたいことは以下の通りです。 1)WM_PAINTで画面の再描画を行うと画面が何故チラつくのですか? また、ちらつかない様にする方法はあるのでしょうか? 2)BitBltを用いるとチラつかないのは何故でしょうか? 3)参考までにですが、メモリDCでBitBltで転送、以外に画面をチラつかせずに画面を更新させる方法はあるでしょうか? 色々サイトを探してみてのですが、断片的にしか書いておらず、結局自分が所望する回答は得られませんでした。 初心者レベルなので、分かりやすく説明して頂けると大変嬉しいです。 以上、宜しくお願い致します。

専門家に質問してみよう