中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > C/C++
VC++中的Progress控件如何使用
作者:mynote  时间:2006-10-04 12:50 出处:CSDN 责编:月夜寒箫
              摘要:VC++中的Progress控件如何使用
 

Progress控件能让人们感受到一个应用程序执行的进度,在很多应用程序中都能用到它,但通常只支持在单任务中,在Windows98/NT中文操作系统下,在VC++6.0环境下,利用线程编制了一个非常小巧的应用程序来实现Progress控件的使用。它可以支持多线程,使用起来很方便。

以下是这个应用程序的源代码:

//ProgressDialog.h
            class CProgressDialog : public CDialog
            {
            // Construction
            public:
            CProgressDialog(LPCSTR caption, BOOL
            enableCancel=TRUE, CWnd* pParent = NULL);
            // standard constructor
            virtual ~CProgressDialog(void);
            // Dialog Data
            //{{AFX_DATA(CProgressDialog)
            enum { IDD = IDD_PROGRESS_DIALOG };
            CStatic
            m_MessageStatic; //进程条标题
            CButton m_CancelButton; //中止按钮控键
            CProgressCtrl
            m_ProgressCtrl;
            //}}AFX_DATA
            CString m_Caption;
              //对话框标题
            BOOL m_EnableCancel; //中止按钮显示开关
            BOOL m_IsCancel; //中止按钮是否按下开关
            HANDLE m_Thread;
              //线程句柄
            static DWORD WINAPI ThreadProc(CProgressDialog* dlg); //静态线程
            void SetProgress(int percent) //设置进程位置
            { m_ProgressCtrl.SetPos(percent);}
            void SetMessage(LPCSTR msg) //设置进程条标题
            { m_MessageStatic.SetWindowText(msg);}
            BOOL IsCancel(void)
            { return m_IsCancel;}
            virtual DWORD ProgressProc()=0;//线程过程纯虚函数
            // Overrides
            // ClassWizard generated virtual function overrides
            //{{AFX_VIRTUAL(CProgressDialog)
            protected:
            virtual void DoDataExchange(CDataExchange* pDX);
             // DDX/DDV support
            //}}AFX_VIRTUAL
            // Implementation
            protected:
            // Generated message map functions
            //{{AFX_MSG(CProgressDialog)
            virtual BOOL OnInitDialog();
            virtual void OnCancel();
            virtual void OnOK();
            //}}AFX_MSG
            DECLARE_MESSAGE_MAP()
            };
            class CMyProgressDialog:public CProgressDialog {
            public:
            CMyProgressDialog(LPCSTR caption):CProgressDialog(caption) {}
            virtual DWORD ProgressProc(); //继承过程
            };
            // ProgressDialog.cpp
            #include "stdafx.h"
            #include "ProgressTest.h"
            #include "ProgressDialog.h"
            #ifdef _DEBUG
            #define new DEBUG_NEW
            #undef THIS_FILE
            static char THIS_FILE[] = __FILE__;
            #endif
            CProgressDialog::CProgressDialog(LPCSTR caption, BOOL enableCancel, CWnd* pParent /*=NULL*/) :
            CDialog(CProgressDialog::IDD, pParent)
            {
            //{{AFX_DATA_INIT(CProgressDialog)
            m_Caption=caption;
            m_EnableCancel=enableCancel;
            m_IsCancel=FALSE;
            m_Thread=NULL;
            //}}AFX_DATA_INIT
            }
            CProgressDialog::~CProgressDialog(void)
            {
            if (m_Thread) {
            CloseHandle(m_Thread);
            }}
            void
            CProgressDialog::DoDataExchange(CDataExchange* pDX)
            {CDialog::DoDataExchange(pDX);
            //{{AFX_DATA_MAP(CProgressDialog)
            DDX_Control (pDX IDC_MESSAGE_STATIC, m_MessageStatic);
            DDX_Control(pDX, IDCANCEL, m_CancelButton);
            DDX_Control(pDX, IDC_PROGRESS, m_ProgressCtrl);
            //}}AFX_DATA_MAP
            }
            BEGIN_MESSAGE_MAP(CProgressDialog, CDialog)
            //{{AFX_MSG_MAP(CProgressDialog)
            //}}AFX_MSG_MAP
            END_MESSAGE_MAP()
            // CProgressDialog message handlersBOOL CProgressDialog::OnInitDialog()
            {
            CDialog::OnInitDialog();
            // TODO: Add extra initialization here
            m_ProgressCtrl.SetRange(0, 100);
            m_ProgressCtrl.SetPos(0);
            SetWindowText(m_Caption);
            if (!m_EnableCancel) {
            m_CancelButton.ShowWindow(SW_HIDE);
            }
            DWORD threadID;
            m_Thread=CreateThread(NULL, 0,
            (LPTHREAD_START_ROUTINE)CProgressDialog::Thread
            Proc,(LPVOID)this,0,&threadID);
            return TRUE; // return TRUE unless you set the focus to a control
              // EXCEPTION: OCX Property Pages should return
            FALSE
            }
            DWORD WINAPI
            CProgressDialog::ThreadProc(CProgressDialog* dlg)
            {DWORD ret=dlg->ProgressProc();
            dlg->PostMessage(WM_COMMAND, IDOK);
            return ret;
            }
            void CProgressDialog::OnCancel()
            {
            // TODO: Add extra cleanup here
            if (m_EnableCancel) m_IsCancel=TRUE;
            }
            void CProgressDialog::OnOK()
            {
            // TODO: Add extra validation here
            WaitForSingleObject(m_Thread, INFINITE);
            CDialog::OnOK();
            }DWORD CMyProgressDialog::ProgressProc()
            {SetMessage("Progress...");
            for (int i=0;i<100;i++) {
             if (IsCancel()) break;
            Sleep(100);
            SetProgress(i);
            }
            return 0;
            }
只需在应用Progress控件的地方调用CMyProgressDialog类的对象即可。可根据不同的应用程序修改DWORD CMyProgressDialog::ProgressProc()这个继承函数的函数体来适应相应的程序。
关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有