2012-01-16 31 views
3

Win32でC++でプロジェクトを実行しているときに描画されるイメージをバッファリングしようとしましたが、その上に正しいビットマップを含む黒い画面が表示されます。これはまた、私のWM_MOUSEMOVE条件を引き起こしています。これは、ビットマップを描画しないようにカーソルとともにビットマップをドラッグします。ペイントのコードは以下の通りです:paint()はWM_PAINTの下のwndprocで呼び出されます。scrollはこれまで使われていなかったスクロールバーの位置です。Win32ダブルバッファリング描画の黒い背景

int paint(HWND hWnd, HINSTANCE hInst, RECT clientRect, std::vector<Measure> *measures, int scroll) 
{ 
int x = 90; 
hdc = BeginPaint(hWnd, &ps); 
hdcmem = CreateCompatibleDC(hdc); 
HBITMAP hbmScreen = CreateCompatibleBitmap(hdc, clientRect.right, clientRect.bottom); 
SelectObject(hdcmem,hbmScreen); 
/*these functions just create the bitmaps into hdcmem*/ 
drawStaff(hWnd, hInst, clientRect, x, 0); 
drawKey(hWnd, hInst, clientRect, x, (*measures)[0], 0); 
drawTime(hWnd, hInst, clientRect, x, (*measures)[0], 0); 
drawNotes(hWnd, hInst, clientRect, measures, x); 
    BitBlt(hdc, 0, 0, clientRect.right, clientRect.bottom, hdcmem, 0, 0, SRCCOPY); 
ReleaseDC(hWnd, hdcmem); 
return 0; 
} 
+3

ペイントしている時にバックバッファをリメイクするべきではなく、 'WM_CREATE'(と' WM_SIZE')で一度作って 'SetWindowLongPtr(GWLP_USERDATA)'を使って 'HWND'に貼り付けてください。 – Necrolis

+3

リソースリークがあります。この関数から戻る前に、hdcmemでDeleteObjectを呼び出すことを忘れています。 – selbie

+3

また、EndPaintを呼び出すこともできません。 – selbie

答えて

3

他のグラフィックスを描画する前に、背景色が最初であればビットマップを塗りつぶす必要があります。メモリが正しく機能している場合、ビットマップは作成時にデフォルトで黒で塗りつぶされます。

+0

オブジェクトをhdcmemに選択した後、次のコードを追加しようとしました: \t SetBkColor(hdcmem、COLORREF RGB(0、0、0));信じている は白ですが、私は0の代わりに255で試してみました。これは、ビットマップの背景を変更することによって何を意味するのでしょうか、それともビットマップのコントロールの背景を変更するのとは異なりますか? –

+7

'FillRect'を使って、実際にあなたが望む色を塗りつぶす必要があります。 'SetBkColor'はテキストの背景色を設定しますが、テキストは描画されないので、呼び出しは効果がありません。 –

+2

@AaronK - RGB(0,0,0)は白ではなく黒で塗りつぶされています。 – selbie

関連する問題