• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 談VC++中的Progress 控件的使用

    發表于:2007-07-04來源:作者:點擊數: 標簽:
    大連捷通電腦技術有限公司 王 淼 Progress 控件能讓人們感受到一個應用程序執行的進度,在很多應用程序中都能用到它,但通常只支持在單任務中,我在 Windows 98/NT 中文操作系統下,在VC ++6.0 環境下,利用線程編制了一個非常小巧的應用程序來實現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(CProgress
    Dialog *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 handlers
    BOOL 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::ThreadProc,
          (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 類的對象即可??筛鶕煌膽贸绦蛐薷腄WORD CMyProgressDialog::ProgressProc() 這個繼承函數的函數體來適應相應的程序?! ?/p>

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>