• ベストアンサー
  • すぐに回答を!

画面リサイズ時のちらつきをなくす方法

MFCです。 ワーカースレッドで取得したDIBを定期的に描画するプログラムを作っています。 DIB描画部の下にはタイトル的な文字列をTextOutしています。 リサイズ時にはDIBのサイズとタイトル文字列表示領域のサイズも変化させる必要があります。 現在、画面をリサイズするとちらつくという問題の対応に悩んでいます。 コンパチDCなどを使ってダブルバッファリングを行うというのはわかっているのですが、 そもそもリサイズ時にちらつくということは、背景が白(デフォルトのブラシ)で塗りつぶされてしまうのが原因だと思っているので、 OnEraseBkgnd()をオーバーライドして、return TRUE するようにしました。 ちらつかなくなったのですが、OnEraseBkgnd()でほかに何もしていないので、リサイズ前のDIBとタイトル文字列が残ってしまって、新たに書き込んだものと重なってしまいます。 OnEraseBkgnd()で背景をいったん塗りつぶせばいいのではないかと思っているのですが、私の考えは正しいでしょうか?

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数1962
  • ありがとう数3

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

  • ベストアンサー
  • 回答No.2

つまり WS_EX_COMPOSITED が使えない理由がある、ということでしょうか? そういう前提だとすると ・MFCのラッピングを使用し自分ではコーディングしない ・ソースコードが会社にあるので詳しく書くのは難しい となると、ちょっとお手上げです。 描画処理についても、ダブルバッファリングなので概要はそういう風になると思うのですが、正確なコード(と、もっと言うと会社側の提示してい る制限、目的とする環境など)が分からないと、なんとも言えません。 それでも推考してみると OnEraseBkgnd()でreturn TRUEとかInvalidateRect(FALSE)とか試していらっしゃるようなので (他にはウインドウクラス登録時にバックグラウンドをNULLにしたり、ウインドウクラスのスタイルからCS_HREDRAWやCS_VREDRAWを外してやるとかも色々考えられますが) >新たに書き込んだものと重なってしまいます という記述を見る限りそこはちゃんと対処出来てると思うのですが ダブルバッファが「本当にうまくいって」いますか? 概ね大丈夫ではないかと思うのですが、Vistaではどうなのか、というとVistaの抱える問題のごく一部しか私は把握していませんので、厳密に言うと完全には分かりません、が 普通に考えると「実際に『描画する側』のバッファ(表示されない裏画面)そのものに対して『背景を 塗りつぶしたうえに文字を書いて』やり」それを実際に見える方へコピーする、という方式にすれば 妥当に考えてOKと思います。 現状そういう風になっていますか?

共感・感謝の気持ちを伝えよう!

質問者からのお礼

先に背景を塗りつぶしてその上に書きたいものを書くようにしたら、実現できました! ありがとうございました。

関連するQ&A

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

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

  • VC++2010 リサイズの謎・・

    VC++2010 リサイズについてなんですが、 あるエディットボックスに文字列を表示させていたんですが、 ↓↓↓↓↓↓↓↓↓↓ r,r49 r,s,58 r,s,100 ウィンドウ全体のサイズを少しでも変えると(リサイズすると) ↓↓↓↓↓↓↓↓↓↓ r,r,49 r,s,58 r,s,100 で表示されてしまい、今まで表示されて改行されていたのが横ぞろいになって困っています。 どうすればリサイズしても前のまま(改行されるやつ)にできますか? よろしくお願いします。

  • 画像のリサイズ

    ブログを始めたので、タイトルの背景に写真を貼り付けようとしています。貼り付けたい画像サイズは「縦205×横770」です。  ただ、手持ちのデジカメには、このサイズを指定して撮影する機能がありません。すでに撮影した写真でもいいのでリサイズしたいのですが、かなり特殊な横長サイズなのでリサイズの方法が分からず困っています。  また、すでに撮影した画像を編集でリサイズしてみたのですが、横に潰れたようになり、うまくいきません。 「205×770」サイズの写真を手に入れる方法や画像サイズをこのサイズにリサイズできる無料ソフトがあれば、教えてください。 芸能人などのブログを見ていると、キレイに写真が貼り付けられているのですがどうやっているのでしょう? http://ameblo.jp/emiri/

その他の回答 (1)

  • 回答No.1

いざという時の拡張ウインドウスタイル WS_EX_COMPOSITED ではダメですか? ただいざというとき、なので 状況によっては使ってはダメな場合があるので ちょうど興味がありますから、それの使用が無理でしたら よろしければOSと サイズ変更時(WM_SIZE)の処理、描画処理、ウインドウ生成、ウインドウクラス登録のあたりのコードを教えてください。

共感・感謝の気持ちを伝えよう!

質問者からの補足

早速の回答、ありがとうございます。 >よろしければOSと >サイズ変更時(WM_SIZE)の処理、描画処理、ウインドウ生成、ウインドウクラス登録のあたりのコードを教えてください。 OSはVistaです。 MFCのDocument-Viewの仕組みを使っていまして、ウィンドウ生成、ウィンドウクラス登録はMFCでラッピングされています(自分ではコーディングしない)が、 ソースコードが会社にありますので、詳しく書くのは難しいです^^; 文章にしますと、 ・WM_SIZE(OnSize)の処理 InvalidateRect(FALSE)でクライアント領域の無効化とステータスバーの内容更新だけです。 ・描画処理 1.DIBをいったんメモリDCへ書き込んだ後、実際の画面用のDCに書き込む。 2.タイトルも1.と同様にいったんメモリDCへ書き込んだ後、実際の画面用のDCに書き込む。 と、こんな感じです。 よく考えると、自分で背景を塗りつぶしてしまったら、システムが塗りつぶす色が違うだけで、塗りつぶし→描画の繰り返しで、結局ちらついてしまうような気がします。

