假设我有以下代码用于调整窗口内的选项卡控件的大小:
HDWP hDWP = BeginDeferWindowPos(5);
HDWP hDWPUpdated = DeferWindowPos(hDWP,
hWinParent,
hTabControl,
nullptr,
0,
0,
newTabSize.cx,
newTabSize.cy,
SWP_NOZORDER
);
DeferWindowPos
可能导致底层结构大小增加,例如,如果页面数多于最初指示的页数。在这种情况下,hDWPUpdated
将成为更新的位置结构的句柄。有没有办法检测这种结构大小更新?我在考虑比较hDWP
和hDWPUpdated
:
if(hDWPUpdated != hDWP)
{
// Reallocation took place...
}
但this issue仅表明:
[...]此函数返回的句柄可能与传递的句柄不同 这个功能。
这让我觉得即使结构大小可能没有改变,手柄可能也不一样。如果手柄不相同,我可以假设尺寸不同吗?如果没有,我怎么能这样做?
答案 0 :(得分:2)
句柄旨在隐藏所有实现细节。您无法比较句柄后面的结构内容,也无法在句柄更改时推断出任何内容。
您可以做的一件事就是跟踪自己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;
}
};