您的位置:首页 > 编程语言 > C语言/C++

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

2016-03-07 08:09 525 查看
方法一:不创建新的进程

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

}
[align=left]
[/align]


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  进度条 mfc C++ VS2015