如何计算CMFCRibbonStatusBarPane

时间:2016-03-14 09:00:41

标签: c++ mfc mfc-feature-pack

我有基于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我可以找出与平均字体大小指标一起使用时的最大可用文本大小,但它看起来相当粗糙。

1 个答案:

答案 0 :(得分:0)

我的工作原理如下;

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

基本上,当框架窗口在最初创建后的任何时间变大时,根据状态窗格字符计算框架宽度的大小,减去已知窗格的字符数,并设置左窗格根据结果​​。

对于应该提供高级抽象的UI来说似乎有点麻烦,但这是我能想到的最好的。