关于对 DeferWindowPos 的理解

关于对 DeferWindowPos 的理解

作者:BlogUpdater |  时间:2022-11-25 |  浏览:140 |  评论已关闭 条评论

DeferWindowPos 这个 API 的目标是:同一时间,移动多个子窗口。这在一定程度上减少了窗户移动时进行的重绘工作量。

修改我们之前的例子代码,如下图所示:

请注意,我正在使用控件 ID 来保存所需的颜色,我们在选择背景颜色时在获取它。

我特意调用了 Sleep,这样就可以看到实际的绘制效果。

我们将两个子窗口并排放置在工作区中。对于我们的第一次测试,我们将使用 SetWindowPos 函数来移动窗口。

编译并运行此程序,一旦启动,单击最大化框。仔细观察绿色矩形的哪些部分被重新绘制。

现在让我们修改移动窗口的代码以使用 DeferWindowPos 函数。DeferWindowPos 的使用模式如下:

要点如下
> 传递给 BeginDeferWindowPos 函数的值是要移动的窗口数量。如果弄错了这个值也没关系,但正确处理会减少内部重新分配的数量。
> 来自 DeferWindowPos 的返回值将存储回 hdwp 中,因为返回值不一定与最初传入的值相同。如果延迟记录需要执行重新分配,则 DeferWindowPos 函数返回新延迟信息的句柄;旧的延迟信息不再有效。更重要的是,如果延迟失败,旧的延迟信息将被销毁。这与 realloc 函数不同,如果重新分配失败,则原始对象保持不变。模式 p = realloc(p, …) 是内存泄漏,但模式 hdwp = DeferWindowPos(hdwp, …) 不是。

上述第二个要点很重要,有很多人经常容易忽略它。

好的,现在你们可能都害怕这个函数,让我们修改窗口移动代码以利用延迟窗口定位。真的一点也不难。(不过,将这些更改保存到新文件中。我们希望并排运行旧版本和新版本。

编译并运行此程序,一旦启动,再次最大化窗口并观察哪些区域重新绘制。请注意,与旧版本相比,新版本中的重绘量会减少。

总结
完美主义者有福了。
如果你一直纠结于为什么你的窗口控件会闪烁,则不妨试试 DeferWindowPos 。
它的存在,一定是有原因的。

最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《What’s the point of DeferWindowPos?》

最近我写了个东西
正如你们所知道的,拓扑梅尔智慧办公平台(Topomel Box)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。

评论已关闭。