我要两个进度条上显示不同的文字,在网上找了个进度条类TextProgressCtrl,很好用,能让一个进度条显示文字。我增加了一个进度条,代码作了以下修改,但是没有任何显示,不但没有文字显示,连进度显示都没了,请高手们帮帮忙,帮我找找问题出在哪里。
void CTextProgressCtrl::OnPaint() 
{
    if (m_nMin >= m_nMax) 
        return;
//    CWnd *pWnd1=(CWnd*)GetDlgItem(IDC_PROGRESS1);//这样获取的指针我不知道怎么用?
//    CWnd *pWnd2=(CWnd*)GetDlgItem(IDC_PROGRESS2);//这样获取的指针我不知道怎么用?

CRect LeftRect, RightRect,ClientRect;
CRect rc1,rc2;//  GetClientRect(&rc1);//这样的话两个进度条显示一样的文字
//  GetClientRect(&rc2);//这样的话两个进度条显示一样的文字   GetDlgItem(IDC_PROGRESS1)->GetClientRect(&rc1);//这样的话没任何显示
   GetDlgItem(IDC_PROGRESS2)->GetClientRect(&rc2);//这样的话没任何显示

    CRect *Rect1 = &rc1;
    CRect *Rect2 = &rc2;    double Fraction = (double)(m_nPos - m_nMin) / ((double)(m_nMax - m_nMin));    CPaintDC PaintDC(this); // device context for painting
    CMemDC dc(&PaintDC);    LeftRect = RightRect =ClientRect;
    //获取进度的大小
    LeftRect.right = LeftRect.left + (int)((LeftRect.right - LeftRect.left)*Fraction);
    dc.FillSolidRect(LeftRect, m_colFore);    RightRect.left = LeftRect.right;
    dc.FillSolidRect(RightRect, m_colBk);
    UpdateData(FALSE);
    if (m_bShowText)
    {
        CString str,str2;
        if (m_strText.GetLength())
            str = m_strText;
        else
            str.Format(_T("高度%d米"),_ttoi(ni1));
            str2.Format(_T("重量%d吨"),_ttoi(ni2));
 
        dc.SetBkMode(TRANSPARENT);        CRgn rgn1,rgn2;
       rgn1.CreateRectRgn(Rect1->left,Rect1->top, Rect1->right, Rect1->bottom);
        dc.SelectClipRgn(&rgn1);
//设置颜色
        dc.SetTextColor(m_colTextBk);
//第一个进度条显示文字
        dc.DrawText(str,Rect1, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
        rgn1.DeleteObject();       rgn2.CreateRectRgn(Rect2->left,Rect2->top, Rect2->right, Rect2->bottom);
        dc.SelectClipRgn(&rgn2);
//设置颜色
        dc.SetTextColor(m_colTextBk);
//第二个进度条显示文字
        dc.DrawText(str2,Rect2, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
        rgn2.DeleteObject();
    }
}

解决方案 »

  1.   

    LeftRect = RightRect =ClientRect;
    这里ClientRect的数据从哪里来的?从天而来?也不知道你这个ClientRect到底想记录什么东西的客户区域大小
      

  2.   

    根据你的源码,在CRect LeftRect, RightRect,ClientRect;之后,有GetClientRect(ClientRect);这个应该保留,这样这个变量才有数据,表示对话框客户区的大小。
      

  3.   


    Progress Control with Text
      

  4.   

    3楼的朋友推荐的CProgressCtrl控件非常不错,还有Demo,呵呵学习了,顺便接分.
      

  5.   

    void CTextProgressCtrl::OnPaint() 
    {
        if (m_nMin >= m_nMax) 
            return;
     //   CWnd *pWnd2=(CWnd*)GetDlgItem(IDC_PROGRESS2);
    CRect LeftRect, RightRect,rc1,rc2;
        
     //   GetClientRect(&rc1);
     //   GetClientRect(&rc2);//这样两个进度条显示一样的内容,而且叠加一起
        GetDlgItem(IDC_PROGRESS1)->GetClientRect(&rc1);
        GetDlgItem(IDC_PROGRESS2)->GetClientRect(&rc2);//就这两句有问题,换成这两句就什么都没了

        CRect *Rect1 = &rc1;
        CRect *Rect2 = &rc2;    double Fraction = (double)(m_nPos - m_nMin) / ((double)(m_nMax - m_nMin));    CPaintDC PaintDC(this); // device context for painting
        CMemDC dc(&PaintDC);    LeftRect = RightRect =rc1=rc2;
        //获取进度的大小
        LeftRect.right = LeftRect.left + (int)((LeftRect.right - LeftRect.left)*Fraction);
        dc.FillSolidRect(LeftRect, m_colFore);    RightRect.left = LeftRect.right;
        dc.FillSolidRect(RightRect, m_colBk);
        UpdateData(FALSE);
        if (m_bShowText)
        {
            CString str,str2;
            if (m_strText.GetLength())
                str = m_strText;
            else
                str.Format(_T("高度%d米"),_ttoi(ni1));
                str2.Format(_T("重量%d吨"),_ttoi(ni2));
     
            dc.SetBkMode(TRANSPARENT);        CRgn rgn1;
           rgn1.CreateRectRgn(Rect1->left,Rect1->top, Rect1->right, Rect1->bottom);
            dc.SelectClipRgn(&rgn1);
    //设置颜色
            dc.SetTextColor(m_colTextBk);
    //显示文字
            dc.DrawText(str,rc1, DT_CENTER | DT_VCENTER | DT_SINGLELINE);       rgn1.CreateRectRgn(Rect2->left,Rect2->top, Rect2->right, Rect2->bottom);
            dc.SelectClipRgn(&rgn1);
    //设置颜色
            dc.SetTextColor(m_colTextBk);
    //显示文字
            dc.DrawText(str2,rc2, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
            rgn1.DeleteObject();
        }
    }
      

  6.   

    LeftRect = RightRect =rc1=rc2;
    这啥破程序啊。不动脑的么?前面费劲的得到rc1和rc2,这里又来个这种语句......
      

  7.   

    //GetParent()取dialog
    GetParent()->GetDlgItem(IDC_PROGRESS1)->GetClientRect(&rc1);//这样的话没任何显示
    GetParent()->GetDlgItem(IDC_PROGRESS2)->GetClientRect(&rc2);//这样的话没任何显示
      

  8.   

    //显示文字1
      dc.DrawText(str,rc1, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
    //显示文字2
      dc.DrawText(str2,rc2, DT_CENTER | DT_VCENTER | DT_SINGLELINE);这两句里的参数rc1和rc2分别是什么值?你可以先制定rc1和rc2的值,这样起码可以保证两个文字显示都能正常,然后再考虑如何把两个进度条控件连起来。
      

  9.   

    void CTextProgressCtrl::OnPaint() 
    怎么没有beginpaint()?
      

  10.   

    你是2个控件用一个类,所以问题在于如何区分实例:
    void CMyEdit::OnPaint() 
    { //
    CPaintDC dc(this); // 不能删除!device context for painting = beginpaint()
    UINT ID=GetDlgCtrlID();
    afxDump << ID << "\n";
    //根据不同ID做:
    switch(ID)
    {
    ...
    }
    );
      

  11.   

    另外:
    dc.m_ps.rcPaint就是你要的rect