创建滚动进度条的几种方法

方法一:不创建新的进程

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

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消息函数,如下图所示:

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函数。

效果图:
1、先添加好相应的控件Progress Control和Static Text控件,再添加相应控件的变量m_MyProcess 和m_MyStatic。
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函数。
点击图一的开始按钮,弹出图二对话框,一个进度条在走。效果图:

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


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));

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烟云之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值