菡 冰
在利用MFC编写应用程序尤其是涉及到数值分析与模拟程序时,要进行大量的数值运算,如在屏幕上显示三维、二维图形图像就需要进行数据拟合、样条以及插值等算法,而且为了保证精度,运算时数据点一般还采用浮点甚至双精度浮点数,这样应用程序就需要占用大量的CPU时间来完成相应的工作,一般持续几分钟、几十分钟甚至更多的时间。如果应用
程序不输出一些信息的话,则常常会让人误认为系统是否已经当掉。因此Windows系统提供了一个函数:
LoadCursor(UINT nIDResource) const;
通过这个函数可以把鼠标的形状改为沙漏来表明系统正处于一个耗时的过程。但是一般而言,这种改变很容易让人忽略,并且不知道当前进程完成了多少,还剩下多少。
在MFC中提供了进程条控件CProgressCtrl类,利用该类可以很方便地显示进程的完成状况。关于进程条控件CProgressCtrl类的用法以及说明,具体可以参见Visual C++的联机帮助。显示当前进程的完成状况,可以有很多种方法用进程条控件CProgressCtrl类来实现,如采用多线程编程方法,通过线程通信来显示,也可以在同一线程中采用含进程条控件CProgressCtrl类的无模式对话框来显示。但是这几种方法都比较复杂且不方便,并需要占用一定的系统资源,状态显示响应也不太迅捷。
Windows应用程序一般在其底部有一个小条通称状态条。状态条的右边是几个可以动态增加或删除的状态格。MFC中提供了状态条控件CStatusBar类来完成状态格的管理。因此我们可以在应用
程序的状态条中增加一个进程条状态格来显示当前进程任务的完成状态。显然,相对前面所述的方法,这种方法比较方便且容易实现,不占用系统资源,状态显示响应非常迅捷。下面阐述具体实现方法:
1、用AppWizard创建一个工程文件pBar,单文档应用或者多文档应用皆可。其他选项均可采用缺省。
2、在Visual Studio的工作台中,选择"View"菜单下的"Resource Symbols"菜单命令,弹出对话框后点击"New"按钮,增加一条新的符号ID_ INDICATOR_PROGRESS_PANE并采用系统分配的缺省ID值。如图1所示。
(图注ZHUANG-1) 图1 增加一条符号ID_INDICATOR_PROGRESS_PANE
3、在MainFrm.cpp文件的状态格指示数组(紧接在消息映射代码段后)中增加资源符号ID_INDI-CATOR_PROGRESS_PANE或者其ID值。注意,如果将符号ID_INDI-CATOR_PROGRESS_PANE放在数组的最后,则表明进程条状态格将在状态条的最右边;如果你将符号ID_INDICATOR_PROGRESS _PANE放在数组的前面,则表明进程条状态格将在状态条的最左边;如果将符号ID_INDICATOR_PROGRESS _PANE放在数组的中间,则表明进程条状态格将在状态条的中间。具体参见如下代码:
static UINT indicators =
{
ID_SEPARATOR, //
status line indicator
ID_INDICATOR_PROGRESS_PANE, //
means the progress pane in
far left.
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
4、打开资源编辑器,选择字符串表,单击鼠标右键,选择"New String"命令(或者通过工作台的"Insert"菜单选择"New String"命令),弹出字符串属性编辑对话框如图2所示。在String prorties对话框的ID栏中键入符号ID_INDICATOR_PROGRESS_ PANE,在Caption编辑栏键入空格。注意空格的多少将决定状态条中进程状态格的长度。具体见图2。
(图注ZHUANG-2) 图2 增加符号ID_INDICATOR_PROGRESS_PANE的字符串
5、在头文件MainFrm.h中,增加两个变量,一个为CProgressCtrl控件,设为m_Progress;另一个为逻辑布尔变量,设为m_bC