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

时间:2018-02-08 22:39:24

标签: c++ winapi mfc

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

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...
}

this issue仅表明:

  

[...]此函数返回的句柄可能与传递的句柄不同   这个功能。

这让我觉得即使结构大小可能没有改变,手柄可能也不一样。如果手柄不相同,我可以假设尺寸不同吗?如果没有,我怎么能这样做?

1 个答案:

答案 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;
    }
};