首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何计算CMFCRibbonStatusBarPane的大小

如何计算CMFCRibbonStatusBarPane的大小
EN

Stack Overflow用户
提问于 2016-03-14 09:00:40
回答 1查看 539关注 0票数 1

我有基于MFC丝带的应用程序,包括以下三个状态栏;

代码语言:javascript
运行
复制
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,它可以计算出与平均字体大小度量一起使用时的最大可用文本大小,但它看起来相当粗糙。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-14 10:15:53

我得到的工作如下;

代码语言:javascript
运行
复制
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来说,似乎有点麻烦,但这是我能想到的最好的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35983201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档