在对话框中添加状态条
介绍
在c++论坛里,有人曾问怎样在对话框中加状态条,我愚蠢地答复,他只要在dialog类中加CstatusBar成员m_bar,然后在OnInitDialog()中调用m_bar.Create()就行了。然后有人继续跟帖,这样并不凑效,我就亲自试了一下,果不料不行。无论如何,我认为这不是个太复杂的任务。因此我写了这篇关于在Dialog中添加StatusBar的小文章。在MSDN的范例中有这样的例子,但它是通过CstatusBar继承而来的,并适用于做一些复杂的事,这对于通常的状态条来说并不是必须的。
八个简单的步骤
步骤1
我先假定你有个基于MFC应用程序的对话框准备用于解释本篇中要讲述的问题。从View菜单中选择Resource Symbols,并增加两个新的符号,ID_INDICATOR_NISH
和
ID_INDICATOR_TIME
.你可以使用vs 6建议的默认值,但有时可能建议的值先前已定义,在此时,你就必须手动修改它。我认为这是必须的。我想知道这是不是个已知的Bug.
步骤2
打开你的String Table,并在此添加两个入口- ID_INDICATOR_NISH
和 ID_INDICATOR_TIME
.设置一些默认值,这些值可以任意设置。这实际上没多大关系。
步骤3
在主dialog类中增加数据成员CstatusBar:
CstatusBar m_bar;
步骤4
打开相应的cpp文件,并在其顶部加下面的代码:
static UINT BASED_CODE indicators[] =
{
ID_INDICATOR_NISH,
ID_INDICATOR_TIME
};
步骤5
现在我们要做的就是创建Statusbar,在Cdialog继承类的函数
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末,我们实际上在屏幕上已经有了个状态条。两个窗格中显示在String Table中设定的值。但现在如果想改变背景色,以下就是完全可选的。你可在OnInitDialog()中添加一行代码
m_bar.GetStatusBarCtrl().SetBKColor(RGB(180,180,180));
注意我们必须获取潜在的Statusbar控件去调用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);
}