开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1711|回复: 1
收起左侧

[源码分享] VC++中如何使用Progress控件

[复制链接]
结帖率:100% (18/18)
发表于 2013-2-18 08:41:28 | 显示全部楼层 |阅读模式   天津市天津市
Progress控件能让人们感受到一个应用程序执行的进度,在很多应用程序中都能用到它,但 通常只支持在单任务中,在Windows98/NT中文操作系统下,在VC++6.0环境下,利用线程编制了 一个非常小巧的应用程序来实现Progress控件的使用。它可以支持多线程,使用起来很方便。
以下是这个应用程序的源代码:
  1. //ProgressDialog.h
  2. class CProgressDialog : public CDialog
  3. {
  4. // Construction
  5. public:
  6. CProgressDialog(LPCSTR caption, BOOL
  7. enableCancel=TRUE, CWnd* pParent = NULL);
  8. // standard constructor
  9. virtual ~CProgressDialog(void);
  10. // Dialog Data
  11. //{{AFX_DATA(CProgressDialog)
  12. enum { IDD = IDD_PROGRESS_DIALOG };
  13. CStatic
  14. m_MessageStatic; //进程条标题
  15. CButton m_CancelButton; //中止按钮控键
  16. CProgressCtrl
  17. m_ProgressCtrl;
  18. //}}AFX_DATA
  19. CString m_Caption;
  20.   //对话框标题
  21. BOOL m_EnableCancel; //中止按钮显示开关
  22. BOOL m_IsCancel; //中止按钮是 否按下开关
  23. HANDLE m_Thread;
  24.   //线程句柄
  25. static DWORD WINAPI ThreadProc(CProgressDialog* dlg); //静态线程
  26. void SetProgress(int percent) //设置进程位置
  27. { m_ProgressCtrl.SetPos(percent);}
  28. void SetMessage (LPCSTR msg) //设置进程条标题
  29. { m_MessageStatic.SetWindowText(msg);}
  30. BOOL IsCancel(void)
  31. { return m_IsCancel;}
  32. virtual DWORD ProgressProc ()=0;//线程过程纯虚函数
  33. // Overrides
  34. // ClassWizard generated virtual function overrides
  35. //{{AFX_VIRTUAL(CProgressDialog)
  36. protected:
  37. virtual void DoDataExchange(CDataExchange* pDX);
  38.  // DDX/DDV support
  39. //}}AFX_VIRTUAL
  40. // Implementation
  41. protected:
  42. // Generated message map functions
  43. //{{AFX_MSG(CProgressDialog)
  44. virtual BOOL OnInitDialog();
  45. virtual void OnCancel();
  46. virtual void OnOK();
  47. //}}AFX_MSG
  48. DECLARE_MESSAGE_MAP()
  49. };
  50. class CMyProgressDialog:public CProgressDialog {
  51. public:
  52. CMyProgressDialog (LPCSTR caption):CProgressDialog(caption) {}
  53. virtual DWORD ProgressProc(); //继承过程
  54. };
  55. // ProgressDialog.cpp
  56. #include "stdafx.h"
  57. #include "ProgressTest.h"
  58. #include "ProgressDialog.h"
  59. #ifdef _DEBUG
  60. #define new DEBUG_NEW
  61. #undef THIS_FILE
  62. static char THIS_FILE[] = __FILE__;
  63. #endif
  64. CProgressDialog::CProgressDialog(LPCSTR caption, BOOL enableCancel, CWnd* pParent /*=NULL*/) :
  65. CDialog(CProgressDialog::IDD, pParent)
  66. {
  67. // {{AFX_DATA_INIT(CProgressDialog)
  68. m_Caption=caption;
  69. m_EnableCancel=enableCancel;
  70. m_IsCancel=FALSE;
  71. m_Thread=NULL;
  72. //}}AFX_DATA_INIT
  73. }
  74. CProgressDialog::~CProgressDialog(void)
  75. {
  76. if (m_Thread) {
  77. CloseHandle(m_Thread);
  78. }}
  79. void
  80. CProgressDialog::DoDataExchange(CDataExchange* pDX)
  81. {CDialog::DoDataExchange(pDX);
  82. //{{AFX_DATA_MAP(CProgressDialog)
  83. DDX_Control (pDX IDC_MESSAGE_STATIC, m_MessageStatic);
  84. DDX_Control(pDX, IDCANCEL, m_CancelButton);
  85. DDX_Control(pDX, IDC_PROGRESS, m_ProgressCtrl);
  86. //}}AFX_DATA_MAP
  87. }
  88. BEGIN_MESSAGE_MAP (CProgressDialog, CDialog)
  89. //{{AFX_MSG_MAP(CProgressDialog)
  90. //}} AFX_MSG_MAP
  91. END_MESSAGE_MAP()
  92. // CProgressDialog message handlersBOOL CProgressDialog::OnInitDialog()
  93. {
  94. CDialog::OnInitDialog();
  95. // TODO: Add extra initialization here
  96. m_ProgressCtrl.SetRange(0, 100);
  97. m_ProgressCtrl.SetPos(0);
  98. SetWindowText(m_Caption);
  99. if (! m_EnableCancel) {
  100. m_CancelButton.ShowWindow(SW_HIDE);
  101. }
  102. DWORD threadID;
  103. m_Thread=CreateThread(NULL, 0,
  104. (LPTHREAD_START_ROUTINE) CProgressDialog::Thread
  105. Proc,(LPVOID)this,0,&threadID);
  106. return TRUE; // return TRUE unless you set the focus to a control
  107.   // EXCEPTION: OCX Property Pages should return
  108. FALSE
  109. }
  110. DWORD WINAPI
  111. CProgressDialog::ThreadProc(CProgressDialog* dlg)
  112. {DWORD ret=dlg- >ProgressProc();
  113. dlg->PostMessage(WM_COMMAND, IDOK);
  114. return ret;
  115. }
  116. void CProgressDialog::OnCancel()
  117. {
  118. // TODO: Add extra cleanup here
  119. if (m_EnableCancel) m_IsCancel=TRUE;
  120. }
  121. void CProgressDialog::OnOK()
  122. {
  123. // TODO: Add extra validation here
  124. WaitForSingleObject(m_Thread, INFINITE);
  125. CDialog::OnOK();
  126. }DWORD CMyProgressDialog::ProgressProc()
  127. {SetMessage("Progress...");
  128. for (int i=0;i<100;i++) {
  129.  if (IsCancel()) break;
  130. Sleep(100);
  131. SetProgress(i);
  132. }
  133. return 0;
  134. }

复制代码
只需在应用Progress控 件的地方调用CMyProgressDialog类的对象即可。可根据不同的应用程序修改DWORD CMyProgressDialog::ProgressProc()这个继承函数的函数体来适应相应的程序。

发表于 2014-1-26 23:21:22 | 显示全部楼层   山东省聊城市
Make,看的眼疼
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表