MFC:向可调整大小的 CDialogEx 添加状态栏?
MFC: Adding a status bar to a CDialogEx that is resizable?
我认为将带有百分比和其他信息的状态栏添加到用于查看图像的 CDialogEx
中会很好。但似乎您不能简单地使用 CMFCStatusBar
或 CStatusBar
并使其正常工作。
我找到了各种示例,但是其中 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;
}
我认为将带有百分比和其他信息的状态栏添加到用于查看图像的 CDialogEx
中会很好。但似乎您不能简单地使用 CMFCStatusBar
或 CStatusBar
并使其正常工作。
我找到了各种示例,但是其中 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;
}