我有一个包含3个孩子的主窗口:hwndTocBox
(左侧面板),hwndSplitter
和hwndCanvas
(右侧面板)。
hwndTocBox
有一个子hwndTreeView
,它是一个TreeView控件。当我将hwndSplitter
向右拖动(即想要hwndTocBox
并因此hwndTreeView
更大)时,hwndCanvas
和hwndSplitter
的内容(和背景?)会保持一段时间。 (当我将分离器向左拖动时,根本没有问题。)
当hwndSplitter
被拖出时,它会使用DeferWindowPos()
来调整大小并移动hwndTocBox
,hwndSplitter
和hwndCanvas
。调整hwndTocBox
时,在WM_SIZE
的Windows过程中,调整hwndTreeView
的大小(仍然使用DeferWindowPos()
,因为它不仅调整了hwndTreeView
,还调整了其他)。
我曾尝试在多个地方使用CLIPCHILDREN
和WS_CLIPSIBLINGS
,但它无法解决问题。
为什么内容会在那里停留一段时间并在以后删除?
请告诉我如何解决这个问题。
答案 0 :(得分:2)
您需要重新绘制已调整大小的窗口部分,否则您将获得这些奇怪的工件。他们看起来像是涂抹的原因,因为这几乎就是他们的样子。内容的某一部分被绘制并且通常出现在屏幕上。然后你调整了窗口的大小。已经涂漆的部分没有重新粉刷,因为你没有使它失效,但新暴露的部分必须重新粉刷,因为之前没有任何东西。
修复很简单:在调整大小代码底部的InvalidateRect()
function添加一个调用,以确保在下次窗口处理{{1}时,您正在调整大小的窗口部分会重新绘制消息。
如果您想确保立即处理WM_PAINT
消息(导致立即重新绘制窗口受影响的区域),请致电UpdateWindow()
function。但这确实不应该是必要的。将所有重绘推迟到以后完成所有内容时,而不是以递增方式执行它会更有效。相对而言,重新绘制窗口是一项昂贵的操作。