已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
MFC 进度条编程控制进度条编程控制 1 进度条的主要功能 进度条控制 Progress Control 主要用来进行数据读写 文件拷贝和磁盘格式等操作时的 工作进度提示情况 如安装程序等 伴随工作进度的进展 进度条的矩形区域从左到右利 用当前活动窗口标题条的颜色来不断填充 进度条控制在 MFC 类库中的封装类为 CProgressCtrl 通常仅作为输出类控制 所以其操 作主要是设置进度条的范围和当前位置 并不断地更新当前位置 进度条的范围用来表示 整个操作过程的时间长度 当前位置表示完成情况的当前时刻 SetRange 函数用来设置 范围 初始范围为 0 100 SetPos 函数用来设置当前位置 初始值为 0 SetStep 函数 用来设置步长 初始步长为 10 StepIt 函数用来按照当前步长更新位置 OffsetPos 函 数用来直接将当前位置移动一段距离 如果范围或位置发生变化 那么进度条将自动重绘 进度区域来及时反映当前工作的进展情况 进度条的对象结构 进度条控制的建立方法 CProgressCtrl 其中参数 dwStyle 用来确定进度条控制的控制风格 参数 rect 用来确定进度条控制的大小 和位置 参数 pParentWnd 用来确定进度条父窗口指针 参数 nID 用来确定进度条控制的 控制符 ID 值 2 进度条控制的类属性 进度条控制的类属性包括设置进度条最大最小控制范围 SetRange 设置进度条当前位置 SetPos 设置进度条当前位置偏移值 OffsetPos 和设置进度条控制增量值 SetStep 3 进度条控制的操作方法 进度条控制的操作方法主要是使进度条控制并重绘进度条的 StepIt 函数 进度条控制的应用技巧示例 1 利用应用程序向导 AppWizard 生成基于对象框的应用程序 CProgDlg 2 在对话框中设置进度条和静态文本控制 其 ID 分别为 IDC PROG 和 IDC PERCENT 在对话框初始代码中增加控制的范围和位置 在 ProgDlg h 中设置两个数据成员 用来表示进度条的最大值和步长 ProgDlg h class CProgDlg public Cdialog 其它代码 public int m nMax m nStep 其它代码 2 在 ProgDlg cpp 中设置初始状态 BOOL CProgDlg OnInitDialog Cdialog OnInitDialog 其它代码 TODO Add extra initialization here CProgressCtrl pProgCtrl CProgressCtrl GetDlgItem IDC PROG pProgCtrl SetRange 0 200 设置进度条范围 其它代码 m nMax 200 m nStep 10 SetTimer 1 1000 NULL 设置进度条更新时钟 return TRUE 3 完善 WM TIMER 消息处理 使进度条按照当前步长进行更新 同时完成进度条的百分 比显示 void CProgDlg OnTimer UINT nIDEvent TODO Add your message handler CProgressCtrl pProgCtrl CProgressCtrl GetDlgItem IDC PROG int nPrePos pProgCtrl StepIt 取得更新前位置 char test 10 int nPercent int nPrePos m nStep m nMax 100 0 5 可修改 wsprintf test d nPercent GetDlgItem IDC PERCENT SetWindowText test Cdialog OnTimer nIDEvent vc 进度条控件 一 方法 1 单线程方式 将你的任务分成多个部分 每运行一部分 就更新一下进度条 这种方法就是很烦人 方法 2 双线程方式 主线程负责完成你想要的工作 副线程负责更新进度条 更新进度条可以按照计时方法 或者根据主线程完成任务的状态来更新 因此 你的主线程在完成任务时 还得用一个临界区随时报告任务的完成状态 方法 3 双线程方式 主线程负责更新进度条 并且创建副线程完成任务的某部分工作 但这和单线程很像 在 VC 程序的状态栏中实现进度条 读者朋友们可能天天使用 Visual C 这个强大的工具来开发应用程序 不知道注意到 没有 Visual C 每次装载一个项目的时候 为了使项目加载过程不至于太单调 会在状 态栏的左半部分会出现一个装载进度条 用来即时显示 Visual C 装载项目的进度 当项 目装载完毕后 进度条隐藏 那么这个功能是如何实现的呢 为了说明该功能的实现原理 本例提供了一个范例程序 prgsbar 它演示了在编辑视 图里显示文本文件 在加载文本文 件时 在界面的状态条中的进度指示器仿真显示文件的加载过程 当文本装载完毕后 进 度条隐藏 由于该程序在装载文件显示的 进度条时无法进行拷屏操作 所以这里没有给出 状态条中显示进度条的界面效果图 读者可以运行本书所带光盘中的程序代码观看相应的 效果 一 实现方法 虽然 Visual C 中的 MFC 类提供了标准的进度指示器控件 progress control 但是我 们不能在状态栏里直接使用这个控件 要解决这个问题 可以创建一个可重用 C 类 CProgStatusBar 这个类从 CStatusBar 派生 用来来实现状态条中的进度指示 整个实 现过程不是很难 思路是在状态栏创建一个进度指示器控制 把它作为子窗口来对待 然 后根据不同的状态来显示或者隐藏进度指示器 在具体实现 CProgStatusBar 类的过程中 首先在 CProgStatusBar 派生类中加了一个 CProgressCtrl 类型的数据成员 m wndProgBar 然后重载 CstatusBar 类的二个重要成 员函数 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 因为我们要实现的目标是仅仅当装载文件时进度条才显现 其余时间内 应用程序都隐藏它 熟悉 Windows 编程 的人都清楚 无论何时 只要在某个窗口里添加子窗口 那么一定要 负责管理它的大小尺寸 也就是说 当父窗口大小改变后 子窗口的大小也要跟着作相应 的改 变 一般来说 这个工作由父窗口的 WM SIZE 消息处理函数 OnSize 来作 所 以我们也要处理该类的 OnSize 函数 void CProgStatusBar OnSize CStatusBar OnSize CRect rc GetItemRect 0 获取状态条的第一个窗口的尺寸 m wndProgBar MoveWindow 移动进度条到状态条的第一个窗口 从上述代码可以看出 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 virtual CProgStatusBar CProgressCtrl void OnProgress UINT pct protected CProgressCtrl m wndProgBar the progress bar afx msg int OnCreate LPCREATESTRUCT lpCreateStruct afx msg void OnSize UINT nType int cx int cy DECLARE MESSAGE MAP DECLARE DYNAMIC CProgStatusBar CprogStatusBar 类的实现文件 include StdAfx h include ProgBar h ifdef DEBUG define new DEBUG NEW undef THIS FILE static char THIS FILE FILE endif IMPLEMENT DYNAMIC CProgStatusBar CStatusBar BEGIN MESSAGE MAP CProgStatusBar CStatusBar ON WM CREATE ON WM SIZE END MESSAGE MAP CProgStatusBar CProgStatusBar CProgStatusBar CProgStatusBar 创建状态条时也创建进程条 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 使进程度条的尺寸与状态条的尺寸同步变化 void CProgStatusBar OnSize UINT nType int cx int cy CStatusBar OnSize nType cx cy CRect rc GetItemRect 0 m wndProgBar MoveWindow 根据 pct 的当前值对进程条进行设置 void CProgStatusBar OnProgress UINT pct CProgressCtrl DWORD dwOldStyle pc GetStyle DWORD dwNewStyle dwOldStyle if pct 0 如果 pct 0 将显示进度条 dwNewStyle WS VISIBLE else 否则隐藏进度条 dwNewStyle if dwNewStyle dwOldStyle SetWindowText NULL 显示进度条前清空状态条 SetWindowLong pc m hWnd GWL STYLE dwNewStyle 设置进度条处于显示状态 设置进度条的当前位置 pc SetPos pct if pct 0 如果 pct 等于 0 通知主框架窗口显示空闲信息 GetParent PostMessage WM SETMESSAGESTRING AFX IDS IDLEMESSAGE 文档装载处理函数 void CPrgsbarDoc Serialize CArchive if ar IsStoring for int pct 10 pctSendMessage MYWM PROGRESS pct if pFrame pFrame SendMessage MYWM PROGRESS 0 CEditView m viewList GetHead SerializeRaw ar 显示文本文件的内容 四 小结 本例虽然是介绍的如何在状态条中包含进度条 但是读者朋友们可以从中受到启发 开拓 思路 将该思想应用到类似的应用当中去 例如在状态条中实现显示图像等 位图进度条 图一 例子效果 玩过破天的朋友知道 游戏更新时进度是用位图表示的 我觉的挺漂亮的 于是自己动手 做了一个类来实现那种效果 这个类的名字叫 CBmpProgCtrl 继承于 CStatic 使用方法如下 1 首先要将 BmpProgCtrl h 和 BmpProgCtrl cpp 添加到工程中 2 导入两幅位图 作为前景和背景 资源标识分别为 IDB FORE 和 IDB BACK 3 在对话框上 放置一个 Static Text 控件 修改其 ID 只要不是默认的 IDC STATIC 就可以了 4 让这个控件和一个 Control 类型的变量关联 如变量名可以叫 m bmpprog 5 找到该变量定义的地方 应该是 CStatic m bmpprog 修改 CStatic 为 CBmpProgCtrl 并将头文件 BmpProgCtrl h 包含进来 6 调用该类的方法 类成员方法介绍 void GetRange int 背景色为蓝 色 m Progress1 SendMessage PBM SETBARCOLOR 0 RGB 255 0 0 前景色为红色 至于别的控件能不能按这种办法来改变颜色 我还没试过 大家可以试一试 如果可 以 请留言告诉我 先谢谢了 以下摘自 新编 win32API 大全 函数功能 该函数将指定的消息发送到一个或多个窗口 此函数为指定的窗口调用窗口程 序 直到窗口程序处理完消息再返回 而函数 PostMessage 不同 将一个消息寄送到一 个线程的消息队列后立即返回 函数原型 LRESULT SendMessage HWND hWnd UINT Msg WPARAM wParam LPARAM IParam 参数 hWnd 其窗口程序将接收消息的窗口的句柄 如果此参数为 HWND BROADCAST 则消息将被发送到系统中所有顶层窗口 包括无效或不可见的非自身拥有的窗口 被覆盖 的窗口和弹出式窗口 但消息不被发送到子窗
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 上海电子信息职业技术学院《金融学概论》2025-2026学年期末试卷
- 上海立达学院《社会调查》2025-2026学年期末试卷
- 上海民远职业技术学院《健康教育与健康促进》2025-2026学年期末试卷
- 上海欧华职业技术学院《物流管理学》2025-2026学年期末试卷
- 山西信息职业技术学院《中国文化概论》2025-2026学年期末试卷
- 上海杉达学院《环境与自然资源经济学》2025-2026学年期末试卷
- 朔州师范高等专科学校《卫生保健》2025-2026学年期末试卷
- 沈阳音乐学院《教师职业道德》2025-2026学年期末试卷
- 太原师范学院《临床免疫学检验技术》2025-2026学年期末试卷
- 山西管理职业学院《会计电算化》2025-2026学年期末试卷
- 高考反复修辞示例与训练
- 青马结业个人总结汇报
- 婚礼上女方家长的精彩讲话稿7篇
- ecotect教程教学课件
- 综合实践活动(4年级下册)第4课时 换季衣物巧收纳-课件
- 抗挫折能力课件(修改)
- 2023年江苏省高中生物学竞赛初赛试题
- 不锈钢护栏施工方案方案
- 陕西境某段高速公路建设工程地质灾害危险性评估报告报告
- 母亲的白发阅读及答案
- GB/T 8237-2005纤维增强塑料用液体不饱和聚酯树脂
评论
0/150
提交评论