我的问题是如何在更改其文本后正确重新绘制子控件(在本例中为复选框)。
重要提示:
当我在复选框上调用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?
After calling InvalidateRect(hWnd, 0, true) on the checkbox
After calling InvalidateRect(::GetParent(hWnd), &checkboxRect, true) on the parent window