最近在实现一个遍历文件夹,并把进度同步显示在进度条上的小程序。因为对MFC还不熟悉, 所以花了几天的时间研究实现遍历文件夹与进度条的同步实现。最简单的一种进度条的实现方法是单线程的,点一下按钮进度条动一下的方式,这种实现步骤如下:
(一)、单线程进度条实现。
首先,添加Progress控件,然后给它添加变量m_pro。其次,添加两个按钮控件:开始、前进。然后,添加两个button事件。
void CDemo05Dlg::OnButton1() //开始按钮
{
// TODO: Add your control notification handler code here
m_pro.SetRange(0,100);
m_pro.SetStep(5);
m_pro.SetPos(10);
}
void CDemo05Dlg::OnButton2() //前进按钮
{
// TODO: Add your control notification handler code here
m_pro.StepIt();
}
(二)、多线程进度条实现:遍历文件夹,同时进度条显示遍历进度。
标题
遍历文件夹是一个可大可小的程序,当遍历的路径中文件个数很多时,遍历全部的文件需要耗很长时间,为了不让用户错误的认为系统进入死机的状态,我们给程序加入进度条。但是如果直接添加进度条,在程序中控制他的进度,结果进度条只向前进一步,仍然像死机状态。那该怎么办呢?原因是,我们处理比较大的计算程序时,程序和进度条显示实在同一个进程中进行的,这样程序会先处理计算程序,导致进度条无法实时更新。
解决办法就是把处理大程序的这段逻辑让一个单独的线程去处理,并利用postmessage或sendmessage给主界面发送消息,让主界面去更新进度条。
具体代码和步骤如下。
首先,文本框、按钮、静态文本框、进度条等控件,然后在cpp文件中定义一个关联事件:
#define WM_UPDATEDATA WM_USER + 1999 //定义事件
BEGIN_MESSAGE_MAP(CDemo05Dlg,CDialog)
ON_MESSAGE(WM_UPDATEDATA,&CDemo05Dlg::OnUpdateData)//让事件与程序关联
END_MESSAGE_MAP
标题
第二步,在头文件中进行函数和变量的声明
afx_msg LRESULT OnUpdateData(WPARAM wParam,LPARAM lParam);
LRESULT onUpdateData(WPARAM wParam,LPARAM lParam);
static