Win32子控件绘图问题(InvalidateRect)(灰色背景)

时间:2017-12-07 06:32:38

标签: c++ winapi checkbox parent-child repaint

我的问题是如何在更改其文本后正确重新绘制子控件(在本例中为复选框)。

重要提示

  • 复选框是子类,并在WM_PAINT&中绘制。 WM_ERASEBKGND返回1.
  • Window 不使用 WS_EX_COMPOSITED,WS_EX_LAYERED或WS_CLIPCHILDREN。
  • 复选框不使用 WS_EX_TRANSPARENT。

当我在复选框上调用InvalidateRect()时,它有一个灰色背景(图像2 )。

另一方面,当我在父窗口上调用InvalidateRect()时,它的行为就像我想要的那样(图像3

我认为第二种情况有效,因为 WM_PAINT 也会被发送到父窗口,而不仅仅是 WM_ERASEBKGND

在第一种情况下,我不明白为什么 WM_PAINT 没有被发送到其父窗口为什么 WM_ERASEBKGND 确实会被发送到父窗口。

结论:要重新绘制子控件,您是否必须在父级而不是子级上使用InvalideRect()?

编辑:在调用:: SendMessage(hWnd,WM_SETTEXT,NULL,(:: LPARAM)text.c_str())之后,父窗口收到WM_ERASEBKGND消息;在复选框上。这不是因为复选框上的InvalidateRect()调用。

我希望这是因为你想在父程序中绘制复选框。但为什么它也不会为父窗口生成WM_PAINT?

Initial Checkbox

After calling InvalidateRect(hWnd, 0, true) on the checkbox

After calling InvalidateRect(::GetParent(hWnd), &checkboxRect, true) on the parent window

0 个答案:

没有答案