绘制非客户区的问题 - Win32
Problem with painting non client area - Win32
我正在尝试创建自定义非客户区。
所以我在 WndProc 方法中处理 WM_NCPAINT
消息,并尝试在非客户区创建一个红色矩形,但我发现了两个问题。
- 我在非客户区画的矩形也覆盖了客户区
所以为了遇到它,我在 WM_NCPAINT
消息的末尾添加了 RedrawWindow
函数,但我不确定这是个好主意。我还能做些什么来纠正这个问题?
- 我多次调整 window 大小时得到一些奇怪的结果。我就是不知道怎么解释,不过我试试
这是我目前所取得的成就
但是如果我连续多次调整它的大小(比如 10 - 15),它就会得到这个
全图是window(第一个)的截图。
我不知道这是怎么回事。白色部分画错了,右边和底部看起来是透明的,但都是一张window的截图。 (SS 通过截图工具)
鼠标点击全部通过透明部分
Window 可以很好地调整大小,但其中没有正确绘制任何内容,大小不正确。
绘图的大小设置为某个最大大小(不知道是什么,它是随机的)。
代码与visual studio的Windows Desktop Application C++
模板默认代码相同。
刚刚为 WM_NCPAINT
消息添加了自定义代码。
case WM_NCPAINT:
{
HDC hdc = GetWindowDC(hWnd);
if (hdc) {
RECT frame = { 0 };
GetWindowRect(hWnd, &frame);
frame.right = frame.right - frame.left;
frame.bottom = frame.bottom - frame.top;
frame.left = 0;
frame.top = 0;
FillRect(hdc, &frame, CreateSolidBrush(RGB(255, 0, 0)));
ReleaseDC(hWnd, hdc);
RedrawWindow(hWnd, &frame, (HRGN)wParam, RDW_UPDATENOW);
}
return 0;
}
IInspectable 的评论对我有帮助。
来自 CreateSolidBrush
:“当您不再需要 HBRUSH
对象时,调用 DeleteObject 函数将其删除。”您没有这样做那,并在每个 WM_NCPAINT
回调中泄漏一个 HBRUSH
。 GDI 资源是您的系统必须提供的最有限的资源之一。
我正在尝试创建自定义非客户区。
所以我在 WndProc 方法中处理 WM_NCPAINT
消息,并尝试在非客户区创建一个红色矩形,但我发现了两个问题。
- 我在非客户区画的矩形也覆盖了客户区
所以为了遇到它,我在 WM_NCPAINT
消息的末尾添加了 RedrawWindow
函数,但我不确定这是个好主意。我还能做些什么来纠正这个问题?
- 我多次调整 window 大小时得到一些奇怪的结果。我就是不知道怎么解释,不过我试试
这是我目前所取得的成就
但是如果我连续多次调整它的大小(比如 10 - 15),它就会得到这个
全图是window(第一个)的截图。 我不知道这是怎么回事。白色部分画错了,右边和底部看起来是透明的,但都是一张window的截图。 (SS 通过截图工具)
鼠标点击全部通过透明部分
Window 可以很好地调整大小,但其中没有正确绘制任何内容,大小不正确。 绘图的大小设置为某个最大大小(不知道是什么,它是随机的)。
代码与visual studio的Windows Desktop Application C++
模板默认代码相同。
刚刚为 WM_NCPAINT
消息添加了自定义代码。
case WM_NCPAINT:
{
HDC hdc = GetWindowDC(hWnd);
if (hdc) {
RECT frame = { 0 };
GetWindowRect(hWnd, &frame);
frame.right = frame.right - frame.left;
frame.bottom = frame.bottom - frame.top;
frame.left = 0;
frame.top = 0;
FillRect(hdc, &frame, CreateSolidBrush(RGB(255, 0, 0)));
ReleaseDC(hWnd, hdc);
RedrawWindow(hWnd, &frame, (HRGN)wParam, RDW_UPDATENOW);
}
return 0;
}
IInspectable 的评论对我有帮助。
来自 CreateSolidBrush
:“当您不再需要 HBRUSH
对象时,调用 DeleteObject 函数将其删除。”您没有这样做那,并在每个 WM_NCPAINT
回调中泄漏一个 HBRUSH
。 GDI 资源是您的系统必须提供的最有限的资源之一。