方法一:不创建新的进程

1、拖一个progress control控件在对话框上,将该控件的Marquee属性设为True。在添加两个Button控件。如下图所示:

axios 控制进度条_axios 控制进度条

2、给控件添加个变量m_progress,再添加int 型的变量m_nCount.


3、启动定时器:SetTimer(1,10,NULL)。


<pre class="cpp" name="code">void CProgressDlg ::OnBnClickedButtonStart()
{
                 // TODO: 在此添加控件通知处理程序代码
                SetTimer(1,10, NULL);
}





4、添加消息处理函数。



在对话框属性栏中,点击属性,添加WM_TIMER消息函数,如下图所示:



axios 控制进度条_VS2015_02



void CProgressDlg ::OnTimer(UINT_PTR nIDEvent)
{
                 // TODO: 在此添加消息处理程序代码和/或调用默认值

                m_Progress.SetPos(m_nCount);

                 /*if (4 == m_nCount)
                {
                                m_nCount = 1;
                }
                else
                {
                                m_nCount ++;
                }*/

                 CDialogEx::OnTimer(nIDEvent );
}



5、销毁定时器,KillTimer()。


给结束按钮添加事件。


void CProgressDlg ::OnBnClickedButtonEnd()
{
                 // TODO: 在此添加控件通知处理程序代码

                KillTimer(1);
}





方法二:创建工作者线程。


创建工作者线程的步骤:


(1),先编写一个与应用程序的其余部分并行运行的函数Fun1()。


(2),定义一个指向CWinThread对象的指针变量*pThread。


(3),调用AfxBeginThread(Fun1,pParam,Priority)函数。


(4),函数返回值赋给pThread变量,同时一并启动Fun1函数。




效果图:




axios 控制进度条_进度条_03


1、先添加好相应的控件Progress Control和Static Text控件,再添加相应控件的变量m_MyProcess


2、编写函数Fun1:


UINT MyThread(LPVOID pParam)
{
                 CMyThreadDlg *pDlg = (CMyThreadDlg *)pParam;
                 CProgressCtrl *pPro = &pDlg->m_MyProcess;
                 for (int i = 1; i <=100; ++i)
                {
                                i++;
                                pPro->SetPos(i);
                                 CString s;
                                s.Format( _T("%d%%" ), i);
                                pDlg->m_MyStatic.SetWindowTextW(s);
                                Sleep(100);
                }
                 return 0;
}



3、调用AfxBeginThread(Fun1,pParam,Priority)函数。


void CMyThreadDlg ::OnBnClickedOk()
{
                 // TODO: 在此添加控件通知处理程序代码

                AfxBeginThread(MyThread, ( LPVOID)this );

                 //CDialogEx::OnOK();
}



方法三:创建用户界面线程


创建用户界面线程步骤:


(1)从CWinThread类派生一个类,并用DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE来声明和实现这个派生类,重载该派生类的成员函数InitInstance()和ExitInstance().


(2)插入一个对话框资源,在对话框中添加进度条控件并添加该控件的变量,然后创建该对话框类。


(3)在第一步中派生的类中的成员函数InitInstance()进行初始化要创建对象的线程实例。


(4)调用AfxBeginThread函数。


点击图一的开始按钮,弹出图二对话框,一个进度条在走。效果图:



axios 控制进度条_VS2015_04



1、CWinThread类派生一个类MyThreadPS,在类视图中,右击打开类向导界面,点击添加类的下拉箭头,选择MFC类,给类取个名字,基类选择CWinThread。其中用DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE来声明和实现的这个过程是自动实现的。

axios 控制进度条_axios 控制进度条_05


2、插入对话框资源。在插入的对话框右击添加类和添加变量。


3、给插入的对话框添加Progress Control控件。


4、在类MyThreadPS的成员函数InitInstance()进行初始化。(m_Dlg是MyUIThread类对象。)


BOOL MyThreadPS ::InitInstance()
{
                 // TODO:    在此执行任意逐线程初始化
                
                m_Dlg.Create( IDD_DIALOG1);
                m_Dlg.ShowWindow( SW_SHOW);
                m_pMainWnd = &m_Dlg;
                SetTimer(GetActiveWindow(), 1, 10, NULL);//启动定时器
                 return TRUE ;
}

int MyThreadPS ::ExitInstance()
{
                 // TODO:    在此执行任意逐线程清理
                m_Dlg.DestroyWindow();
                 return CWinThread ::ExitInstance();
}



5、添加WM_TIMER消息函数

voidMyUIThread::OnTimer(UINT_PTRnIDEvent)
{
                 // TODO: 在此添加消息处理程序代码和/或调用默认值
                m_MyPro.SetPos(m_nCount);

                 CDialogEx::OnTimer(nIDEvent );
}



6、调用AfxBeginThread函数,在主界面的按钮添加一下代码:

void CMyThreadDlg ::OnBnClickedOk()  
 {  
 // TODO: 在此添加控件通知处理程序代码  
 CWinThread *pThread = AfxBeginThread(RUNTIME_CLASS (MyThreadPS));  

 }