Как рассчитать размер CMFCRibbonStatusBarPane

У меня есть приложение на основе ленты MFC, которое включает три строки состояния, как показано ниже;

CString LongString;
LongString.Format("%0*lf", 60, 0.0);
m_pStatusWnd = new CMFCRibbonStatusBarPane(ID_STATUSBAR_PANE1, _T(""), TRUE,NULL, LongString);
m_pStatusCommand = new CMFCRibbonStatusBarPane(ID_INDICATOR_PROMPT, _T("Command"), TRUE, NULL, "000000000000000000000000000000");
m_pStatusSnap = new CMFCRibbonStatusBarPane(ID_INDICATOR_SNAP, _T("Snaps"), TRUE, NULL, "00000000000000000000");
ui.GetStatusBar().AddElement(m_pStatusWnd, "Status");
ui.GetStatusBar().AddExtendedElement(m_pStatusCommand, "Command");
ui.GetStatusBar().AddExtendedElement(m_pStatusSnap, "Snaps");
ui.GetStatusBar().RecalcLayout();

Две расширенные панели состояния в нижней правой части экрана имеют фиксированные размеры, но я бы хотел, чтобы левая панель состояния занимала оставшееся пространство до края кадра. Единственный метод, который я могу найти для установки ширины панели, - это метод SetAlmostLargeText, который на самом деле не так полезен, поскольку значение будет варьироваться в зависимости от размера кадра. По результатам тестирования, если я даю слишком большое значение, панель состояния просто не отображает никакого содержимого. Точно так же, если я изменяю размер кадра и уменьшаю его, содержимое левой панели полностью теряется, когда оно оказывается ниже AlmostLargeTextSize

Есть ли метод расчета размера левого CMFCRibbonStatusBarPane на основе доступного пространства кадра? Ближайшее, что я могу найти, - это CMFCRibbonBaseElement::GetSize, из которого я мог бы вычислить максимально доступный размер текста при использовании в сочетании с показателями среднего размера шрифта, но это кажется довольно грубым.


person SmacL    schedule 14.03.2016    source источник


Ответы (1)


У меня это работает следующим образом:

void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
    CMyMainFrame::OnSize(nType, cx, cy);
    if (!m_MyFrameInitialised)
      return;  // Only proceed if frame creation has been completed
    CString SnapStr = m_pStatusSnap->GetAlmostLargeText();
    CString CommandStr = m_pStatusCommand->GetAlmostLargeText();
    int SnapChars = SnapStr.GetLength(),CommandChars = CommandStr.GetLength(),  StatusChars = 0;
    CDC *pDC = GetWindowDC();
    CSize SnapSize = m_pStatusSnap->GetSize(pDC);
    pDC->LPtoDP(&SnapSize);
    double CharWidth = SnapSize.cx;  
    CharWidth /= SnapChars;
    double TotalChars = cx / CharWidth;
    StatusChars = TotalChars - (SnapChars + CommandChars);
    CString LongStatusString;
    LongStatusString.Format("%0*.0lf", StatusChars, 0.0);
    m_pStatusWnd->SetAlmostLargeText(LongStatusString);
    ui.GetStatusBar().RecalcLayout();
}

Обычно, когда размер окна фрейма увеличивается в любой момент после первоначального создания, вычислите размер ширины фрейма с точки зрения символов панели состояния, вычтите количество символов известных панелей и установите левую панель на основе результат.

Кажется немного громоздким для пользовательского интерфейса, который должен предлагать высокий уровень абстракции, но это было лучшее, что я мог придумать.

person SmacL    schedule 14.03.2016