CProgressCtrl进度条

简介:

  本人在加载log文件时,由于文件很大,导致读取时间很长,所以就想是否可以有个进度条提醒呢?当然大家也可运用到开机进度条中。


1.首先创建一个含有进度条对话框

放入在控件中添加进度条,编辑框,静态文本,调整对话框的水平和数值大小,如下所示:



2.添加类

右键类向导,添加对话框类。

3.另一个对话框调用

public:
	CProgressBarDlg *m_pProgressBarDlg;        //对话框引用,放在调用此进度条对话框的其它类或者对话框中

可以放在OnInitDialog()或者其它调用的地方即可

	m_pProgressBarDlg = new CProgressBarDlg();        //非模态
 	m_pProgressBarDlg->Create(IDD_ProgressBar_DIALOG); 
  	m_pProgressBarDlg->ShowWindow(SW_HIDE); 
  	::SetWindowPos(m_pProgressBarDlg->m_hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);  //根据对话框的位置来显示

4.单独开个线程调用进度条

首先忽略一下代码,我讲一下方法,两个对话框通信,最科学的方法是需要通过PostMessage或SendMessage来传递数据。

例如:第三个变量就是进度条的值,不断改变,WM_ProBar是定义的消息标志。大家如果这里不懂,借助网络搜一下,会有很多自定义消息案例。

::PostMessage(g_pLogReadDlgWnd->m_pProgressBarDlg->m_hWnd, WM_ProBar,i, 0);  //发送消息


AfxBeginThread(Thread_ProgressBar, this); //开启一个线程


//进度条
UINT Thread_ProgressBar( LPVOID pParam )
{
	int nPos = 0;

 	g_pLogReadDlgWnd->m_pProgressBarDlg->ShowWindow(SW_SHOW);

	if (g_vLogThreadFlag == 1)
	{
		::PostMessage(g_pLogReadDlgWnd->m_pProgressBarDlg->m_hWnd, WM_ProBar,100, 0);
		Sleep(1000);
	}
	while (!g_vLogThreadFlag)
	{
		for (int i = 0; i < 100; i ++)
		{
			if (g_vLogThreadFlag == 1)
			{
				
				::PostMessage(g_pLogReadDlgWnd->m_pProgressBarDlg->m_hWnd, WM_ProBar,100, 0);
				Sleep(1000);
				break;
			}
			int nRet = ::PostMessage(g_pLogReadDlgWnd->m_pProgressBarDlg->m_hWnd, WM_ProBar,i, 0);
			Sleep(100);  //100ms,进度条数加1,可修改时间

			//特大文件提示,10超时
			if (i == 99)
			{
				//AfxMessageBox("文件过大,请耐心等候!");
				if (IDOK == AfxMessageBox("文件过大,请耐心等候!", MB_OK))
				{
					while (!g_vLogThreadFlag)
					{
						::PostMessage(g_pLogReadDlgWnd->m_ProgressBarDlg.m_hWnd, WM_ProBar,i, 0);
					}
					::PostMessage(g_pLogReadDlgWnd->m_pProgressBarDlg->m_hWnd, WM_ProBar,100, 0);
					Sleep(1000);
								
				}

			}
			
		}
		break;
  	}

        g_pLogReadDlgWnd->m_pProgressBarDlg->ShowWindow(SW_HIDE);
	return TRUE;
}


5.进度条类响应消息函数

LRESULT CProgressBarDlg::OnProBar(WPARAM wParam, LPARAM lParam)
{
	int nPos = (int)wParam;    //读取传过来的值

	m_ProgressBar.SetPos(nPos);
	CString str;
	str.Format("%d",nPos);
	str += "%";              //编辑框百分比显示
	SetDlgItemText(IDC_EDIT_ProgressBar,str);


	return wParam;
}


6.注意

1)以上方法优点是可以很直观的显示数据是否完全读取,进度条是模拟出来的,开始和结束时很准的。

2)缺点是中间过程无法完全根据程序读取速度来显示进度条。

3)使用进度条也可以不用发送消息的方法,可使用SetPos()或者不用创建进度条对话框,直接new CProgressBar。不过要做复杂的进度条界面显示会比较棘手。

3)对于所有new的地方,结束时就要delete,然后赋值NULL,防止野指针。


7.显示




猜你喜欢

转载自blog.csdn.net/C_gyl/article/details/66970874