我有基于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
我可以找出与平均字体大小指标一起使用时的最大可用文本大小,但它看起来相当粗糙。
答案 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来说似乎有点麻烦,但这是我能想到的最好的。