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);
为了解决当 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()
).
由于 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);