BeginPaint()文档说:
如果窗口的类有背景画笔,BeginPaint会使用它 在返回之前刷过以擦除更新区域的背景。
我按照这样设置画笔:
wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
我在我的窗口上绘制了一个位图,然后我使用以下代码要求重绘:
RedrawWindow(hWnd, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW);
我在WM_PAINT
中有这段代码:
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps);
}
break;
所以我希望BeginPaint()
将删除位图,但位图仍保留在Window上!
我使用的是Windows 7。
答案 0 :(得分:2)
(写这个作为答案,因为评论的解释太长了。)
客户区的绘制可以在标准Windows模型中的两个位置完成:
WM_ERASEBKGND
名义上处理删除背景。
WM_PAINT
名义上处理在后台绘制的内容。
如果您将WM_ERASEBKGND
传递给DefWindowProc
,它将使用类画笔绘制背景。如果您想自己处理WM_ERASEBKGND
,则有两种选择:
如果您实施后一选项,当您稍后收到WM_PAINT
条消息并致电BeginPaint
时,fErase
的{{1}}标记将设置为{{1 },表示后台仍标记为擦除。
PAINTSTRUCT
函数本身根本不做任何绘画,它所做的就是给你一个可以画出来的TRUE
。当您致电BeginPaint
时,之前标记为脏的区域是"视为"已被涂漆(和擦除),不再被标记为脏。
背景擦除和前景绘画中的绘画划分(至少在我看来)是16位世界的残余,其中绘画是一项昂贵的操作。如果前景绘画也会擦除背景(例如,您正在绘制一个坚固的颜色块或一个实心图像),那么将背景作为单独的步骤擦除是浪费时间,并且通常会导致可见的闪烁。因此,根据您的应用程序,您可能希望忽略"擦除背景"完全一步 - 从DC
返回EndPaint
并在0
中绘制"背景和前景"只需一步。