MFC:从 CDialog 更改为 CWnd 现在 CStatusBar 不显示?

MFC: Changing from CDialog to CWnd now the CStatusBar doesn't show?

为了解决当 main window 最小化时 CDialog 被最小化的问题,我决定尝试使用 CWnd。这行得通,但现在 CStatusBar 没有显示?我可能遗漏了什么或者是否有一些要求要显示?

新的CWnd是这样创建的:

CString classname=AfxRegisterWndClass(CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW, 0, 0,  LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE (IDR_MAINFRAME)));
m_pDlgNowACWnd->CreateEx(0, classname, NULL, WS_OVERLAPPEDWINDOW | WS_VISIBLE, CRect(0, 0, 0, 0), NULL, 0)

OnInitDialog() 中的初始化现在是 OnCreate() 执行 nroaml m_StatusBar.Create(this) 然后进一步初始化它:

EnableDynamicLayout(FALSE);

// set our own height so we can scale
CStatusBarCtrl &statusctrl=m_StatusBar.GetStatusBarCtrl();
statusctrl.SetMinHeight(g_DPIHelper.Scale(20));

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

m_StatusBar.SetPaneInfo (0, ID_SEPARATOR, SBPS_NORMAL|SBPS_STRETCH, 0); 
m_StatusBar.SetPaneInfo (sliderPane, ID_SEPARATOR, SBPS_NORMAL, g_DPIHelper.Scale(128)); 
m_StatusBar.SetPaneInfo (textPane, ID_SEPARATOR, SBPS_NORMAL|SBPS_POPOUT, g_DPIHelper.Scale(30)); 
// add this to workaround the GetSystemMatrix() issue above.
m_StatusBar.SetPaneInfo (STATUSBARspacerPane, ID_SEPARATOR, SBPS_NORMAL, 25); 

// this is needed to calc location and size of bar
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, IDC_VIEW_ACHILDCWND);

EnableDynamicLayout();

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

这是一个状态栏,上面有一个滑块和一些文本。

主要 CDialog 现在 CWnd 有两个 children 一个 CWnd 和一个 CStatusBar。 dialog/window 的初始大小为 0,但随后会在显示 dialog/window 时调整大小以更正大小。

知道我在从 CDialog 转换为 CWnd 时可能遗漏了什么或做错了什么吗?

其他一切正常,只是 CStatusBar 没有显示?

谢谢。

更新:

CStatusBar 高度似乎为零。我做了一个测试,将 CWnd 创建为 CRect(0, 0, 10, 50) 而不是全零, CStatusBar 显示(尽管高度为 11,比应有的高度短得多)。使用 CWnd 时似乎 statusctrl.SetMinHeight(g_DPIHelper.Scale(20)) 调用不起作用?调整大小发生在 RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, IDC_VIEW_ACHILDCWND); 我在 CStatusBar::OnSize() 上设置了一个断点并注意到当 CDialog 它具有正确的大小但不使用 CWnd(最初为零现在 11 使用CWnd Create()).

高度为 50

由于 CStatusBar 的高度在 OnCreate() 期间创建和计算后不会改变,因此创建的 CWnd 的大小需要足够高以达到所需的 CStatusBar 最小高度。所以不是这个:

m_pDlgNowACWnd->CreateEx(0, classname, NULL, WS_OVERLAPPEDWINDOW | WS_VISIBLE, CRect(0, 0, 0, 0), NULL, 0);

这样做:

CRect rccreate(0, 0, 0, MYDLG_STATUSBAR_MINHEIGHT);
CalcWindowRect(&rccreate);
m_pDlgNowACWnd->CreateEx(0, classname, NULL, WS_OVERLAPPEDWINDOW | WS_VISIBLE, rccreate, NULL, 0);