我正在运行以下代码,
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);
代码很好。但我看到这个矩形周围有黑色。这是为什么? Here is an example image.
答案 0 :(得分:4)
位图很可能被初始化为全黑。然后,您将在x坐标126和624之间绘制一个白色矩形。因此,x = 126左侧和x = 624右侧的所有内容都保持黑色。
编辑:documentation for CreateCompatibleBitmap
没有说明位图的初始化方式,因此您应该使用FillRect
显式初始化具有特定颜色的位图,如使用CreateSolidBrush
:
RECT rc;
rc.left=0;
rc.top=0;
rc.right=c.right-c.left;
rc.bottom=200;
FillRect(hdcMem, &rc, (HBRUSH)GetStockObject(GRAY_BRUSH));
此示例以灰色填充位图 - 如果需要不同的颜色,则可能需要DeleteObject
自己的画笔。 (完成后别忘了打电话给{{3}}。)
作为旁注,我发现你的位图被设置为200的常量高度有点奇怪 - 正常的做法是使位图的高度等于窗口的高度(就像是完成宽度)。
答案 1 :(得分:1)
可能是因为你没有将内存位图区域初始化为给定的颜色?尝试FillRect将背景变为不同的颜色,然后在其上绘制白色矩形,看看会发生什么。
答案 2 :(得分:0)
每个MSDN http://msdn.microsoft.com/en-us/library/dd162898.aspx:
使用当前笔勾勒出矩形,并使用当前笔刷填充矩形。
请考虑拨打FillRect
,或在拨打Rectangle
之前选择合适的笔。
答案 3 :(得分:0)
我用过:
// Fill the background
hdcMem->FillSolidRect(c, hdcMem->GetBkColor());
就像一张纸条。