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

时间:2019-04-14 08:52:35

标签: c++ mfc mdi

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

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);

这是返回RECT对象的仅有的两个函数,但是都返回不正确的值。

我在做什么错了?

1 个答案:

答案 0 :(得分:1)

CMainFrame::OnCreate被调用为时过早,窗口尚未定位。从OnCreate调用此代码时,我在Visual Studio 2015中创建了MDI应用程序:

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]} 另一种选择是将用户定义的消息发布到自身(来自CMainFrame::OnCreate),并在消息处理程序中找到状态栏矩形。