如,我要将一些当前程序的数据打印为PDF,这个过程需要一段时间,需要设置进度条,可以选择一个弹窗式的进度条。
建立共享变量
int m_process;//进度条进度,0-100
CString m_status;//当前程序状态输出文本
首先,创建一个对话框,并建立与其对应的类CJingDuTiao,添加一个进度条控件绑定m_ctrlProgress, 添加一个static用于输出文本。对话框CPP顶端共享上述两个变量
然后在对话框对应的类中添加两个函数:
void CJingDuTiao::OnTimer(UINT nIDEvent)
{
{
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是对话框的一个对象。
这样一个同事处理数据且显示进度条对话框的功能就实现了。