MF C: Добавление строки состояния в CDialogEx с изменяемым размером? - PullRequest
1 голос
/ 20 июня 2020

Я подумал, что было бы неплохо добавить строку состояния с процентами и другой информацией к CDialogEx, которая используется для просмотра изображения. Но не похоже, что вы можете просто использовать CMFCStatusBar или CStatusBar и заставить их работать.

Я нашел различные образцы, но ни один из них не имеет строки состояния за пределами клиентской области и перемещается как изменен размер? Различные методы просто создают строку состояния, и она оказывается скрытой под горизонтальной полосой прокрутки, и если вы измените размер окна, строка состояния будет находиться в середине диалогового окна.

Есть простой способ или полный пример наличие строки состояния на CDialogEx, размер которой можно изменять, как в обычном окне?

1 Ответ

3 голосов
/ 20 июня 2020

Есть ли простой способ или полный пример наличия строки состояния на CDialogEx, размер которой можно изменять, как в обычном окне?

Да! После того, как вы создали строку состояния, вы можете добавить ее в макет Dynami c для изменения размера:

//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 в порядке) в двух диалоговых окнах моего приложения.

Когда Dynami c Макет не активируется автоматически

Вот обновленный пример, когда Dynami c Макет не включается автоматически для вас (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 и добавить его в макет Dynami c (это также будет nIDLeftOver из RepositionBars()).

Вот как вы можете добавить " view "для содержимого, чтобы полосы прокрутки могли находиться в пределах области просмотра:

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