gpt4 book ai didi

c++ - 如何知道 DeferWindowPos() 是否导致重新分配?

转载 作者:行者123 更新时间:2023-11-28 01:37:21 25 4
gpt4 key购买 nike

假设我有以下用于调整窗口内选项卡控件大小的代码:

HDWP hDWP = BeginDeferWindowPos(5);
HDWP hDWPUpdated = DeferWindowPos(hDWP,
hWinParent,
hTabControl,
nullptr,
0,
0,
newTabSize.cx,
newTabSize.cy,
SWP_NOZORDER
);

DeferWindowPos 可能会导致底层结构大小增加,例如,如果页面数多于最初指示的页面数。在这种情况下,hDWPUpdated 将是更新位置结构的句柄。有没有办法检测这种结构尺寸更新?我正在考虑比较 hDWPhDWPUpdated:

if(hDWPUpdated != hDWP)
{
// Reallocation took place...
}

但是documentation仅声明:

[...] The handle returned by this function may differ from the handle passed to the function.

这让我想到即使结构大小可能没有改变,句柄也可能不一样。我可以假设如果 Handlebars 不一样,那么尺寸就不同吗?如果没有,我该怎么做?

最佳答案

句柄旨在隐藏所有实现细节。您无法比较句柄后面的结构内容,也无法推断句柄发生变化时的任何内容。

可以做的一件事是自己跟踪对DeferWindowPos 的调用次数。我质疑它是否值得,因为 DeferWindowPos 设计用于无论您是否预测移动的窗口数量。任何效率方面似乎都可能在噪音中丢失。但如果您坚持,我的建议是创建一个类来为您跟踪这一切并提供一点 RAII。

class CDefer
{
int m_nRemaining;
HDWP m_hDWP;
public:
CDefer(int nMaxDefers) : m_nRemaining(nMaxDefers)
{
m_hDWP = BeginDeferWindowPos(nMaxDefers);
}
~CDefer()
{
EndDeferWindowPos(m_hDWP);
}
void DeferWindowPos(HWND hWnd, HWND hWndInsertAfter, int x, int y, int cx, int cy, UINT uFlags)
{
m_hDWP = ::DeferWindowPos(m_hDWP, hWnd, hWndInsertAfter, x, y, cx, cy, uFlags);
ASSERT(m_nRemaining > 0);
--m_nRemaining;
}
};

关于c++ - 如何知道 DeferWindowPos() 是否导致重新分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48695950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com