関連するQ&A

  • プリンタへ文字列の出力方法について

    1、改行コード「\r\n」を含む文字列を取得 2、「印刷」コモンダイアログを呼出す。 3、TextOut()関数で出力する。 すると、改行されずに「・・」と文字化けされて出力される。 どうやらTextOut()関数では、改行コードがサポートされていない様でした。 そこで、質問です。 改行コードを含む文字列を、改行して出力する方法はないでしょうか? TextOut()関数で出力するには、 改行を含む文字列を、改行を含まない文字列に分けるしかないですよね? 良い方法がないかな?と思い質問させて頂きました。 #Win98、VC++、SDKで作成しています。

  • GetTextExtentの動きが違う

    VC++2008でmfcによるグラフィックス系のアプリを開発しています。 ビューに文字列を描画する前にその幅を取得したく、 文字列入力用のエディットボックスに文字列を入力中にメモリデバイスコンテキストを作成し、 GetTextExtent関数を用いて取得しています。 しかし、Releaseビルドして実行したところ、Debug版で取得したサイズと違うため困っています。 例えばDebug版で1文字の幅が18、2文字で35となっているものが、 Release版だと28, 57になっていました。 幅を同じにするための解決案はございますでしょうか。

  • toString()メソッドについて2

    toString()メソッドは、自分で設計したクラスで定義しておく(オーバーライドする)とより便利です。「Car@数値」よりももっとわかりやすい文字列を返すようにすることができるからです。 とある本に書いてありますが、オーバーライドするとわかりやすい文字列を返すとは どういう意味でしょうか?

    • ベストアンサー
    • Java
  • PHPのGD系の関数で描画した文字列の下に下線を引きたい

    PHPのGD系の関数で描画した文字列の下に下線を引きたい PHPのGD系の文字列関数がありますよね? (例:日本語が扱えるやつだとImageTTFTextとか) これで文字列の長さに揃えてリンクっぽく見せるために 下線を引きたいのですが、良い手法が思いつきません。 文字数をstrlenでカウントしてフォントのサイズ/2を掛けたら 文字列の長さになるかなーと思って試しましたが、 これだとaとあの文字の横幅が違うようにずれが出ます。 あるフォントである文字列描画関数を使ったときに文字列の横幅が 調べられるような手法があれば、その長さに応じた下線が引けるのですが、 そうした手法はないでしょうか?

    • ベストアンサー
    • PHP
  • C言語で文字列バッファを消去する方法

    今、C言語とWin32 APIを使ってプログラミングをしています。 wsprintf(str,TEXT("プレイヤーの攻撃!")); TextOut(hdc,0,520,bstr,lstrlen(str)); if(ehp <= 0) {    wsprintf(str,TEXT("敵を倒しました"));    TextOut(hdc,0,520,bstr,lstrlen(str)); } このコードを実行すると、2回目のTextOutのところで 「敵をたおしました撃!」と出てしまいます。 きっとstrに以前の文字列が残っているからだと思いますが、 この保存した文字列を消去するにはどうしたらよいのでしょうか? for文でstr[0]から'\0'までナル文字を代入し続けたり、いろいろと試したのですが駄目でした。どうかこんな自分にご助力お願いできないでしょうか? どうかお願い致します。

  • Visual Web Developerで描画

    こんばんは Visual Web Developerを初めて間もない者です。 Imageに文字列を描画したいと思っています。 例えば Textboxに入力した文字列をButtonイベントで取得して Imageで表示している画像上に描画 のような感じです。 その他の制約としましては、 ・画像サイズに合わせて文字列が折り返して描画されること どなたかご教授お願いいたします。 開発環境 ・Window XP Home Edition ・VWD 2010 Express(ASP.NET Webサイト C#)

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

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

  • サイトの印刷とサイズ変更の方法について

    サイトの画面を背景や文字列等そのままの状態で、A4の用紙にサイズを小さくして印刷したいのですが(例えば、サイトの1ページをA4用紙の半分のサイズに縮小して印刷)どうしたら出来ますか?? パソコンに詳しくないので、分かりやすく教えて頂けたらと思います。 よろしくお願いします。 ちなみに。。。 ツールで『背景の色とイメージを印刷する』はチェックをしています。 パソコンはWindowsXPです。

  • 非クライアント領域への描画について

    非クライアント領域に文字を書こうとしました。 以下の(2)では書けますが、(1)では書いてくれません。 CPaintDCはクライアント領域でないとダメなのですか? void CMainFrame::OnPaint() { CPaintDC dc(this); // 描画用のデバイス コンテキスト dc.TextOut(0,0,"こんにちは"); ・・・(1) CDC* pDC = GetWindowDC(); pDC->TextOut(100,0,"こんにちは"); ・・・(2) 環境 WIN98 VC++6.0 MFC

  • TextOutの長さ

    char str[99]; strcpy(str,"文字の大きさ="); TextOut(hD,0,0,str,strlen(str)); の長さを求めるC関数を教えてください。 この後に文字列を追加したいのです。