MFC学习笔记(7)——状态栏

编写环境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出来。

齐活。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值