如何计算 CMFCRibbonStatusBarPane 的大小

How to calculate the size of a 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();

屏幕右下角的两个扩展状态窗格具有固定大小,但我希望左侧状态窗格将剩余的 space 带到框架的边缘。我能找到的唯一设置窗格宽度的方法是 SetAlmostLargeText 方法,该方法并不是很有用,因为值会根据框架的大小而变化。从测试来看,如果我给的值太大,状态面板根本不显示任何内容。同样,如果我调整框架大小并使其变小,一旦低于 AlmostLargeTextSize

,左窗格中的内容将完全丢失

有没有根据可用帧space计算左边CMFCRibbonStatusBarPane大小的方法?我能找到的最近的是 CMFCRibbonBaseElement::GetSize,当与平均字体大小指标结合使用时,我可能会计算出最大可用文本大小,但它看起来相当粗糙。

我的工作如下;

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

基本上,当框架 window 在初始创建后随时调整大小时,根据状态窗格字符计算框架宽度的大小,减去已知窗格的字符数, 并根据结果设置左窗格。

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