1.在需要创建状态栏的类的头文件中添加成员变量(如果要在主窗口中创建状态栏,那么在CMainFrame添加成员变量)
CStatusBar m_wndStatusBar;
2..在资源视图中新建一个字符串资源IDS_INDICATOR_POSITION,并设置其内容,然后在CMainFrame的源文件中定义下面的内容:
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
IDS_INDICATOR_POSITION,
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
其中第1,3,4,5行的ID往往是CMainFrame中已经存在的ID资源了,我们将自己定义的ID加入到第二行中,这样我们加入的字符串会显示在状态栏的第一个窗格中。
3.在CMainFrame类的OnCreate函数或其他对话框类的OnInitDialog中添加下面的代码:
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
m_wndStatusBar.SetPaneText(1,TEXT("hello2 x,128547"),true);
m_wndStatusBar.SetPaneInfo(1,IDS_INDICATOR_POSITION,SBPS_NORMAL,400);
第一个if语句中的代码是创建状态栏并设置状态栏中的内容,indicators中存放的字符串的ID对应的字符串是默认要显示在状态栏中的内容。
SetPaneText函数是一个比较重要的函数,这个函数是设置显示在状态栏窗格中的内容,第一个参数表示第几个窗格,因为之前定义的IDS_INDICATOR_POSITION资源的索引是1,所以这里为1,第二个窗格表示显示在该窗格中的内容,这个参数可以在程序中其他地方改变,从而使状态栏的使用更灵活,第三个参数表示是否立即更新,显然这里设置成true比较好。
SetPaneInfo这个函数也很重要,有时状态栏中的内容会变化,但是窗格无法完全显示这些内容,这时就可以将这个函数的最后一个参数调大一些,这个函数最后一个参数表示状态栏某窗格的宽度。
4.在程序中某处要修改状态栏的信息时可以使用下面的方法:
CString str;
str.Format(L"经度:%f,纬度:%f,高度:%f",Lon,Lat,_Hei);
CMainFrame *pMain=(CMainFrame *)AfxGetApp()->m_pMainWnd;
pMain->m_wndStatusBar.SetPaneText(1,str,true);