如何获取进度条指针?

ayin669 2010-12-22 10:23:02
我要让2个进度条显示不同文字,网上下了个源代码,是让一个进度条显示文字。我用指针,结果没任何显示。请高手帮帮忙。红色部分是我增加的代码。
void CTextProgressCtrl::OnPaint()
{
if (m_nMin >= m_nMax)
return;
CRect *Rect1=(CRect*)GetDlgItem(IDC_PROGRESS1);
CRect *Rect2=(CRect*)GetDlgItem(IDC_PROGRESS1);

CRect LeftRect, RightRect,ClientRect;
//源代码是GetClientRect(ClientRect);
GetClientRect(Rect1);
GetClientRect(Rect2);


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 = RightRect =Rect1=Rect2;
//获取进度的大小
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;
// 源代码是rgn.CreateRectRgn(ClientRect.left, ClientRect.top,ClientRect.right, ClientRect.bottom);
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(str,Rect2, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
rgn2.DeleteObject();

}
}
...全文
107 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ayin669 2010-12-23
  • 打赏
  • 举报
回复
我这样改的,还是没任何显示。
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;

pWnd1->GetClientRect(&rc1);
pWnd2->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(ClientRect.left, ClientRect.top,ClientRect.right, ClientRect.bottom);
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();
}
}
ayin669 2010-12-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 happyparrot 的回复:]
CWnd *pWnd1=(CWnd*)GetDlgItem(IDC_PROGRESS1);
CWnd *pWnd2=(CWnd*)GetDlgItem(IDC_PROGRESS1);
CRect LeftRect, RightRect,ClientRect;
//源代码是GetClientRect(ClientRect);
CRect rc1,rc2;
GetClientRect……
[/Quote]
*pWnd2 *pWnd1这两个指针怎么和显示关联起来呢?
ayin669 2010-12-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 happyparrot 的回复:]
CRect *Rect1=(CRect*)GetDlgItem(IDC_PROGRESS1);
==这算什么写法?GetDlgItem返回的是CWnd*类型啊,你居然转换成CRect*??????
[/Quote]
呵呵,我是菜鸟啊,那应该怎么用指针呢?
快乐鹦鹉 2010-12-22
  • 打赏
  • 举报
回复
CWnd *pWnd1=(CWnd*)GetDlgItem(IDC_PROGRESS1);
CWnd *pWnd2=(CWnd*)GetDlgItem(IDC_PROGRESS1);
CRect LeftRect, RightRect,ClientRect;
//源代码是GetClientRect(ClientRect);
CRect rc1,rc2;
GetClientRect(&rc1);
GetClientRect(&rc2);
CRect *Rect1 = &rc1;
CRect *Rect2 = &rc2;
快乐鹦鹉 2010-12-22
  • 打赏
  • 举报
回复
CRect *Rect1=(CRect*)GetDlgItem(IDC_PROGRESS1);
==这算什么写法?GetDlgItem返回的是CWnd*类型啊,你居然转换成CRect*??????
ayin669 2010-12-22
  • 打赏
  • 举报
回复
这个 有误,改成2,也没显示。
CRect *Rect2=(CRect*)GetDlgItem(IDC_PROGRESS2);
与大家分享一个Delphi 7自定义单元,完成自定义消息和自定义进度条的显示,效果可参见截图所示。在源代码中,showmessage是弹出消息提示窗口,showprogress是显示进度条,为了更好的看到效果,本示例显示进度条正在运行的状态,进度条和弹出消息框,作者:周劲羽   该单元提供以下几个过程用于显示动态提示窗体:   ShowProgress - 显示进度条窗体   HideProgress - 隐藏进度条窗体   UpdateProgress - 更新当前进度   UpdateProgressTitle - 更新窗体标题   使用方法:在需要显示提示窗口的单元中uses本单元,当需要显示提示信息时直接调用ShowXXXX过程即可。   注意事项:同一时间屏幕上只能显示一个进度窗体,窗体显示时其它所有窗体均不能使用,但显示该窗体的代码仍可以继续运行。   来看一下参数如何定义:   procedure ShowProgress(const Title: string; AMax: Integer = 100; vIsShowProgress: Boolean = false);   {* 显示进度条窗体,参数为窗体标题以及最大值,默认 100(百分比形式),可自定义成其他值}   procedure HideProgress;   {* 关闭进度条窗体}   procedure UpdateProgress(Value: Integer);   {* 更新当前进度,参数为进度值:当 Max 为 100 时可接受范围为 0..100,此时 Value 代表百分比}   procedure UpdateProgressTitle(const Title: string);   {* 更新进度条窗体标题,参数为标题}   procedure UpdateProgressMax(Value: Integer);   {* 更新进度条最大值,参数为新的最大值}   implementation   {$R *.DFM}   var    ProgressForm: TProgressForm = nil; // 进度条窗体实例    FormList: Pointer; // 被禁用的窗体列表指针   详细的单元使用方法,请下载查看源码中的代码文件。

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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