当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 如何在状态栏中实现进度指示器控制
| 如何在状态栏中实现进度指示器控制 下载例子源代码 int CProgStatusBar::OnCreate(LPCREATESTRUCT lpcs){ lpcs->style |= WS_CLIPCHILDREN; VERIFY(CStatusBar::OnCreate(lpcs)==0); VERIFY(m_wndProgBar.Create(WS_CHILD, CRect(), this, 1)); m_wndProgBar.SetRange(0,100); return 0;} OnCreate在状态栏的式样中加了一个WS_CLIPCHILDREN,它告诉Windows不要绘制子窗口以下的状态栏区域,这样可以减少屏幕闪烁。接着OnCreate创建进度指示器控制并将它的范围设置成[0,100]。注意在这里创建进度指示器控制时没有用WS_VISIBLE,因为我想在程序开始的时候隐藏它。无论何时,只要你在某个窗口里添加子窗口,那么一定要负责管理它的大小尺寸,也就是说,当父窗口大小改变后,子窗口的大小也要跟着作相应的改变。一般来说,这个工作在父窗口的WM_SIZE/OnSize处理例程中完成: // 状态栏大小改变以后,子窗口的尺寸跟着变void CProgStatusBar::OnSize(...){ CStatusBar::OnSize(...); CRect rc; GetItemRect(0, &rc); m_wndProgBar.MoveWindow(&rc,FALSE);} CProgStatusBar::OnSize 负责移动进度指示器到你期望的位置:例子程序是把它放在了状态栏的第一个窗格,这个窗格通常用来显示程序的“就绪”信息和命令提示信息。注意这里不论进度指示器时处于可见状态还是隐藏状态,MoveWindow都照样起作用——所以即便是进度指示器处于隐藏状态,其窗口大小同样是可调的。说完窗口大小的调整,下面我们来看看进度指示器的显示,进度指示器状态的显示在CProgStatusBar::OnProgress中完成。它有一个类型为UINT的入口参数:参数值的范围从0到100,表示进度百分比,0表示进度没开始,100表示全部完成。如果这个参数的值大于0,则OnProgress显示进度控制并设置指示器的位置;如果参数值等于0,则 OnProgress隐藏进度控制。 虽然我们常常都把子窗口控制放在父窗口能绘制的区域的最上面,但这样做在绘制方面是有一定风险的。在你隐藏/显示进度控制时尤其如此,你会发现有两个问题:第一,因为进度指示器显示在状态栏的第一个窗格位置,所以如果指示器显示时已经显示有状态信息,那么进度指示器和状态信息文本就会有冲突,相互干扰。如图二所示。之所以会这样,是因为进度控制假设其绘制背景是干净的,并且只绘制进度控制的着色部分。解决这个问题最简单的方法是调用CStatusBar::SetWindowText(NULL)函数在显示进度指示器之前打扫一下环境卫生,清除以前的文本。对于状态栏来说,SetWindowText函数的作用是设置状态栏第一个窗格的文本。 |