在主程序启动时,显示进度条窗体

由于主程序启动的时候要从服务器端获取一些数据,在等待数据的过程中,时常由于网络速度问题,让客户等待的时间长短不一。为了解决客户反映的卡死情况,我特定在程序启动的时候添加了进度条显示。下面就是我的例子。
 

具体实现的代码:

#pragma once
/
// CShowProgressDlg dialog

class CShowProgressDlg : public CDialog
{
// Construction
public:
 CShowProgressDlg(CWnd* pParent = NULL);   // standard constructor
 virtual ~CShowProgressDlg();
// Dialog Data
 //{{AFX_DATA(CShowProgressDlg)
 enum { IDD = IDD_SHOWPROGRESS_DIALOG };
 CProgressCtrl m_Prgrs_Data;
 CString m_strText;
 //}}AFX_DATA
 void SetText(const char* _Text);
 void StartTimer();
 void EndTimer();

// Overrides
 // ClassWizard generated virtual function overrides
 //{{AFX_VIRTUAL(CShowProgressDlg)
 protected:
 virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
 //}}AFX_VIRTUAL

// Implementation
protected:

 // Generated message map functions
 //{{AFX_MSG(CShowProgressDlg)
 virtual BOOL OnInitDialog();
 afx_msg void OnTimer(UINT nIDEvent);
 virtual void OnOK();
 //}}AFX_MSG
 DECLARE_MESSAGE_MAP()
};

#endif

// ShowProgressDlg.cpp : implementation file
//

#include "stdafx.h"
#include "XXX.h"
#include "ShowProgressDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/
// CShowProgressDlg dialog


CShowProgressDlg::CShowProgressDlg(CWnd* pParent /*=NULL*/)
 : CDialog(CShowProgressDlg::IDD, pParent)
{
 //{{AFX_DATA_INIT(CShowProgressDlg)
 m_strText = _T("");
 //}}AFX_DATA_INIT
}

CShowProgressDlg::~CShowProgressDlg()
{
 DestroyWindow();
}

void CShowProgressDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
 //{{AFX_DATA_MAP(CShowProgressDlg)
 DDX_Control(pDX, IDC_DATAPROGRESS, m_Prgrs_Data);
 DDX_Text(pDX, IDC_STATIC_TEXT, m_strText);
 //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CShowProgressDlg, CDialog)
 //{{AFX_MSG_MAP(CShowProgressDlg)
 ON_WM_TIMER()
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/
// CShowProgressDlg message handlers

BOOL CShowProgressDlg::OnInitDialog()
{
 CDialog::OnInitDialog();
 
 // TODO: Add extra initialization here
 m_Prgrs_Data.SetRange(0,100);
 m_Prgrs_Data.SetStep(5);
 m_Prgrs_Data.SetPos(0);
 
 return TRUE;  // return TRUE unless you set the focus to a control
               // EXCEPTION: OCX Property Pages should return FALSE
}

void CShowProgressDlg::OnTimer(UINT nIDEvent)
{
 // TODO: Add your message handler code here and/or call default
 UpdateData();
 if(nIDEvent == 1)
 {
  if(m_Prgrs_Data.StepIt() > 100)
   m_Prgrs_Data.SetPos(0);
 }
 UpdateData(FALSE);
 CDialog::OnTimer(nIDEvent);
}

void CShowProgressDlg::OnOK()
{
 // TODO: Add extra validation here
// CDialog::OnOK();
}

void CShowProgressDlg::StartTimer()
{
 m_Prgrs_Data.SetPos(0);
 SetTimer(1,1000,NULL);
}

void CShowProgressDlg::EndTimer()
{
 KillTimer(1);
}

void CShowProgressDlg::SetText(const char* _Text)
{
 m_strText = _Text;
 UpdateData(FALSE);
}


#pragma once

#include "ShowProgressDlg.h"
/
// CShowProgressThread thread

