BeginPaint()没有删除背景

时间:2015-08-20 07:55:02

标签: c winapi gdi

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。

1 个答案:

答案 0 :(得分:2)

(写这个作为答案,因为评论的解释太长了。)

客户区的绘制可以在标准Windows模型中的两个位置完成:

WM_ERASEBKGND名义上处理删除背景。 WM_PAINT名义上处理在后台绘制的内容。

如果您将WM_ERASEBKGND传递给DefWindowProc,它将使用类画笔绘制背景。如果您想自己处理WM_ERASEBKGND,则有两种选择:

  • 您可以自己删除背景,并返回1(或任何非零值)
  • 您不能删除,并返回0

如果您实施后一选项,当您稍后收到WM_PAINT条消息并致电BeginPaint时,fErase的{​​{1}}标记将设置为{{1 },表示后台仍标记为擦除。

PAINTSTRUCT函数本身根本不做任何绘画,它所做的就是给你一个可以画出来的TRUE。当您致电BeginPaint时,之前标记为脏的区域是"视为"已被涂漆(和擦除),不再被标记为脏。

背景擦除和前景绘画中的绘画划分(至少在我看来)是16位世界的残余,其中绘画是一项昂贵的操作。如果前景绘画也会擦除背景(例如,您正在绘制一个坚固的颜色块或一个实心图像),那么将背景作为单独的步骤擦除是浪费时间,并且通常会导致可见的闪烁。因此,根据您的应用程序,您可能希望忽略"擦除背景"完全一步 - 从DC返回EndPaint并在0中绘制"背景和前景"只需一步。