0

GDIでダブルバッファリングを実装するとします。

static HDC hdc;
static HDC backDC;
static HBITMAP backBuffer;
static HGDIOBJ oldBitmap;
static RECT client;

case WM_CREATE:     
     hdc=GetDC(hWnd);
    GetClientRect(hWnd, &client);
    backDC=CreateCompatibleDC(hdc);         
    backBuffer=CreateCompatibleBitmap(hdc,client.right,client.bottom);
    oldBitmap=SelectObject(backDC,backBuffer);
    ReleaseDC(hWnd,hdc);

case WM_PAINT:


Rectangle(backDC, 0, 0,client.right,client.bottom); // displays rectangle the
 size of client to draw on it
      hdc = BeginPaint(hWnd, &ps);  
      BitBlt(hdc,0,0,client.right,client.bottom,backDC,0,0,SRCCOPY);
    // TODO: Add any drawing code here...
       EndPaint(hWnd, &ps);

サイズ変更を処理するにはどうすればよいですか?私がやろうとしたことの1つは

case WM_SIZE:   
client.right=LOWORD(lParam);
client.bottom=HIWORD(lParam);
    SendMessage(hWnd,WM_CREATE,NULL,NULL);

新しいクライアント座標でサイズ変更メッセージを取得すると、WM_CREATEにメッセージが送信され、実際に機能します。基本的に、破壊せずに毎回新しいビットマップを作成するため、大量のリークが発生します。誰かがそれを行うためのより良い方法があるかどうか教えてもらえますか?どうも

4

2 に答える 2

1

バックバッファを維持することは、必ずしも必要ではない最適化です。WM_PAINT ハンドラーで作成し (GetClientRect のサイズまで)、ペイントし、そこから実際のウィンドウ DC にブリットし、クリーンアップすることができます。漏れはありません。すべてのメッセージ ハンドラ間で機能が分散されていません。グローバル変数はありません。素敵できれい。

残しておきたい場合は、クラスを作成します。コンストラクターはサイズを取ります。デストラクタはすべてをクリーンアップします。WM_SIZE で、ローカル スタック変数として新しいものを構築し、古いものと交換して、一時スタックのデストラクタをクリーンアップさせます。

于 2012-10-31T17:15:23.500 に答える
0

バック バッファーを固定サイズ (通常は画面のサイズ) にしてからStretchBlt( StretchDIBitsDIB を使用している場合は) を使用して、ディスプレイ サーフェイスに適切なサイズでレンダリングすることをお勧めします。

そうすれば、バック バッファーの再割り当てについて心配する必要はありません。

于 2012-10-31T17:50:06.770 に答える