1

我有一个有 3 个孩子的主窗口:(hwndTocBox左面板)hwndSplitterhwndCanvas(右面板)。 hwndTocBox有一个 child hwndTreeView,它是一个 TreeView 控件。当我向右拖动hwndSplitter时(即想要制作hwndTocBox并因此hwndTreeView变大),and 的内容(和背景?)hwndCanvashwndSplitter保留一段时间。(当我将拆分器向左拖动时,完全没有问题。)

hwndSplitter被拖动时,它用于DeferWindowPos()调整大小和移动hwndTocBoxhwndSplitterhwndCanvas。当hwndTocBox调整大小时,WM_SIZE如果是它的 windows 过程,它会调整大小hwndTreeView(仍然使用DeferWindowPos(),因为它不仅调整大小,还调整hwndTreeView其他大小)。

我已经尝试在几个地方使用CLIPCHILDRENand WS_CLIPSIBLINGS,但它并没有解决问题。

为什么内容会保留一段时间并在稍后删除?

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

在此处输入图像描述

4

1 回答 1

2

您需要重新绘制已调整大小的窗口部分,否则您会得到这些奇怪的工件。它们看起来像涂片是有原因的,因为它们几乎就是这样。部分内容被绘制并正常显示在屏幕上。然后你调整了窗口的大小。已经画的部分没有重画,因为你没有使其无效,但是新暴露的部分必须重画,因为之前没有任何东西。

修复很简单:在调整大小代码的底部添加对InvalidateRect()函数的调用,以确保您正在调整大小的窗口部分在下次窗口处理WM_PAINT消息时重新绘制。

如果您想确保WM_PAINT立即处理消息(导致立即重绘窗口的受影响区域),请跟进对UpdateWindow()函数的调用。但这确实没有必要。将所有重绘推迟到一切都完成后,而不是渐进式地进行,效率要高得多。相对而言,重绘窗口是一项昂贵的操作。

于 2012-07-23T23:35:15.643 回答