gpt4 book ai didi

c - BeginPaint() 不删除背景

转载 作者:太空宇宙 更新时间:2023-11-04 08:23:41 25 4
gpt4 key购买 nike

BeginPaint()文档说:

If the window's class has a background brush, BeginPaint uses that brush to erase the background of the update region before returning.

我是这样设置画笔的:

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() 会删除位图,但位图仍保留在窗口上!

我正在使用 Windows 7。

最佳答案

(将此写为答案,因为解释太长,无法发表评论)。

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

WM_ERASEBKGND 名义上处理删除背景。WM_PAINT 名义上处理在背景上绘制东西。

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

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

如果你实现后一个选项,当你稍后收到一个WM_PAINT消息并调用BeginPaint时,fErase标志PAINTSTRUCT 将设置为 TRUE,表示背景仍被标记为删除。

BeginPaint 函数本身根本不进行任何绘画,它所做的只是为您提供一个可以绘画的 DC。当您调用 EndPaint 时,之前标记为脏的区域被“视为”已绘制(并删除)并且将不再标记为脏。

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

关于c - BeginPaint() 不删除背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32112569/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com