VS2005 的MFC Dialog窗口怎么样在CStatusBar上添加CProgressCtrl

如何在窗口对话框中添加状态栏,然后再状态栏中添加一个进度条。求详细代码... 如何在窗口对话框中添加状态栏,然后再状态栏中添加一个进度条。求详细代码 展开
 我来答
ahcc08
2014-06-30 · 知道合伙人软件行家
ahcc08
知道合伙人软件行家
采纳数:11853 获赞数:51941
拥有丰富的软件开发经验。

向TA提问 私信TA
展开全部
//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)<br>      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)<br>      protected:<br>      virtual void DoDataExchange(CDataExchange * pDX);<br>    // DDX/DDV support<br>    //}}AFX_VIRTUAL
// Implementation
protected:
    // Generated message map functions
    //{{AFX_MSG(CProgressDialog)<br>      virtual BOOL OnInitDialog();<br>      virtual void OnCancel();<br>      virtual void OnOK();<br>    //}}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)<br>      m_Caption=caption;<br>      m_EnableCancel=enableCancel;<br>      m_IsCancel=FALSE;<br>      m_Thread=NULL;<br>    //}}AFX_DATA_INIT
}
CProgressDialog:: ~CProgressDialog(void)
{
      if (m_Thread) {
            CloseHandle(m_Thread);
      }
}
void CProgressDialog::DoDataExchange
    (CDataExchange * pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CProgressDialog)<br>    DDX_Control (pDX IDC_MESSAGE_STATIC,<br> m_MessageStatic);<br>    DDX_Control(pDX, IDCANCEL, m_CancelButton);<br>    DDX_Control(pDX, IDC_PROGRESS, m_ProgressCtrl);<br>    //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CProgressDialog, CDialog)
    //{{AFX_MSG_MAP(CProgressDialog)<br>    //}}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 类 的 对 象 即 可。 可 根 据 不 同 的 应 用 程 序 修 改 DWORD CMyProgressDialog::ProgressProc() 这 个 继 承 函 数 的 函 数 体 来 适 应 相 应 的 程 序
**/
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式