如何在 MDI window 中找到 CStatusBar 的坐标?

How to find the coordinates of a CStatusBar in an MDI window?

我在 OnCreate 处理程序中的 MAINFRAME.cpp 文件中的 MDI window 中创建了一个底部状态栏,如下所示:

static UINT indicators[] =
{
    ID_SEPARATOR
};

int MainFrm::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
     if (!m_wndStatusBar.Create(this) ||
            !m_wndStatusBar.SetIndicators(indicators,
              sizeof(indicators)/sizeof(UINT)))
     {
        TRACE("Failed to create status bar\n");
        return -1;       // fail to create
     }
}

CStatusBar 创建函数如下所示:

virtual BOOL Create(CWnd* pParentWnd,
        DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_BOTTOM,
        UINT nID = AFX_IDW_STATUS_BAR)

我正在尝试找到此状态栏的坐标,即它的 x 位置,但这样做有些困难。根据 Spy++ 在分辨率为 1920x1080 的显示器上,状态栏的 x.top 位置 = 1055.

我试过了,但得到了 x.top = 66:

RECT rect;
m_wndStatusBar.GetWindowRect(&rect);
int x_top_pos = rect.top;

我也试过了,但是得到了 x_top_pos = 2:

m_wndStatusBar.GetItemRect(0, &rect);

只有这两个 return 是 RECT 对象的函数,但都 return 不正确的值。

我做错了什么?

CMainFrame::OnCreate调用太早,windows还没有定位。我在 Visual Studio 2015 年创建了 MDI 应用程序,当时从 OnCreate:

调用此代码
RECT rect;
m_wndStatusBar.GetWindowRect(&rect);

它给出了矩形{LT(440, 74) RB(440, 74) [0 x 0]}。所以,你需要稍后调用它。例如,我将代码移动到 CreateDockingWindows:

BOOL CMainFrame::CreateDockingWindows()
{
    // ....

    RECT rect;
    m_wndStatusBar.GetWindowRect(&rect);
    return TRUE;
}

rect{LT(440, 873) RB(1864, 892) [1424 x 19]} 另一种选择是 post 用户定义的消息给自己(来自 CMainFrame::OnCreate)并在消息处理程序中找到状态栏矩形。