可以说,我有以下代码用于调整窗口内标签控件的大小:
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...
}
但是documentation仅声明:
[...]此函数返回的句柄可能与传递的句柄不同
功能。
这使我认为即使结构大小可能没有更改,但句柄可能也不相同。我可以假设手柄不一样,尺寸就不同吗?如果没有,我该怎么办?
最佳答案
句柄旨在隐藏所有实现细节。您无法比较该句柄后面的结构的内容,也无法在该句柄更改时推断任何内容。
您可以做的一件事就是自己跟踪对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;
}
};