Проблемы с добавлением CComboBox на панель CMFCStatusBar - PullRequest
2 голосов
/ 14 апреля 2020

У меня есть этот простой код для создания CComboBox и отображения его на панели в CMFCStatusBar:

CRect rcPane;
m_StatusBar.GetItemRect(panePageBreaks, &rcPane);
CFont *pFont = m_StatusBar.GetFont();

m_myCombo.Create(WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST, rcPane, &m_StatusBar, 2500);
m_myCombo.SetFont(pFont);
m_myCombo.AddString(_T("Page Breaks: None"));
m_myCombo.AddString(_T("Page Breaks: 1 Week"));
m_myCombo.AddString(_T("Page Breaks: 2 Weeks"));
m_myCombo.AddString(_T("Page Breaks: 3 Weeks"));
m_myCombo.AddString(_T("Page Breaks: 4 Weeks"));

Можно ли сделать строку состояния достаточно большой, чтобы охватить эту комбинацию? На данный момент высота пикселя или двух слишком мала:

StatusBar


Обновление

Если я использую:

rcPane.InflateRect(1, 2, 0, 2);

Кажется, лучше. Но я не хочу обманывать это. У других пользователей P C может быть другим. Я хочу, чтобы эта комбинация была точной для указанной c панели.


Обновление

Теперь я немного раздражен. Я нашел похожий вопрос здесь , который подразумевает выполнение двух вещей:

  1. Изменение высоты шрифта.
  2. Использование SetItemHeight.

Итак, я применил оба из них и обнаружил, что мне потребуется высота шрифта -6, чтобы элемент управления имел правильную высоту:

CRect rcPane;
m_StatusBar.GetItemRect(panePageBreaks, &rcPane);
CFont *pFont = m_StatusBar.GetFont();
LOGFONT sLF;
pFont->GetLogFont(&sLF);
sLF.lfHeight = -6;
pFont->CreateFontIndirect(&sLF);

m_myCombo.Create(WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST, rcPane, &m_StatusBar, 2500);
m_myCombo.SetItemHeight(-1, rcPane.Height());
m_myCombo.SetFont(pFont);
m_myCombo.AddString(_T("Page Breaks: None"));
m_myCombo.AddString(_T("Page Breaks: 1 Week"));
m_myCombo.AddString(_T("Page Breaks: 2 Weeks"));
m_myCombo.AddString(_T("Page Breaks: 3 Weeks"));
m_myCombo.AddString(_T("Page Breaks: 4 Weeks"));

Status Bar with Combo

Видите ли, вы можете установить высоту элемента управления для редактирования, но если ваша высота шрифта будет больше, это приведет к увеличению элемента управления для редактирования. Так что я не могу go более -6. И текст строки состояния -12. Так что это не вариант.

Все, что я пытался сделать, - предоставить пользователю простой способ изменить эту настройку через строку состояния, а также через навигацию по меню. Но похоже, что я не могу этого сделать.

Во всяком случае, высота CMFCStatusBar должна быть чуть выше, чем CComboBox высота элемента управления редактирования по умолчанию.

1 Ответ

1 голос
/ 16 апреля 2020

Этот код показывает, как увеличить высоту строки состояния. Таким образом, вы можете использовать стандартные элементы управления на своем статубаре без каких-либо изменений.

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
        return -1;

    if (!m_wndStatusBar.Create(this))
    {
        TRACE0("Failed to create status bar\n");
        return -1;      // fail to create
    }
    m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));

    m_wndStatusBar.GetStatusBarCtrl().SetMinHeight(70); // or, whatever you need

    return 0;
}
...