【问题标题】:MFC: Adding a status bar to a CDialogEx that is resizable?MFC:向可调整大小的 CDialogEx 添加状态栏?
【发布时间】:2020-10-10 07:58:37
【问题描述】:

我认为将带有百分比和其他信息的状态栏添加到用于查看图像的CDialogEx 会很好。但您似乎不能简单地使用CMFCStatusBarCStatusBar 并让它正常工作。

我找到了各种样本,但没有一个样本的状态栏位于客户区之外并且按调整大小移动?不同的方法只是创建一个状态栏,它最终隐藏在一个水平滚动条下,如果你调整窗口大小,状态栏就在对话框的中间。

有没有简单的方法或完整的例子让CDialogEx 上的状态栏可以像普通窗口一样调整大小?

【问题讨论】:

标签: mfc statusbar cdialog


【解决方案1】:

有没有简单的方法或完整的例子让CDialogEx 上的状态栏可以像普通窗口一样调整大小?

是的!创建状态栏后,您可以将其添加到动态布局中以调整大小:

//This is where we actually draw it on the screen
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST,
    ID_INDICATOR_MEETING_TYPE);
GetDynamicLayout()->AddItem(m_StatusBar.GetSafeHwnd(),
    CMFCDynamicLayout::MoveVertical(100), CMFCDynamicLayout::SizeHorizontal(100));

我的应用程序的两个对话框上有一个状态栏(不是CMFCStatusBar,因为它不起作用,但CStatusBar 可以)。


动态布局未自动启用时

以下是未自动为您启用 动态布局 的更新示例(CDialogEx 无控件):

BOOL CMyDlg::OnInitDialog()
{
  CDialogEx::OnInitDialog();

  if (!m_StatusBar.Create(this)) {
    TRACE0("Failed to create status bar\n");
    return -1;
  }

  m_StatusBar.SetIndicators(indicators, _countof(indicators));

  RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);

  EnableDynamicLayout();

  auto pdlmanager=GetDynamicLayout();
  if (pdlmanager) {
    if (pdlmanager->Create(this)) {
      pdlmanager->AddItem(m_StatusBar.GetSafeHwnd(), CMFCDynamicLayout::MoveVertical(100), CMFCDynamicLayout::SizeHorizontal(100));
    }
  }
  // return TRUE unless you set the focus to a control
  // EXCEPTION: OCX Property Pages should return FALSE

  return TRUE;  
}

满足水平滚动条

N如果您有一个水平滚动条,StatusBar 最终会出现在它的上方;因此,您可能必须创建单独的 CWnd 并将其添加到动态布局中(它也是 RepositionBars()nIDLeftOver)。

以下是为内容添加“视图”窗口的方法,以便滚动条可以包含在视图区域中:

BOOL CMyDlg::OnInitDialog()
{
  CDialogEx::OnInitDialog();

  if (!m_StatusBar.Create(this)) {
    TRACE0("Failed to create status bar\n");
    return -1;
  }

  m_StatusBar.SetIndicators(indicators, _countof(indicators));

  CRect rc;
  GetClientRect(&rc);

  CString clsname=AfxRegisterWndClass(0);
  m_ImageView.Create(clsname, _T(""), WS_CHILD | WS_VISIBLE, rc, this, IDC_MY_VIEW);

  RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, IDC_MY_VIEW);

  EnableDynamicLayout();

  auto pdlmanager=GetDynamicLayout();
  if (pdlmanager) {
    if (pdlmanager->Create(this)) {
      pdlmanager->AddItem(m_StatusBar.GetSafeHwnd(), CMFCDynamicLayout::MoveVertical(100), CMFCDynamicLayout::SizeHorizontal(100));
      pdlmanager->AddItem(m_ImageView.GetSafeHwnd(), CMFCDynamicLayout::MoveNone(), CMFCDynamicLayout::SizeHorizontalAndVertical(100, 100));
    }
  }

  // return TRUE unless you set the focus to a control
  // EXCEPTION: OCX Property Pages should return FALSE

  return TRUE;  
}

【讨论】:

  • 我添加了额外的信息来回答我需要用来启用动态布局。
  • @df234987 请尽量保持我的回答与您的问题相关。您在状态栏调整大小的问题之外添加了其他代码。第一次编辑可以启用布局管理器,但第二次编辑正在朝着另一个方向恕我直言。
  • 好吧,如果使用滚动条,它会给出人们可能想要的结果。您添加了 CStatusBar,但并没有完全满足您真正想要的需求,您需要添加另一个项目来封装对话框上的内容 - 这样他们就可以在一个地方获得所有答案。
  • @df234987 好的?
猜你喜欢
  • 2010-11-10
  • 1970-01-01
  • 1970-01-01
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多