为 MFC 对话框添加状态栏






4.97/5 (82投票s)
展示如何在基于对话框的应用程序中使用状态栏

引言
有人在 VC++ 论坛上询问如何在对话框中添加状态栏,我愚蠢地回答说,他们只需要在他们的对话框类中有一个 CStatusBar
成员,并且应该从 OnInitDialog()
处理程序中调用 Create()
。 然后另一个人回复说它不起作用,然后我自己试了一下,结果震惊地发现什么也没发生。 无论如何,我意识到这并不是一项太复杂的任务。 我想我应该写一篇关于在对话框中添加状态栏的小文章。 也有一个 MSDN 示例可以做到这一点,但是他们从 CStatusBar
派生了一个类,并且做了一些对于我们使用状态栏所做的常见简单事情来说不需要的复杂的事情。
八个简单步骤
步骤 1
我假设您已经准备好使用基于对话框的 MFC 应用程序。 从“视图”菜单中选择“资源符号”,并添加两个新符号,ID_INDICATOR_NISH
和 ID_INDICATOR_TIME
。 您可以使用 VS 6 建议的默认值,但有时它可能会建议一个已经被使用的值,在这种情况下,您可能需要手动更改它。 无论如何我必须这么做。 我想知道这是一个已知的错误吗。
第二步
打开您的字符串表,并在其中添加两个条目 - ID_INDICATOR_NISH
和 ID_INDICATOR_TIME
。 并设置一些默认值,无论您想使用什么。 这真的无关紧要。
步骤 3
将一个 CStatusBar
成员添加到您的主对话框类。
CStatusBar m_bar;
步骤 4
打开相应的 cpp 文件,并在文件顶部添加以下内容:-
static UINT BASED_CODE indicators[] =
{
ID_INDICATOR_NISH,
ID_INDICATOR_TIME
};
步骤 5
现在我们必须创建我们的状态栏。 一个好的地方是在我们的 CDialog
派生类的 OnInitDialog
函数中执行此操作。
m_bar.Create(this); //We create the status bar m_bar.SetIndicators(indicators,2); //Set the number of panes CRect rect; GetClientRect(&rect); //Size the two panes m_bar.SetPaneInfo(0,ID_INDICATOR_NISH, SBPS_NORMAL,rect.Width()-100); m_bar.SetPaneInfo(1,ID_INDICATOR_TIME,SBPS_STRETCH ,0); //This is where we actually draw it on the screen RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST, ID_INDICATOR_TIME);
步骤 6 - 背景颜色
在步骤 5 结束时,我们实际上在屏幕上有一个状态栏。 这两个窗格显示了我们在字符串表中设置的默认值。 但是现在,假设您要更改背景颜色。 当然,这完全是可选的。 您可以将此行添加到 OnInitDialog(...)
m_bar.GetStatusBarCtrl().SetBkColor(RGB(180,180,180));
请注意,我们必须获取底层状态栏控件以调用 SetBkColor
函数。
步骤 7 - 添加时钟
假设您希望右侧窗格显示当前时间。 首先设置一个计时器。 只需将此行添加到 OnInitDialog(...)
SetTimer(100,1000,NULL);
现在将以下代码添加到 WM_TIMER
处理程序
void CDlgStatusBarDlg::OnTimer(UINT nIDEvent) { if(nIDEvent==100) { CTime t1; t1=CTime::GetCurrentTime(); m_bar.SetPaneText(1,t1.Format("%H:%M:%S")); } CDialog::OnTimer(nIDEvent); }
步骤 8 - 显示 X 和 Y 坐标
假设您想显示鼠标在对话框中移动时的 X、Y 坐标。 您需要做的是覆盖 OnMouseMove
。
void CDlgStatusBarDlg::OnMouseMove(UINT nFlags, CPoint point) { CString s; s.Format("X=%d Y=%d",point.x,point.y); m_bar.SetPaneText(0,s); CDialog::OnMouseMove(nFlags, point); }