- ベストアンサー
ダブルバッファの作り方
画面に描画する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;
- みんなの回答 (7)
- 専門家の回答
お礼
回答ありがとうございます。 お教えいただいたソースを、No2さんの回答を参考に加工して以下の変更を加えたところ、スムーズな描画になりました。 ありがとうございました。 case WM_CREATE: に、 GetClientRect(hWnd,&rt); WindowsHeight = (int)rt.bottom; WindowsWidth = (int)rt.right; hDC = GetDC(hWnd); hMemBMP = CreateCompatibleBitmap( hDC, WindowsWidth, WindowsHeight ); hMemDC = CreateCompatibleDC( hDC ); SelectObject(hMemDC, hMemBMP); ReleaseDC(hWnd, hDC); を追加し、 case WM_PAINT: GetClientRect(hWnd,&rt); h= (int)rt.bottom; w= (int)rt.right; if(h!=WindowsHeight || w!=WindowsWidth) { DeleteObject(hMemBMP); DeleteObject(hMemDC); 再度、オフスクリーンバッファを作成 } で、ウインドサイズ変更の場合の処理をして、 SelectObject( hMemDC, GetStockObject(NULL_PEN) ); SelectObject( hMemDC, CreateSolidBrush(RGB(0xFF,0xFF,0xFF)) ); Rectangle( hMemDC, 0, 0, WindowsWidth, WindowsHeight ); DeleteObject( SelectObject(hMemDC,GetStockObject(WHITE_BRUSH)) ); ReleaseDC(hWnd, hDC); で、白で初期化して paint (hMemDC); で描画して、 hDC=BeginPaint(hWnd,&ps); BitBlt(hDC, 0,0,w,h, hMemDC,0,0, SRCCOPY); EndPaint(hWnd,&ps); で画面に描く