可以说,我有以下代码用于调整窗口内标签控件的大小:

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仅声明:


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


这使我认为即使结构大小可能没有更改,但句柄可能也不相同。我可以假设手柄不一样,尺寸就不同吗?如果没有,我该怎么办?

最佳答案

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

您可以做的一件事就是自己跟踪对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;
    }
};

09-04 18:14