65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 DeferWindowPos API

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.62/5 (9投票s)

1999年12月15日

viewsIcon

71001

downloadIcon

1282

提供了一个类来封装 BeginDeferWindowPos/EndDeferWindowPos/DeferWindowPos APIs。

有一组鲜为人知的 APIs 允许你一次性移动多个窗口,这可以减少闪烁,与逐个移动每个窗口相比。使用这些 APIs 相当简单,但像许多这样的 APIs 一样,它们需要你执行多个步骤。忘记任何一个步骤,事情就不会按预期工作。

C++ 程序员使用一种称为“资源分配即获取”的技术,以确保不会忘记任何“最终化”步骤。基本上,构造函数设置好一切,析构函数确保最终化过程发生。这项技术的最广泛应用是 std::auto_ptr 类,它确保当 auto_ptr 离开作用域时指针会被删除。

我们可以使用相同的技术来确保 DeferWindowPos 所需的三个步骤得到遵循。我们将创建一个类来封装 DeferWindowPos。该类的构造函数将调用 BeginDeferWindowPos,析构函数将调用 EndDeferWindowPos。成员函数将使用这些 APIs 所需的存储的 HDWP 句柄调用 DeferWindowPos。对这些方法的调用将延迟窗口定位,直到调用析构函数。因此,一次移动两个窗口就像以下操作一样简单:

{
	CDeferPos dp(2);	// We'll move 2 windows
	dp.MoveWindow(hWnd1, 0, 0, 10, 20, TRUE);
	dp.MoveWindow(hWnd2, 10, 0, 10, 20, TRUE);
}	// When dp goes out of scope, both windows are moved at once

请注意,构造函数接受一个参数,指示我们认为将移动多少个窗口。这只是一个建议,可以帮助 Windows 优化内存分配。如果你不知道将移动多少个窗口,你可以猜测,或者将其留给默认值 1。当移动的窗口数量超过最初分配的数量时,Windows 会根据需要增加内存大小。

有关 CDeferPos 的完整代码列表,请查看下载内容。

许可证

本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

© . All rights reserved.