2

私はこの次のコードを実行しています、

HDC hdc;
HDC hdcMem;
HBITMAP bitmap;
RECT c;
GetClientRect(viewHandle, &c);
// instead of BeginPaint use GetDC or GetWindowDC
hdc = GetDC(viewHandle); 
hdcMem = CreateCompatibleDC(hdc); 
// always create the bitmap for the memdc from the window dc
bitmap = CreateCompatibleBitmap(hdc,c.right-c.left,200);

SelectObject(hdcMem, bitmap);

// only execute the code up to this point one time
// that is, you only need to create the back buffer once
// you can reuse it over and over again after that

// draw on hdcMem
// for example  ...
Rectangle(hdcMem, 126, 0, 624, 400);

// when finished drawing blit the hdcMem to the hdc
BitBlt(hdc, 0, 0, c.right-c.left,200, hdcMem, 0, 0, SRCCOPY);

// note, height is not spelled i before e

// Clean up - only need to do this one time as well
DeleteDC(hdcMem);
DeleteObject(bitmap);
ReleaseDC(viewHandle, hdc);

コードは問題ありません。しかし、私はこの長方形の周りに黒い色を見ています。何故ですか?これがサンプル画像です。

4

4 に答える 4

4

ほとんどの場合、ビットマップはすべて黒に初期化されます。次に、x 座標 126 と 624 の間の白い長方形を描画します。したがって、x=126 の左側と x=624 の右側はすべて黒のままです。

編集: のドキュメントにCreateCompatibleBitmapは、ビットマップがどのように初期化されるかが記載されていないため、Goz が示唆するように、次を使用して、特定の色でビットマップを明示的に初期化する必要がありますFillRect

RECT rc;

rc.left=0;
rc.top=0;
rc.right=c.right-c.left;
rc.bottom=200;

FillRect(hdcMem, &rc, (HBRUSH)GetStockObject(GRAY_BRUSH));

この例では、ビットマップを灰色で塗りつぶしCreateSolidBrushます。別の色が必要な場合は、独自のブラシが必要になる場合があります。(終わったら電話するのを忘れないでくださいDeleteObject。)

補足として、ビットマップが一定の高さ 200 に設定されているのは少し奇妙だと思います。通常は、ビットマップの高さをウィンドウの高さと等しくすることです (幅)。

于 2009-09-22T11:12:13.783 に答える
1

メモリ ビットマップ領域を特定の色に初期化していない可能性がありますか? 背景を別の色に FillRect してみてから、その上に白い四角形を描画して、何が起こるかを確認してください。

于 2009-09-22T11:12:34.953 に答える
0

私が使用した:

    // Fill the background
    hdcMem->FillSolidRect(c, hdcMem->GetBkColor());

ちょうどメモとして。

于 2009-10-20T10:11:42.463 に答える
0

MSDN http://msdn.microsoft.com/en-us/library/dd162898.aspx によると:

四角形は、現在のペンを使用して輪郭が描かれ、現在のブラシを使用して塗りつぶされます。

代わりに呼び出すことを検討FillRectするか、呼び出す前に適切なペンを選択してくださいRectangle

于 2009-09-22T11:09:16.863 に答える