class CShowProgressThread : public CWinThread
{
 DECLARE_DYNCREATE(CShowProgressThread)
protected:
 CShowProgressThread();           // protected constructor used by dynamic creation

// Attributes
public:

// Operations
public:
 void HideDialog();
// Overrides
 // ClassWizard generated virtual function overrides
 //{{AFX_VIRTUAL(CShowProgressThread)
 public:
 virtual BOOL InitInstance();
 virtual int ExitInstance();
 //}}AFX_VIRTUAL

// Implementation
protected:
 virtual ~CShowProgressThread();

 CShowProgressDlg* m_pShowProgrsDlg;

 // Generated message map functions
 //{{AFX_MSG(CShowProgressThread)
  // NOTE - the ClassWizard will add and remove member functions here.
 //}}AFX_MSG

 DECLARE_MESSAGE_MAP()
};

#endif

#include "stdafx.h"
#include "XXX.h"
#include "ShowProgressThread.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/
// CShowProgressThread

IMPLEMENT_DYNCREATE(CShowProgressThread, CWinThread)

CShowProgressThread::CShowProgressThread()
{
 m_bAutoDelete = TRUE;
}

CShowProgressThread::~CShowProgressThread()
{
}

BOOL CShowProgressThread::InitInstance()
{
 // TODO:  perform and per-thread initialization here
 ::AttachThreadInput(m_nThreadID, AfxGetApp()->m_nThreadID, TRUE);
 m_pShowProgrsDlg = new CShowProgressDlg;
 m_pShowProgrsDlg->Create(IDD_SHOWPROGRESS_DIALOG);
 m_pShowProgrsDlg->ShowWindow(SW_SHOW);
 m_pShowProgrsDlg->SetText("正在获取数据,请稍等片刻...");
 m_pShowProgrsDlg->StartTimer();
 return TRUE;
}

int CShowProgressThread::ExitInstance()
{
 // TODO:  perform any per-thread cleanup here
    delete m_pShowProgrsDlg;
 m_pShowProgrsDlg = NULL;
 return CWinThread::ExitInstance();
}

BEGIN_MESSAGE_MAP(CShowProgressThread, CWinThread)
 //{{AFX_MSG_MAP(CShowProgressThread)
  // NOTE - the ClassWizard will add and remove mapping macros here.
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/
// CShowProgressThread message handlers
void CShowProgressThread::HideDialog()
{
 m_pShowProgrsDlg->SendMessage(WM_CLOSE);
}

在APP.h文件里添加下面这几句:

#include "ShowProgressThread.h"

class CXXXApp : public CWinApp
{
public:
 CShowProgressThread* m_pShowThread;

}

然后再在App.cpp文件里添加下面这几句:

BOOL CXXXApp::InitInstance()
{
m_pShowThread = (CShowProgressThread*) AfxBeginThread(
   RUNTIME_CLASS(CShowProgressThread),
   THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
  ASSERT(m_pShowThread->IsKindOf(RUNTIME_CLASS(CShowProgressThread)));
  m_pShowThread->ResumeThread();
  Sleep(1);

CSingleDocTemplate* pDocTemplate;
  pDocTemplate = new CSingleDocTemplate(
   IDR_MAINFRAME,
   RUNTIME_CLASS(CXXXDoc),
   RUNTIME_CLASS(CMainFrame),       // main SDI frame window
   RUNTIME_CLASS(CXXXView));
  AddDocTemplate(pDocTemplate);

................

m_pMainWnd->ShowWindow(SW_SHOW);
  m_pMainWnd->UpdateWindow();

  if(m_pShowThread)
   m_pShowThread->HideDialog();
}

int CXXXApp::ExitInstance()
{
 // TODO: Add your specialized code here and/or call the base class
 if(m_pShowThread)
  m_pShowThread->PostThreadMessage(WM_QUIT,0,0);
 return CWinApp::ExitInstance();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值