- 締切済み
Windowsプログラミング 画面描画 ちらつき
SetDIBitsToDevice関数を使って画面に描画をした後、LineTo関数やEllipse関数を使って その画面上に線や丸を表示させる処理をしているのですが、描画処理を一度にできていないためか ちらつきが発生してしまいます。 調べてみるとビットマップのマルチバッファリングなどが解決策にあるのですが、 私は一次元配列で画素値を格納していてビットマップに情報は保持していないため よく解決策で使われているBITBLTが使えない状態です。 裏画面に描画しておいて、最終的に描画は一度だけにするという考えは分かるんですが、 これをSetDIBitsToDevice関数を用いてちらつきが発生しないようにできるんでしょうか? プログラムとしては画像の上に線と円をひたすら描画していくようなイメージをしています。 アドバイスお願いします! case WM_PAINT: hDC=BeginPaint(hParent,&ps); SetDIBitsToDevice( ps.hdc, 0, 0,// コピー先x,y座標 pimg -> bih.biWidth,// DIBの幅 pimg -> bih.biHeight,// DIBの高さ 0, 0,// DIBの座標 0,// 走査線 pimg -> bih.biHeight,/ 走査線数 pimg -> lpBmpData, (BITMAPINFO *)&( pimg -> bih),// BITMAPINFOにキャスト DIB_RGB_COLORS ); for(int i=0; i<number-1; i++){ if(i==0){ hPen1 = CreatePen(PS_SOLID, 1, RGB(255,0,0)); electObject(hDC,hPen1); MoveToEx(hDC,Xs,Ys,NULL); Ellipse(hDC,Xs-2,Ys-2,Xs+2,Ys+2); }else{ LineTo(hDC,Xe,Ye); Ellipse(hDC,Xs-2,Ys-2,Xs+2,Ys+2); } }
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- sygh
- ベストアンサー率76% (42/55)
1. フロント バッファ(表画面、ウィンドウ自体やクライアント領域など)と互換性のある、バック バッファ(裏画面)用のビットマップを、フロント バッファのデバイス コンテキストを使ってCreateCompatibleBitmap()で作成し、ハンドル(HBITMAP hBackBufferBmp)を取得。 2. フロント バッファのデバイス コンテキストと互換性のある、バックバッファ用のデバイス コンテキストを、フロント バッファのデバイス コンテキストを使ってCreateCompatibleDC()で作成し、ハンドル(HDC hBackBufferDC)を取得。 3. HGDIOBJ hOldBackBufferBmp = SelectObject(hBackBufferDC, hBackBufferBmp); 4. hBackBufferDCに対してSetDIBitsToDevice(), MoveTo()/LineTo() などの描画関数を実行。 5. BitBlt(フロント バッファのデバイス コンテキスト, 0, 0, バック バッファ幅、バック バッファ高さ、hBackBufferDC, 0, 0, SRCCOPY); 6. SelectObject(hBackBufferDC, hOldBackBufferBmp); 7. DeleteDC(hBackBufferDC); 8. DeleteObject(hBackBufferBmp); 上記において、1 と 8 の処理は描画時に毎回行なうのではなく、ウィンドウ作成時やウィンドウ リサイズ時に限定すると効率化できます。 なお、質問するときは環境(実行環境のOSバージョン、Visual C++などの処理系のバージョン)と言語(C限定か、C++もOKか)が明記されていないと、回答する側もサンプル コードを書きにくいです。