拖动分割条以调整两个面板的大小时,内容(或背景)仍然存在

时间:2012-07-23 18:59:24

标签: c++ winapi panel splitter

我有一个包含3个孩子的主窗口:hwndTocBox(左侧面板),hwndSplitterhwndCanvas(右侧面板)。 hwndTocBox有一个子hwndTreeView,它是一个TreeView控件。当我将hwndSplitter向右拖动(即想要hwndTocBox并因此hwndTreeView更大)时,hwndCanvashwndSplitter的内容(和背景?)会保持一段时间。 (当我将分离器向左拖动时,根本没有问题。)

hwndSplitter被拖出时,它会使用DeferWindowPos()来调整大小并移动hwndTocBoxhwndSplitterhwndCanvas。调整hwndTocBox时,在WM_SIZE的Windows过程中,调整hwndTreeView的大小(仍然使用DeferWindowPos(),因为它不仅调整了hwndTreeView,还调整了其他)。

我曾尝试在多个地方使用CLIPCHILDRENWS_CLIPSIBLINGS,但它无法解决问题。

为什么内容会在那里停留一段时间并在以后删除?

请告诉我如何解决这个问题。

enter image description here

1 个答案:

答案 0 :(得分:2)

您需要重新绘制已调整大小的窗口部分,否则您将获得这些奇怪的工件。他们看起来像是涂抹的原因,因为这几乎就是他们的样子。内容的某一部分被绘制并且通常出现在屏幕上。然后你调整了窗口的大小。已经涂漆的部分没有重新粉刷,因为你没有使它失效,但新暴露的部分必须重新粉刷,因为之前没有任何东西。

修复很简单:在调整大小代码底部的InvalidateRect() function添加一个调用,以确保在下次窗口处理{{1}时,您正在调整大小的窗口部分会重新绘制消息。

如果您想确保立即处理WM_PAINT消息(导致立即重新绘制窗口受影响的区域),请致电UpdateWindow() function。但这确实不应该是必要的。将所有重绘推迟到以后完成所有内容时,而不是以递增方式执行它会更有效。相对而言,重新绘制窗口是一项昂贵的操作。