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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在MDI窗口中找到CStatusBar的坐标?相关的知识,希望对你有一定的参考价值。

我在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
");
        return -1;       // fail to create
     }
}

CStatusBar Create函数如下所示:

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对象的唯一2个函数,但都返回不正确的值。

我究竟做错了什么?

答案

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

以上是关于如何在MDI窗口中找到CStatusBar的坐标?的主要内容,如果未能解决你的问题,请参考以下文章

如何使 MDI 子窗口保持在其兄弟窗口之上?

如何避免在添加新的MDI子窗口时出现屏幕跳动

c# 如何保持一个MDI子窗口永远最大化?

如何检查窗口是不是为 MDI 窗口?

vb的 mdi窗口的问题

状态栏