代码改变世界

CProgressCtrl 进度条显示百分比

2014-12-18 00:14  sylar_liang  阅读(1443)  评论(0编辑  收藏  举报

1.资源添加CProgressCtrl,添加变量m_proCtrl。

2.添加类CMyProCtrl

1)添加3个成员变量

    COLORREF m_colPro; // 进度条颜色
    COLORREF m_colBlank; // 空白区域颜色
    COLORREF m_colText; // 文字颜色

2)重写WM_PAINT函数

void CMyProCtrl::OnPaint()
{
    //CPaintDC dc(this); // device context for painting

    // TODO: 在此处添加消息处理程序代码
    // 不为绘图消息调用 CProgressCtrl::OnPaint()

    PAINTSTRUCT ps;
    CDC *pdc = BeginPaint(&ps);

    // 获取进度
    int curPos = GetPos();
    // 字体
    CString strText;
    strText.Format(_T("%d%%"),curPos); // 如 10%
    // 获取客户区大小
    CRect rc;
    GetClientRect(&rc);
    // 获取文字大小
    CSize csText = pdc->GetTextExtent(strText);
    // 设置文字的x,y
    int nX = (rc.Width() - csText.cx)/2;
    int nY = (rc.Height() - csText.cy)/2;
    // 设置背景模式
    pdc->SetBkMode(TRANSPARENT); // 透明

    int max,min;
    GetRange(min,max); // 获取范围大小
    // 每一宽度所占比例:
    double every = (double)rc.Width()/(max-min);
    int now = every * curPos;

    // 设置进度条、空白区域
    CRect rcLeft,rcRight; // left 进度条; right 空白区域
    rcLeft = rcRight= rc;
    rcLeft.right = now;
    rcRight.left = now;

    // 填充颜色
    pdc->FillRect(rcLeft,&(CBrush)m_colPro); // 进度条颜色
    pdc->FillRect(rcRight,&(CBrush)m_colBlank); //空白区域
    
    // 设置文本颜色
    pdc->SetTextColor(m_colText);

    // 输出文本
    pdc->TextOut(nX,nY,strText);
    
    ReleaseDC(pdc);
    EndPaint(&ps);
}

3.把CProgressCtrl类型改为CMyProCtrl。

4.OnInitDialog中添加定时器

SetTimer(0,100,NULL);

5.重载WM_TIMER函数

void CCProgressCtrl1Dlg::OnTimer(UINT_PTR nIDEvent)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值

    int pos = m_proCtrl.GetPos();
    m_proCtrl.SetPos(pos+1);

    CDialogEx::OnTimer(nIDEvent);
}