Chinaunix首页 | 论坛 | 博客
  • 博客访问: 679130
  • 博文数量: 148
  • 博客积分: 4086
  • 博客等级: 上校
  • 技术积分: 1766
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-06 23:27
文章分类

全部博文(148)

文章存档

2013年(19)

2012年(9)

2011年(106)

2009年(14)

分类: WINDOWS

2011-10-09 19:53:52

CProgressCtrl上显示百分比

用控件的DC直接写就好,我写过的一个,位置设置可以再灵活一些

CString str;
str.Format("%d",(int)(m_volume.dwValue/((m_mxc.Bounds.dwMaximum-m_mxc.Bounds.dwMinimum)/100)));
str+=" of 100";
CDC *dc;
//dc=m_proctl.GetDC();
dc=CShowMeTheVolumeDlg::GetDC();
dc->SetBkMode(TRANSPARENT);
dc->SetTextColor(RGB(255,0,0));
dc->TextOut(65,100,str);

当我们在处理大程序时,常常需要耗很长时间,为了不让用户错误的认为系统已经死机,我们要给程序添加进度条,但是大家知道如果就直接添加进度条,并 在程序里面控制它的进度,往往得到的结果是程序仍然像死机状态,直到处理完毕才显示进度条进度为100%,中间的过程看不到了,那么怎么办呢,是为什么 呢?

原因是我们处理大程序和进度条显示是在同一个线程中进行的,这样往往因为处理大程序导致界面无法实时更新。

解决办法就是把处理大程序的这段逻辑让一个单独的线程在处理,并利用postmessage或sendmessage给主界面发送消息,让主界面去更新。

具体代码实现如下:

首先,定义一个关联事件:

#define WM_UPDATEDATA WM_USER + 1999 //定义事件

BEGIN_MESSAGE_MAP(CBinLogAnalyse, CDialog)
    ON_MESSAGE(WM_UPDATEDATA, &CBinLogAnalyse::OnUpdateData)   //让事件关联程序
END_MESSAGE_MAP()

第二,实现关联程序(返回类型一定要是LRESULT):

LRESULT CBinLogAnalyse::OnUpdateData(WPARAM wParam, LPARAM lParam)
{
    int iTmp = (int)wParam;
    m_process.SetPos(iTmp);//设置进度条的值
    UpdateData(false);//实时更新主界面
    return 0;
}

第三,创建一个独立的线程处理大程序


    m_pMyThread = AfxBeginThread(MyThread, this);//MyThread为该大程序处理的入口函数,this为入口函数的参数
    m_pMyThread = NULL;

第四,实现大程序逻辑

UINT CBinLogAnalyse::MyThread(LPVOID pParam)//注意返回类型为UINT
{
    CBinLogAnalyse *pDlg = (CBinLogAnalyse *)pParam;

    //这里添加计算过程
    char sRtnMsgBuf[MAXPATH];
    memset(sRtnMsgBuf, 0, MAXPATH);
    int iRec = pDlg->ProcessLogFile(pDlg->m_sSaveFile, sRtnMsgBuf, MAXPATH);//调用具体处理大程序的逻辑函数
    return 0;
}

第五,向主线程发送消息让进度条实时更新

int CBinLogAnalyse::ProcessLogFile(const char *pSaveFile, char *pRtnMsgBuf, int ibufLen)
{
    if (NULL == pSaveFile)
    {
        return -1;
    }

    。。。。

   while(。。。)

   {

       。。。。

      //调用进度条实时更新函数实时更新进度条

      setProcess(value);

   }

}

//进度条实时更新函数

void CBinLogAnalyse::setProcess(int value)
{
    SendMessage(WM_UPDATEDATA, value);//向主线程发送消息更新进度条
}

阅读(3099) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~