编写环境VS2005,字符集采用Unicode
创建一个状态栏:
在框架类里添加一个成员变量,
<span style="font-size:14px;"> CStatusBar m_myStatusBar;</span>
并在框架的OnCreate函数写一下代码:
<span style="font-size:14px;"> if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(myIndicators,
sizeof(myIndicators)/sizeof(UINT)))
{
TRACE0("未能创建状态栏\n");
return -1; // 未能创建
}</span>
其中SetIndicators这个函数的第一个参数是一个静态的UINT数组(状态行指示器),用于存放状态栏每个位置要显示的东西。
例如我的这个数组是这样的,其中的每一个元素都是一个宏,并且跟rc文件相关联。其中rc文件里文字或空格的长度就是每个格子显示的长度。
<span style="font-size:14px;">static UINT myIndicators[] =
{
IDS_TIMESTR,
IDS_POINT,
IDS_SLIDE,
};</span>
我的rc文件是这样的:
<span style="font-size:14px;">STRINGTABLE
BEGIN
IDS_TIMESTR " "
IDS_POINT " "
IDS_SLIDE " "
END</span>
在resource.h的宏是这样的:
<span style="font-size:14px;">#define IDS_TIMESTR WM_USER + 1
#define IDS_POINT WM_USER +2
#define IDS_SLIDE WM_USER +3</span>
至此,我们的状态栏就创建成功了。
给状态栏添加点什么:
比如我们想在第一个小格子显示当前系统的时间,
在框架类添加两个成员变量:
<span style="font-size:14px;"> CTime t; //获取当前时间
CString strTime; //保存当前时间的string</span>
在OnCreate添加如下代码:
<span style="font-size:14px;"> t = CTime::GetCurrentTime(); //静态方法获取当前时间
strTime = t.Format(_T("%Y-%m-%d %H:%M:%S")); //把时间保存下来
CDC* pdc = GetDC(); //获取DC,并获得字符串的长度
SIZE szStr = pdc->GetTextExtent(strTime);
ReleaseDC(pdc); //释放DC
m_myStatusBar.SetPaneInfo(0,IDS_TIMESTR,SBPS_NORMAL,szStr.cx); //设置地一个位置的长度,适应字符串的长度
m_myStatusBar.SetPaneText(0,strTime); //把第一个位置设置成系统时间
SetTimer(1,1000,NULL); //启动1号定时器,每秒响应一次,目的是不停刷新时间
</span>
在框架类添加WM_TIMER消息:
<span style="font-size:14px;">void CMainFrame::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
t = CTime::GetCurrentTime(); //不停获得时间
strTime = t.Format(_T("%Y-%m-%d %H:%M:%S"));
m_myStatusBar.SetPaneText(0,strTime); //刷新时间
CFrameWnd::OnTimer(nIDEvent);
}
</span>
如何在状态栏事实显示鼠标所指像素位置:
在View类中添加一个WM_MOUSEMOVE的消息:
<span style="font-size:14px;">void CStatusBarView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//获得框架指针
CMainFrame* pFrame = (CMainFrame*)theApp.GetMainWnd();
CString strPoint;
strPoint.Format(_T("%d,%d"),point.x,point.y);
CDC* pdc = GetDC();
SIZE szPoint = pdc->GetTextExtent(strPoint);
ReleaseDC(pdc);
pFrame->getStatusBar().SetPaneInfo(1,IDS_POINT,SBPS_NORMAL,szPoint.cx);
pFrame->getStatusBar().SetPaneText(1,strPoint);
CView::OnMouseMove(nFlags, point);
}</span>
代码有些长,一句一句解释。为了操纵状态栏,我们需要获得Frame类中我们设置好的成员变量,这样就需要框架类的一根指针。 然后我们用一个string装传进来点的坐标。下三行就是获取字符串的长度,跟上面差不多的。然后设置状态栏第二个位置的长度,再设置上文字,就完成了
。
如何在状态栏添加控件?
比如在第三个位置添加一个SlideBar,在框架类添加一个成员。
<span style="font-size:14px;"> CSliderCtrl m_slider;</span>
再重写OnPaint函数在框架类里,为什么一会儿再说。
<span style="font-size:14px;">void CMainFrame::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
RECT reSlider;
int nID = m_myStatusBar.CommandToIndex(IDS_SLIDE);
m_myStatusBar.GetItemRect(nID,&reSlider);
m_slider.Create(WS_CHILD|WS_VISIBLE,reSlider,&m_myStatusBar,ID_SLIDER);
// 不为绘图消息调用 CFrameWnd::OnPaint()
}
</span>
先定义个reSlider负责装ID为IDS_SLIDE位置的矩形大小。因为在OnCreate函数里,状态栏还没有被创建出来,无法获取其大小。只有在这个函数之后的函数里获得大小才能获得地到。然后把SliderBar给Create出来。
齐活。