简介:
本人在加载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.显示