如何计算 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 来说似乎有点麻烦,但这是我能想到的最好的。
我有一个基于 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 来说似乎有点麻烦,但这是我能想到的最好的。