没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
翻译|其它|编辑:郝浩|2007-09-17 10:33:17.000|阅读 1354 次
概述:
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
一、实现方法
虽然 Visual C++ 中的 MFC 类提供了标准的进度指示器控件(progress control),但是我们不能在状态栏里直接使用这个控件,要解决这个问题,可以创建一个可重用 C++类 CProgStatusBar,这个类从 CStatusBar 派生,用来来实现状态条中的进度指示。整个实现过程不是很难,思路是在状态栏创建一个进度指示器控制,把它作为子窗口来对待,然后根据不同的状态来显示或者隐藏进度指示器。
在具体实现 CProgStatusBar 类的过程中,首先在 CProgStatusBar 派生类中加了一个 CProgressCtrl 类型的数据成员--m_wndProgBar,然后重载 CstatusBar 类的二个重要成员函数:OnCreate()、OnSize(),最后还要在该类中添加一个自定义成员函数 OnProgress()。在上述三个函数中, OnCreate()负责在状态栏第一次被创建时接收控制,继而创建进度指示器并将它初始化为一个子窗口,它的实现代码如下:
int CProgStatusBar::OnCreate(LPCREATESTRUCT lpcs) |
OnCreate()函数在状态栏的式样中加了一个 WS_CLIPCHILDREN,它告诉 Windows 不要绘制子窗口以下的状态栏区域,这样可以减少屏幕闪烁。接着 OnCreate()函数创建进度指示器控件并将它的范围设置成[0,100]。注意在这里创建进度指示器控件时没有用 WS_VISIBLE,因为我们要实现的目标是仅仅当装载文件时进度条才显现,其余时间内应用程序都隐藏它。
熟悉 Windows 编程的人都清楚,无论何时,只要在某个窗口里添加子窗口,那么一定要负责管理它的大小尺寸,也就是说,当父窗口大小改变后,子窗口的大小也要跟着作相应的改变。一般来说,这个工作由父窗口的 WM_SIZE 消息处理函数 OnSize()来作,所以我们也要处理该类的 OnSize()函数。
void CProgStatusBar::OnSize(...) |
从上述代码可以看出,CProgStatusBar::OnSize()将进度指示器放在了状态栏的第一个窗格,这个窗格通常用来显示程序的"就绪"信息和命令提示信息。注意这里不论进度指示器是处于可见状态还是隐藏状态,MoveWindow 都照样起作用--所以即便是进度指示器处于隐藏状态,其窗口大小同样是可调的。
调整好进度指示器的窗口大小后,下面要作的就是进度指示器的显示,进度指示器当前进度状态的显示在 CProgStatusBar::OnProgress 中完成。它有一个类型为 UINT 的入口参数:参数值的范围从0到100,表示进度百分比,0表示进度没开始,100表示全部完成。如果这个参数的值大于0,则 OnProgress 显示进度控制并设置指示器的位置;如果参数值等于0,则 OnProgress 隐藏进度控制。
虽然子窗口控件通常都是放在父窗口能绘制的区域的最上面,但这样做在绘制方面是有一定风险的。在隐藏/显示进度控制时尤其如此,这时候会出现两个问题:第一,因为进度指示器显示在状态栏的第一个窗格位置,所以如果进度条指示器显示时已经显示有状态信息,那么进度指示器和状态信息文本就会有冲突,相互干扰。之所以会这样,是因为进度控制假设其绘制背景是干净的,并且只绘制进度控制的着色部分。解决这个问题最简单的方法是调用 CStatusBar::SetWindowText(NULL)函数在显示进度指示器之前打扫一下环境卫生,清除以前的文本。
对于状态栏来说,SetWindowText 函数的作用是设置状态栏第一个窗格的文本。反之,当调用 OnProgress(0)清除进度控制时也存在类似的问题,CProgStatusBar::OnProgress 隐藏进度控制后,状态栏第一个窗格该显示什么信息呢?一般显示"就绪"或其它的提示信息。当应用程序不做任何事情时,MFC程序总是在这个位置显示资源串 AFX_IDS_IDLEMESSAGE 表示的文本,其缺省值为"就绪",当然读者朋友们可以在当前项目的 RC 文件中任意修改这个值,不管怎样,在 MFC 程序的状态栏中显示"就绪"信息很容易,需要作的就是在 CProgStatusBar::OnProgress()函数中调用语句GetParent()->PostMessage(WM_SETMESSAGESTRING,AFX_IDS_IDLEMESSAGE)向父窗口发送一个 WM_SETMESSAGESTRING 消息就可以了,需要注意的是,使用消息 WM_SETMESSAGESTRING 时必须包含它的定义文件"afxpriv.h",否则程序会报告编译错误。
上述 CprogStatusBar 类实现了状态栏中包含进度条控件,该类的使用方法很简单,首先在应用程序的 CmainFrame 类中用 CProgStatusBar 代替 CStatusBar 声明实例,然后在任何想要显示进度控制指示的地方调用 CProgStatusBar::OnProgress。本例中定义了一个消息 MYWM_PROGRESS,它将进度条当前的进度作为 WPARAM 参数传递到 CProgStatusBar::OnProgress()函数。
经过上述处理,想要使用进度指示的任何对象都可以通过发送一个消息到主框架来调用状态栏进行进度条的显示。例如,在例子程序中,文档的 Serialize()函数在加载文本文件时,利用 Sleep()函数仿真耗时加载,每隔150毫秒报告一次进度状态。如果你不想从文档发送 Windows 消息,可以用 MFC 的视图更新机制来做。你可以发明一个"暗示"代码以及一个小结构来保存进度百分比数据,并通过向框架发送 MYWM_PROGRESS 消息调用暗示信息。这是从文档到视图/框架传递进度控制信息的最省事的方式。
二、编程步骤
1、 启动 Visual C++6.0,生成一个单文档应用程序 prgsbar,项目的视图类的基类选择 CEdit 类;
2、 在程序的 Resource.h 文件中添加自定义消息的定义:
#define MYWM_PROGRESS (WM_USER+1)
3、 在程序的主框架窗口 CMainFrame 类的头文件中声明 MYWM_PROGRESS 的消息响应函数 afx_msg LRESULT OnProgress(WPARAM wp, LPARAM lp),在该类的实现中添加消息映射 ON_MESSAGE(MYWM_PROGRESS,OnProgress);
4、 将 CMainFrame 类中的工具条对象改为 CProgStatusBar m_wndStatusBar;
5、 重载 CPrgsbarDoc::Serialize(CArchive& ar)函数,用来处理读取文件时的进度条仿真;
6、 添加代码,编译运行程序。
三、程序代码
////////////////////////////////////////////CprogStatusBar 类的头文件; |
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com
文章转载自:csdn接DevExpress原厂商通知,将于近日上调旗下产品授权价格,现在下单客户可享受优惠报价!
面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@evget.com
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
慧都科技 版权所有 Copyright 2003-
2025 渝ICP备12000582号-13 渝公网安备
50010702500608号