MyProgress.cpp
上传用户:szcysw
上传日期:2013-03-11
资源大小:6752k
文件大小:2k
源码类别:

界面编程

开发平台:

Visual C++

  1. // MyProgress.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "MyProgress.h"
  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #undef THIS_FILE
  8. static char THIS_FILE[] = __FILE__;
  9. #endif
  10. /////////////////////////////////////////////////////////////////////////////
  11. // MyProgress
  12. MyProgress::MyProgress()
  13. {
  14. //初始化位图资源
  15. bmpresource=0;
  16. //清空进度条标题
  17. barTitle.Empty();
  18. }
  19. MyProgress::~MyProgress()
  20. {
  21. }
  22. BEGIN_MESSAGE_MAP(MyProgress, CProgressCtrl)
  23. //{{AFX_MSG_MAP(MyProgress)
  24. ON_WM_PAINT()
  25. ON_WM_CREATE()
  26. //}}AFX_MSG_MAP
  27. END_MESSAGE_MAP()
  28. /////////////////////////////////////////////////////////////////////////////
  29. // MyProgress message handlers
  30. void MyProgress::OnPaint() 
  31. {
  32. //进度条的上下文环境句柄
  33. CPaintDC dc(this);
  34. int pos=GetPos();
  35. int low,hight;
  36. low=hight=0;
  37. GetRange(low,hight);
  38. int range=hight-low;
  39. //得到当前进度(%)
  40. float percent=float(pos)/(float)range;
  41. CRect rect;
  42. GetClientRect(&rect);
  43. rect.right=rect.left+percent*rect.Width();
  44. //根据进度填充矩形
  45. dc.FillSolidRect(&rect,RGB(0,0,255));
  46. //如果需要在进度条上绘制动画
  47. if(bmpresource)
  48. {
  49. CBitmap bmp,bmpold;
  50. BITMAP bmpinfo;
  51. bmp.LoadBitmap(bmpresource);
  52. bmp.GetBitmap(&bmpinfo);
  53. CDC mem;
  54. mem.CreateCompatibleDC(&dc);
  55. mem.SelectObject(&bmp);
  56. //在正确位置绘制图片
  57. CRect rectbmp;
  58. GetClientRect(&rectbmp);
  59. rectbmp.right=rectbmp.left+percent*rectbmp.Width();
  60. dc.BitBlt(rectbmp.right-bmpinfo.bmWidth,0,bmpinfo.bmWidth,bmpinfo.bmHeight,&mem,0,0,SRCCOPY);
  61. //还原DC设置
  62. mem.SelectObject(&bmpold);
  63. }
  64. //如果需要在进度条上输出文本
  65. if(!barTitle.IsEmpty())
  66. {
  67. CRect rt;
  68. GetClientRect(&rt);
  69. //文本输出方式为透明
  70. dc.SetBkMode(TRANSPARENT);
  71. //文本默认色为白色
  72. dc.SetTextColor(RGB(255,255,255));
  73. CSize ext;
  74. //GetTextExtent:测试文本尺寸
  75. ext=dc.GetTextExtent(barTitle);
  76. int test=(rt.Width()-ext.cx)/2;
  77. if((percent*rt.Width())<test)
  78. //如果进度条还在文本左边,使用蓝色文本
  79. dc.SetTextColor(RGB(0,0,255));
  80. //输出进度条的文本标题
  81. dc.DrawText(barTitle, rt, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
  82. }
  83. }
  84. int MyProgress::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  85. {
  86. if (CProgressCtrl::OnCreate(lpCreateStruct) == -1)
  87. return -1;
  88. return 0;
  89. }
  90. void MyProgress::SetBarCaption(CString title)
  91. {
  92. barTitle=title;
  93. //开始重绘
  94. Invalidate();
  95. }
  96. void MyProgress::SetBmp(DWORD bmp)
  97. {
  98. bmpresource=bmp;
  99. //开始重绘
  100. Invalidate();
  101. }