c - 在 Windows 上绘制客户区时“清除更新区域”是什么意思?
问题描述
在这里画窗提到:
绘制完客户区后,清除更新区域,这会告诉操作系统它不需要发送另一个 WM_PAINT 消息,直到发生变化。
可以编写以下代码:
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
RECT rect;
GetClientRect(hWnd, &rect);
HBRUSH brush = CreateSolidBrush(RGB(127, 127, 127));
FillRect(hdc, &rect, brush);
const wchar_t * lstr = L"here is information";
TextOut(hdc,
5, 5,
lstr, _tcslen(lstr));
DrawText(hdc, TEXT("Singleline in center~"), -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER);
MoveToEx(hdc, 50, 100, NULL);
LineTo(hdc, 44, 10);
LineTo(hdc, 78, 40);
Rectangle(hdc, 16, 36, 72, 70);
Rectangle(hdc, 34, 50, 54, 70);
DeleteObject(brush);
EndPaint(hWnd, &ps);
}
这里的清除是什么意思?我们不希望我们绘制的内容被清除。
解决方案
WM_PAINT
消息是按需生成的(请参阅Paint messages will come in as fast as you let them)。对于每个窗口,系统维护一个更新区域。客户可以将窗口客户区的部分或全部标记为“无效”,调用InvalidateRect
或InvalidateRgn
. 任何一个都添加到更新区域,但不会立即触发WM_PAINT
消息。
当系统确定是时候发送WM_PAINT
消息时,客户端有责任在完成绘制后清空更新区域,以便WM_PAINT
在更新区域再次非空之前不会生成其他消息。
调用为您执行此操作,因此只要您使用标准处理BeginPaint
,您就不必担心这一点。WM_PAINT
如果您确实有更具体的要求(例如,使用 Direct2D 渲染目标时),您将不得不通过调用ValidateRect
或手动清除更新区域ValidateRgn
。
推荐阅读
- spring-boot - @EnableAutoConfiguration 在测试上下文中
- javascript - 无法将文件转换为二进制格式以使用 node.js 发送到 wit.ai api
- javascript - 我需要帮助对字符串数组中的特定数字进行排序以下降
- javascript - 为什么我不能复制函数的调用方法
- php - Symfony 4.3.2 和 FOS 用户捆绑控制器的注入依赖性问题
- c++ - 从成员双端队列访问父母数据的方法
- c# - ProActive bot 向用户发送消息的频率如何?
- laravel - 配置 Apache 反向代理以在生产环境中托管 Laravel Echo 服务器
- android - 无法在所有设备中安装“应用程序名称”错误。不适用于特定用户
- ios - Segue 调用了两次 - IOS