您的位置:首页 > 其它

MFC多线程对话框显示进度和状态

2017-01-24 09:58 816 查看
如,我要将一些当前程序的数据打印为PDF,这个过程需要一段时间,需要设置进度条,可以选择一个弹窗式的进度条。
 建立共享变量
int m_process;//进度条进度,0-100
CString m_status;//当前程序状态输出文本

首先,创建一个对话框,并建立与其对应的类CJingDuTiao,添加一个进度条控件绑定m_ctrlProgress, 添加一个static用于输出文本。对话框CPP顶端共享上述两个变量
然后在对话框对应的类中添加两个函数:
void CJingDuTiao::OnTimer(UINT nIDEvent)
{
 
if(m_process==100)
{
OnOK();
}
else if(m_process!=0)
{
m_progress.SetPos(m_process);
if (((CStatic*)GetDlgItem(IDC_STATUS))->GetSafeHwnd())  
{  
CStatic* pStatic = (CStatic*)GetDlgItem(IDC_STATUS);  
ASSERT(pStatic);  

  
CRect rc;  
pStatic->GetWindowRect(&rc);  
ScreenToClient(&rc);  
InvalidateRect(&rc);  
}  
SetDlgItemText(IDC_STATUS,m_status);
}
CDialogEx::OnTimer(nIDEvent);

}

BOOL CJingDuTiao::OnInitDialog()

{
CDialogEx::OnInitDialog();

// TODO:  在此添加额外的初始化
KillTimer(1);
SetTimer(1,20,NULL);
return TRUE;  // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE

}

再在主程序(MainFrm)中添加两个子进程需要处理的函数,注意要在.h中USING namespace std后声明UINT   PrintPdf_thread(LPVOID pParam);
如:
void C单腔模拟View::PrintPdf(int print_pic_each,int print_pic_all, int print_sheet, int print_property)

{
{
 for(int i = 0; i < 1000; i++)
{
  m_process++;
  Sleep(50);
  }
m_process = 100;
return 0;
}
这个函数(function)是用来控制进度条变化的函数。
UINT PrintPdf_thread(LPVOID pParam)
{

C单腔模拟View* pInfo2=(C单腔模拟View*)pParam;
pInfo2->PrintPdf(print_pic_each,print_pic_all,print_sheet,print_property);

 return 0;
}
 
最后在需要运动进度条的地方添加
AfxBeginThread(PrintPdf_thread,this);//申请一个进程来执行function1,也就是主程序处理代码。
 if(dlg1.DoModal()==IDOK)//模态显示对话框,此时主程序代码执行到此,不往下执行,直至对话框关闭,但是两个
{
需等待print结束之后运行的代码
}
//子进程始终在运行中。
其中dlg1是对话框的一个对象。
这样一个同事处理数据且显示进度条对话框的功能就实现了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  多线程 对话框 mfc pdf