分享
 
 
 

在状态条中显示进程状态

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

在状态条中显示进程状态

菡 冰

在利用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_bCreated,该变量用来标志CProgressCtrl控件是否成功进行创建。

6、在源文件MainFrm.cpp的OnCreate()函数中,初始化m_bCreated 为 FALSE,如下所示:

m_bCreated = FALSE;

7、模拟一个耗时过程函数OnSomeLongProcess()来演示状态条中的进程状态格。这里简单地采用睡眠函数来模拟一个耗时过程。函数代码见程序1。

void CMainFrame::OnSomeLongProcess()

{

RECT MyRect;

// substitute 1 with the zero-based index of your status bar pane. For example, if you put your

// pane first in the indicators array, you put 0, second you put 1, etc.

m_wndStatusBar.GetItemRect(1, &MyRect);

if (m_bCreated == FALSE)

{

//Create the progress control

m_Progress.Create(WS_VISIBLE|WS_CHILD, MyRect, &m_wndStatusBar, 1);

m_Progress.SetRange(0,100); //Set the range to between 0 and 100

m_Progress.SetStep(1); // Set the step amount

m_bCreated = TRUE;

}

// Now we'll simulate a long process:

for (int I = 0; I <100; I++)

{

Sleep(20);

m_Progress.StepIt();

}

}

8、状态条中的进程状态格创建成功后,如果应用程序主窗口尺寸发生变化,则进程状态格的大小不会自动适应主窗口的变化,因此需要重载主窗口的OnSize()函数。通过 ClassWizard在主窗口中增加WM_SIZE消息映射函数,如图3所示。

(图注ZHUANG-3) 图3 利用ClassWizard在CmainFrame中增加WM_SIZE消息映射函数

具体的源代码见程序2。

void CMainFrame::OnSize(UINT nType, int cx, int cy)

{

CFrameWnd::OnSize(nType, cx, cy);

// TODO: Add your message handler code here

if(m_bCreated == TRUE){

RECT rc;

m_wndStatusBar.GetItemRect(1, &rc);

// Reposition the progress control correctly!

m_Progress.SetWindowPos(&wndTop, rc.left, rc.top, rc.right -

rc.left,

rc.bottom - rc.top, SWP_SHOWWINDOW);

}

}

9、打开资源编辑器,在“查看”菜单下增加"Test"菜单命令,ID设为ID_TEST。然后利用ClassWizard增加一条消息映射函数OnTest(),代码如下:

void CMainFrame::OnTest()

{

// TODO: Add your command

handler code here

OnSomeLongProcess();

在完成所有上述步骤后,编译并运行程序。选择“查看”菜单下的"Test"菜单命令就会看到状态条中的进程状态格的进程显示情况,如图4所示。

(图注ZHUANG-4) 图4 状态条中的进程状态格的进程显示

上面我们用一个简单的睡眠函数模拟了耗时过程中状态条的进程状态格的显示情况。在实际应用中我们只需将源码中的OnSomeLongProcess()函数替换成相应的耗时过程函数即可。

(作者地址:武汉华中理工大学电子科学与技术系 430074 收稿日期:1999.5.28)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有