进度条上显示文字?

loveclt 2010-12-23 10:14:47
我要两个进度条上显示不同的文字,在网上找了个进度条类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();
}
}
...全文
1147 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2010-12-24
  • 打赏
  • 举报
回复
另外:
dc.m_ps.rcPaint就是你要的rect
schlafenhamster 2010-12-23
  • 打赏
  • 举报
回复
//GetParent()取dialog
GetParent()->GetDlgItem(IDC_PROGRESS1)->GetClientRect(&rc1);//这样的话没任何显示
GetParent()->GetDlgItem(IDC_PROGRESS2)->GetClientRect(&rc2);//这样的话没任何显示
fangchao918628 2010-12-23
  • 打赏
  • 举报
回复
自绘进度条是对于所有的进度条来说的......,LZ,如果设置不同的显示文字。直接写个函数来接收文字啊,你这样写,很乱................
loveclt 2010-12-23
  • 打赏
  • 举报
回复
呵呵,我是搞硬件的,软件实在。。。。。。。
快乐鹦鹉 2010-12-23
  • 打赏
  • 举报
回复
LeftRect = RightRect =rc1=rc2;
这啥破程序啊。不动脑的么?前面费劲的得到rc1和rc2,这里又来个这种语句......
快乐鹦鹉 2010-12-23
  • 打赏
  • 举报
回复
简直无法沟通......
loveclt 2010-12-23
  • 打赏
  • 举报
回复
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();
}
}
zhxingway 2010-12-23
  • 打赏
  • 举报
回复
3楼的朋友推荐的CProgressCtrl控件非常不错,还有Demo,呵呵

学习了,顺便接分.
Eleven 2010-12-23
  • 打赏
  • 举报
回复
快乐鹦鹉 2010-12-23
  • 打赏
  • 举报
回复
根据你的源码,在CRect LeftRect, RightRect,ClientRect;之后,有GetClientRect(ClientRect);这个应该保留,这样这个变量才有数据,表示对话框客户区的大小。
快乐鹦鹉 2010-12-23
  • 打赏
  • 举报
回复
LeftRect = RightRect =ClientRect;
这里ClientRect的数据从哪里来的?从天而来?也不知道你这个ClientRect到底想记录什么东西的客户区域大小
schlafenhamster 2010-12-23
  • 打赏
  • 举报
回复
你是2个控件用一个类,所以问题在于如何区分实例:
void CMyEdit::OnPaint()
{ //
CPaintDC dc(this); // 不能删除!device context for painting = beginpaint()
UINT ID=GetDlgCtrlID();
afxDump << ID << "\n";
//根据不同ID做:
switch(ID)
{
...
}
);
schlafenhamster 2010-12-23
  • 打赏
  • 举报
回复
void CTextProgressCtrl::OnPaint()
怎么没有beginpaint()?
Jimmy_Xia 2010-12-23
  • 打赏
  • 举报
回复
//显示文字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的值,这样起码可以保证两个文字显示都能正常,然后再考虑如何把两个进度条控件连起来。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