使用 DeferWindowPos API






4.62/5 (9投票s)
1999年12月15日

71001

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
的完整代码列表,请查看下载内容。
许可证
本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。
作者可能使用的许可证列表可以在此处找到。