• ベストアンサー

ちらつきを何とかしたい

επιστημη(@episteme)の回答

回答No.1

# '環境'を明記してください。 > 再描画のたびにいったん白紙になるのでちらつくし WM_ERASEBKGND メッセージに反応して画面を白くする コードを書いているからじゃないかしら? > 直接のイベントの場所でかけば... お行儀のいい実装ではありません。 描画の準備'だけ'行い、再描画領域をInvalidateします。 そうすればWM_PAINTが飛んできますから、そこで描きます。

nubou
質問者

補足

# '環境'を明記してください。 ただ単に ボタンを押したら WM_COMMANDで WM_PAINTのなかのtextファイルを読み出す場所を通過するようにモード設定しTextOutでファイルを書き出しているだけです またそれはロールイベントによってupdownさせます 問題はこのロール(キーダウンのupやダウンやnextやprier)のときのちらつきです 白紙にするような事は何もやっていません 白紙にするのはシステムがいったん画面をクリヤするからだと思います そうしないとダブらない場所に前の画像が残りますからね インバリッドの場所を小さくしてちらつきを減らす方法は再描画の場所が小さいときは言いのですが大きいと当然ちらつきます テキストファイルをロールするときなどです WM_PAINTの宿命ですね

関連するQ&A

  • Win32APIで困っています

    Win32APIでWM_PAINTメッセージを使って変数Bufの中の文字列を表示した場合に 表示した後になんらかのイベントを発生させて表示されている文字列に違う文字列を代入しても、画面に変化がありません。 画面を再描画する方法を教えてください よろしくお願いします。

  • Windowのちらつき防止

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

  • タイトルバーに画像を貼り付ける。&閉じるボタンを左側に移動できるか?

    VC++で作っています。 タイトルバーのデザインをいろいろ変更したいと思っています。 具体的にいうと、 タイトルバーの背景(青色の部分)に画像を貼り付けたりできるのでしょうか? 縮小ボタンとか閉じるボタンをマックみたいに左側に移動できるでしょうか? アイコンを非表示にすることができるでしょうか? などです。 もし無理な場合は、WM_PAINTなどでタイトルバーらしき絵を描画して、ある座標をクリックしたら、”閉じるボタン”などと同じような動作をするように作ろうかなと思っているのですが、これは非効率的でしょうか? どんなことでもいいので、どなたかよろしくおねがいします。

  • ダブルバッファの作り方

    画面に描画するBCC5.5 のCプログラムがあります。画面がちらつくので、ダブルバッファにしたいのですが、具体的に、どの関数を呼んで実装したらよいのかわかりません。WEB検索をしますと結構情報がヒットしますが、解決に至ってませんので、よろしくお願いします。 具体的にやったことは、現在動いているプログラムの case WM_PAINT:  hdc=BeginPaint(hWnd,&ps);  paint(hdc); // 自作の描画プログラム本体  ReleaseDC(hWnd,hdc);  EndPaint(hWnd,&ps);  break; の部分を、「画面サイズのビットマップイメージhBitmapをつくり、そこにpaint関数で描き込み、最終画面を一気に出力する」というつもりで以下のプログラムに書き換えたのですが、表示すらしなくなってしまいました。何が悪いのかお教えください。 case WM_PAINT:  GetClientRect(hWnd,&rt);   h = (int)rt.bottom;   w = (int)rt.right;  hBuffer = CreateCompatibleDC(NULL);  hBitmap = CreateCompatibleBitmap(hBuffer, w, h);  SelectObject(hBuffer, hBitmap);  paint(hBuffer);  hdc=BeginPaint(hWnd,&ps);   BitBlt(hdc, 0,0,w,h, hBuffer,0,0, SRCCOPY);  ReleaseDC(hWnd,hdc);  EndPaint(hWnd,&ps);  DeleteDC(hBuffer);  DeleteObject(hBitmap);  break;

  • Javaアプレットで描画の中断がしたい

    Java初心者です。学校の課題で数学シュミレーションの結果を Javaアプレットで表示するプログラムを作成しています。 この課題のJavaアプレットでは 複素平面のシュミレーション(計算結果を色のグラデーションで表示する)なのですが、 チョイスやボタン、マウスクリックなどによって、 初期条件や、描画方式、表示範囲などを指定することができます。 とりあえず、シュミレーション結果の描画は 試行錯誤の結果表示ができるようになりました。 paint(Graphics g)メソッドで数値計算、及び描画をしています。 (ちなみに余談かもしれませんがダブルバッファリングをしていて、 描画内容をImageとして書き込んでおいて描画するというかたちです。) 「計算途中(計算には結構時間がかかる)に 新たにボタンなどで指定条件が変更された場合、 現在の描画を中断して次の計算と描画を開始できるように プログラムを改良しなさい」というのが今回の課題です。 つまり、「プログラム的にはpaintメソッドが実行されている途中に 特定のイベントが発生したらpaintメソッドを中断し、 もういちど呼びなおしなさい」ということかと思われます。 スレッドを作り、そのスレッドを中断するなども考えました。 インターネットで検索もしてみましたが、 なかなか情報を見つけられず困っています。 学生が作るプログラムなのでそんなに難しいことではないのだと思うのですが 解決できませんでした。 どうぞよろしくお願いします。

  • C言語・Windows RECTが渡せない

    C言語のWindowsプログラムで、左クリック後に四角形の描画をしたいのですがうまくいきません。 WM_LBUTTONDOWNイベントで定義したRECT構造体を、別の関数に渡しRectangleで描画したいのですが、その関数内でRECTの値を調べるととんでもない値になっています。 何度やってもどうして値がおかしくなるのかわかりません。 WM_LBUTTONDOWNもWM_PAINTも正常に反応していると思います。 どうか知恵をお貸しくださいm(_ _)m 以下ソースコードのメッセージ処理部分です。 ウィンドウ生成のひな型はサイトの物を丸写しし、正常に動作することを確認しています。 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT rcPos; switch (msg){ case WM_LBUTTONDOWN: rcPos.top =0; rcPos.left =0; rcPos.bottom =100; rcPos.right =100; InvalidateRect(hWnd, &rcPos, FALSE); break; //ウィンドウの描画 case WM_PAINT: hdc = BeginPaint(hWnd, &ps); DrawGr(hWnd, hdc, &rcPos); EndPaint(hWnd, &ps); break; //ウィンドウの削除 case WM_DESTROY: PostQuitMessage(0); break; default: return(DefWindowProc(hWnd, msg, wParam, lParam)); } return (0L); } //描画 int DrawGr(HWND hWnd, HDC hdc, RECT *rcPos) { int i; HBRUSH hBrush, hOldBrush; char *str_org = "rc.top=%d rc.left=%d rc.bottom=%d rc.right=%d"; char strx[256]; //四角形 hBrush = CreateSolidBrush(RGB(100, 100, 255)); hOldBrush = (HBRUSH)SelectObject(hdc, hBrush); //デバッグ用 wsprintf((LPSTR)strx, (LPCSTR)str_org, rcPos->top, rcPos->left, rcPos->bottom, rcPos->right); MessageBox(hWnd, (LPCSTR)strx, (LPCSTR)"終了確認", MB_OKCANCEL | MB_ICONQUESTION); Rectangle(hdc, rcPos->left, rcPos->top, rcPos->right, rcPos->bottom); SelectObject(hdc, hOldBrush); DeleteObject(hBrush); return 0; }

  • panelのスクロール表示について

    C#にて、WIndowsアプリを作成しています。 GridviewのcellEnterイベント発生時に、Panelに文字を記載する! というプログラムを 作成しています。表示の文字がPanel内を超過した際の事を考え、PanelのAutoscroll = Trueに設定しています。しかしながら、文字がPanelを超過してもうまくスクロールを表示してくれません。。。 どのようにすれば、解決できるのでしょうか。。。。 ご存知の方、ご教授願います。 以下、文字列記載のPaintメソッドです。 また、Paintメソッド呼び出しには、    this.pCon.Invalidate(); を利用しています。 private void pCon_Paint(object sender, PaintEventArgs e) { StringFormat strformat = new StringFormat(); if (this.pCon.Enabled == true) { SolidBrush brushText = new SolidBrush(ForeColor); // 通常の文字列を描画する e.Graphics.DrawString( c, // 描画する文字列 this.Font, // フォント brushText, // 色(ブラシ) e.ClipRectangle,// 描画領域 strformat); // 文字列の書式 brushText.Dispose(); } else { // 無効化された文字列を描画する ControlPaint.DrawStringDisabled( e.Graphics, // 描画オブジェクト c, // 描画する文字列 this.Font, // フォント this.BackColor, // 色 e.ClipRectangle,// 描画領域 strformat); // 文字列の書式 } strformat.Dispose(); }

  • VB.NETのグラフィック描画について

    グラフィック描画ですが、引数を持たないサブルーチンプロシージャ(固定的な 目盛り等)は、PictureBox_paint(***イベントプロシージャ内に記述すればグラフィック描画ができます(e.Graphicsでグラフィックスオブジェクトを取得できる為)が、 X、Y座標を引数としたサブルーチンプロシージャを作り、その中でLineDraw(*****で描画させたい場合サブルーチンプロシージャ内に dim g As Graphics=pictureBox1.CreateGraphics() でグラフィックオブジェクトを生成しても 描画できないのですがどのようにすれば解決できるでしょうか(イメージがわかり難いかもしれませんのでサンプルを書きました) よろしくお願いします (1)private sub pictureBox1_paint(Byval sender as Object, Byval e as system****** e.Graphics.DrawLine(****** (これは描画できる) End Sub (2)private sub zahyou() ' 座標を生成するサブルーチンプロシージャ dim i as integer for i=0 to 10 hyouji( i , i*5 ) End Sub private sub hyouji( x as integer, y as integer) ’直線を引くサブルーチンプロシージャ dim g As Graphics=pictureBox1.CreateGraphics() g.DrawLine(***,x,y**** (これは描画できない)

  • 画像表示について。

    現在SDKにてBMPやRAWなどの画像表示ソフトを作成している段階です。 そして、一通り作成することができました。 ここで質問に答えてくださった皆様に感謝します。 新たに些細な問題が出てきてしまったので質問します。 作成したソフトはMDI型のソフトであり、その構成はフレーム、クライアント、ドキュメントウィンドウといった構成になっています。 もちろん読み込んだ画像はドキュメントウィンドウに表示をするのですが、このドキュメントウィンドウのサイズをマウスを使って変更した場合、画像にちらつきが生じてしまいます。 原因はプログラム上 WM_PAINT メッセージがきた場合に描画をおこなうことに他ならないのですが、解決する手段はないでしょうか? 例えばダブルバッファリングなどの手段があればよいのですが・・・

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

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