如何在状态栏中实现进度指示器控制

我最近作了一个C++/MFC程序,这个程序有时要加载大容量文件,为了让文件加载过程不至于太单调,我想在UI中用进度指示器显示文件的加载过程,而且我想在程序的状态栏中使用这个指示器控制。经过一番研究和尝试,我实现了自己的想法。本文将详细介绍整个实现过程。希望大家在解决类似的问题时少走一些弯路......

尽管MFC提供了标准的进度指示器控件(progress control),但是不能在状态栏里直接使用这个控件,因此我创建了自己的可重用C++类来实现进度指示。这个类从CStatusBar派生。整个实现过程不是很难,思路是在状态栏创建一个进度指示器控制,把它作为子窗口来对待,然后根据不同的状态来显示或者隐藏进度指示器。本文提供了一个范例程序pgrsbar,这个程序的框架使用了MFC的文档/视图结构,在编辑视图里显示文本文件。打开文件的时候,pgrsbar仿真长时间的加载过程并在状态栏里显示进度指示,如图一所示。我将这个含有进度指示器的状态栏封装在了一个CStatusBar派生的类中——CProgStatusBar。

图一 在状态栏里显示进度指示

下面是这个类的详细说明和使用方法:

CProgStatusBar是从标准的MFC类CStatusBar派生而来。我在CProgStatusBar派生类中加了一个CProgressCtrl类型的数据成员——m_wndProgBar,并且实现了三个重要的成员函数或方法:OnCreate、OnSize和OnProgress。下面是这三个函数的详细说明:

OnCreate负责在状态栏第一次被创建时接收控制,继而创建进度指示器并将它初始化为一个子窗口,

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,因为我想在程序开始的时候隐藏它。

时间: 2024-08-30 23:14:55

如何在状态栏中实现进度指示器控制的相关文章

C#在状态栏中,自绘进度条,

别的都没什么好说的了,说说这个在状态栏中,画进度条的办法吧.偶是做网站的,一直很羡慕FTP软件中,地址栏中的进度条,那么酷....一直在猜想,人家是怎么把进度条控件..放到地址栏上的??????? - -!! 汗...前几天因为工作需要,用UTF格式来写WEB程序,还要成批处理.写了这软件.一时灵感,试了试居然成功的自绘了进度条. 下面是源码: (另:状态栏name: stat 三个item 分别是: stat_1 stat_2 stat_3 ,stat_3属性设置成自绘.***********

c#中如何控制模态子窗体中的进度条

这个问题会让一些初学者感到困惑,一方面模态窗体在打开之后(Form.ShowDialog).主线程无法继续执行下面的事务:另一方面,又要在处理事务的时候来同步这个窗体里面的进度条.这两件事情都必须做,却都不能先做... 所以很多人不得不把事务处理写到模态窗体当中去,这样可以达到目的,却造成了代码结构混乱,而且子窗体无法复用,如果有多个事物,不得不为每个事务来写控制窗体. 这里我们介绍一种比较直接了当的方法,就是主线程中开启两个子线程,一个用于显示模态窗体,一个用于处理事务, 并同时更新第一个线程

WPF中Slider实时记录播放进度并且拖拽滑动Thumb实现播放进度的控制

问题描述 这个问题很多人都应该考虑过不过我来说说我的解决方法吧!就用MediaPlayer控件来举例:前面的问题比较容易解决,就是用一个Timer利用Tick事件去不停的获取正在播放的多媒体文件的当前播放位置.贴上代码:然后后面的问题解决方案可能很多人会想到用Slider的ValueChanged事件去写,可是这个拖拽并不是唯一一个触发ValueChanged事件的,在播放过程中Slider的Value属性一直在变化,很多人就看到了冲突.这个问题我是这样解决的,其实也是很简单的,我们可以用Mou

html5实现文章阅读进度指示器例子

近期我发现很多网站增加了一种能够显示出当前阅读位置的指示器(你阅读了多少依赖于你在这篇文章上向下拉动滚动条拉动了多少).通常,这种指示器被用在博客的文章或者是长表单上,用于帮助阅读着了解他们还有多少就能完成这篇文章或者表单. 问题 要建立一个阅读位置指示器,我们需要回答如下两个问题: 网页的长度是多少?网页的长度与文档当前的长度相同,这可以通过javascript计算出来. 用户当前的阅读位置在哪?要获取用户当前的阅读位置可能需要进入用户的思维中去寻找了,在我们所能处理的给定的技术范围之内,这看

网页设计中如何让CSS控制网页背景?

css|控制|设计|网页|网页背景|网页设计 在符合标准的网页设计中如何用CSS控制网页的背景呢?包括背景的颜色,背景的图片等一些问题,在本教程中一次给你讲清楚. ·背景颜色 background-color 我想这个我就不用多做介绍了,颜色代码我想大家都知道的,不是用英文来代替就是用指定的代码来表示的.这个的默认值是transparent(透明色). 例:body{background-color:yellow}H1{background-color:#000000} ·背景图片 backgr

Asp.net中带进度条的批量静态页生成

asp.net|静态 Asp.net中带进度条的批量静态页生成 namespace WDFROG.BLL...{    public delegate void CreateHtmlHandler(string fileName,string msg,int percent );    public class News    ...{        private const string C_ERR_MSG = "You have no rights!";        priva

WEB应用程序中的进度条

web|程序 WEB应用程序中的进度条 Julien Cheyssial 写作于2003/10/01 Joise.LI翻译并修改于2004-4-2 写在前面: 原文是我在需要使用进度条时找到的一篇文章,讲解详细并附有实例.我在原文的基础上加上了自己的修改:增加了线程处理并且将进度条的使用放到了子线程中处理.这是我第一次翻译文章,敬请各位指正.原文见于http://www.myblogroll.com/Articles/progressbar/,请对照参考. 谁说在WEB应用程序中不能使用进度条?

在ASP.NET中显示进度条

asp.net|显示 对于加载时间比较长的ASP.NET页面,我们可以在客户端浏览器中显示进度条来显示页面正在装载.下面就是具体的实现过程: 新建项目,名字为WebPortal,在项目类型中选择Visual C#项目或者Visual Basic项目都可: 在模板类型中选择ASP.NET Web应用程序: 位置里输入:http://localhost/WebPortal: 添加新项:名字为ShowProgress的Web窗体. 在您的Web窗体ShowProgress.aspx上添加任何其他的We

DELPHI在状态栏中显示进程条

经常上网的朋友可能早就已经发现,在一些浏览器的底部会在某些情况下动态显示一个进程条,比如在显示网页的时候,如果时间比较长,就会出现一个一格一格前进的,用以提醒用户已经有多少数据被下传下来.它不仅仅出现在浏览器中,还经常被用于下载软件中,比如现在最热门的BT下载软件,都使用了这一技术.技术的改进源于工作的需要,现在编写网络软件那么流行,上面的小技巧应该是每个像我们这样的编程爱好者都需要的吧. 打开DELPHI,选择WIN32面板上的状态栏(StatusBar)组件,放到窗体(Form)上(图1),