我有基于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,它可以计算出与平均字体大小度量一起使用时的最大可用文本大小,但它看起来相当粗糙。
发布于 2016-03-14 10:15:53
我得到的工作如下;
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来说,似乎有点麻烦,但这是我能想到的最好的。
https://stackoverflow.com/questions/35983201
复制相似问题