MFC:向可调整大小的 CDialogEx 添加状态栏?

MFC: Adding a status bar to a CDialogEx that is resizable?

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

我找到了各种示例,但是其中 none 的状态栏在客户区之外并且随着调整大小而移动?不同的方法只是创建一个状态栏,它最终隐藏在水平滚动条下,如果您调整 window 的大小,状态栏就位于对话框的中间。

是否有一个简单的方法或完整的例子可以在 CDialogEx 上设置一个可以像正常 window 一样调整大小的状态栏?

Is there an easy way or full example of having a statusbar on a CDialogEx that can be resized like a normal window?

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

//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如果你有一个水平滚动条,状态栏最终会在它上面;因此您可能必须创建单独的 CWnd 并将其添加到动态布局(它也将是 RepositionBars()nIDLeftOver)。

以下是如何为内容添加“视图”window,以便滚动条可以包含在视图区域内:

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;  
}