Как найти координаты CStatusBar в окне MDI? - PullRequest
0 голосов
/ 14 апреля 2019

Я создал нижнюю строку состояния в своем окне MDI в моем файле MAINFRAME.cpp в обработчике OnCreate следующим образом:

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 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, но обе возвращают неправильные значения.

Что я делаю не так?

1 Ответ

1 голос
/ 14 апреля 2019

CMainFrame::OnCreate вызывается слишком рано, окна еще не установлены. Я создал приложение MDI в Visual Studio 2015, когда этот код вызывается из 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) и найти прямоугольник строки состояния в обработчике сообщений.

...