ProgressDlg.cpp
上传用户:hmc_gdtv
上传日期:2013-08-04
资源大小:798k
文件大小:5k
源码类别:

Windows Mobile

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 2001,2002,2003 Mike Matsnev.  All Rights Reserved.
  3.  *
  4.  * Redistribution and use in source and binary forms, with or without
  5.  * modification, are permitted provided that the following conditions
  6.  * are met:
  7.  *
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice immediately at the beginning of the file, without modification,
  10.  *    this list of conditions, and the following disclaimer.
  11.  * 2. Redistributions in binary form must reproduce the above copyright
  12.  *    notice, this list of conditions and the following disclaimer in the
  13.  *    documentation and/or other materials provided with the distribution.
  14.  * 3. Absolutely no warranty of function or purpose is made by the author
  15.  *    Mike Matsnev.
  16.  *
  17.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  18.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  19.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  20.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  21.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  22.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  23.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  24.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  25.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  26.  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27.  * 
  28.  * $Id: ProgressDlg.cpp,v 1.16.2.1 2003/04/12 22:52:33 mike Exp $
  29.  * 
  30.  */
  31. #include <afxwin.h>
  32. #include <afxtempl.h>
  33. #include "resource.h"
  34. #include "ptr.h"
  35. #include "ProgressDlg.h"
  36. #include "config.h"
  37. #ifdef _DEBUG
  38. #define new DEBUG_NEW
  39. #undef THIS_FILE
  40. static char THIS_FILE[] = __FILE__;
  41. #endif
  42. #define SHOWDELAY 700
  43. #define MINUPDATE 500
  44. /////////////////////////////////////////////////////////////////////////////
  45. // CProgressDlg dialog
  46. CProgressDlg::CProgressDlg(const CString& msg,CWnd* pParent /*=NULL*/)
  47. : CDialog(CProgressDlg::IDD, pParent), m_msg(msg), m_last(0), m_tail(0), m_nsamp(0),
  48.   m_curbytes(0), m_lastbytes(0), m_lastupdate(0)
  49. {
  50. #if POCKETPC
  51.   m_bFullScreen=false;
  52. #endif
  53.   Create(CProgressDlg::IDD, pParent);
  54.   CenterWindow();
  55.   m_starttime=GetTickCount();
  56.   m_visible=false;
  57.   //{{AFX_DATA_INIT(CProgressDlg)
  58.   // NOTE: the ClassWizard will add member initialization here
  59.   //}}AFX_DATA_INIT
  60. }
  61. void CProgressDlg::DoDataExchange(CDataExchange* pDX)
  62. {
  63.   CDialog::DoDataExchange(pDX);
  64.   //{{AFX_DATA_MAP(CProgressDlg)
  65.   // NOTE: the ClassWizard will add DDX and DDV calls here
  66.   //}}AFX_DATA_MAP
  67. }
  68. void CProgressDlg::SetMax(DWORD max) {
  69.   SendDlgItemMessage(IDC_PROGRESS,PBM_SETRANGE32,0,max);
  70.   m_starttime=GetTickCount();
  71. }
  72. void CProgressDlg::SetCur(DWORD cur) {
  73.   if (cur>m_last) {
  74.     m_last=(cur+65535)&~65535;
  75.     SendDlgItemMessage(IDC_PROGRESS,PBM_SETPOS,cur);
  76.     DWORD   tm=GetTickCount();
  77.     DWORD   delta=cur-m_lastbytes;
  78.     m_lastbytes=cur;
  79.     // delete older samples
  80.     while (m_nsamp>0 && (tm-m_samples[m_tail<<1]>1000 || m_nsamp==MAXSAMP)) {
  81.       m_curbytes-=m_samples[(m_tail<<1)+1];
  82.       if (++m_tail>=MAXSAMP)
  83. m_tail=0;
  84.       --m_nsamp;
  85.     }
  86.     // append last sample
  87.     DWORD   pos=m_tail+m_nsamp;
  88.     if (pos>=MAXSAMP)
  89.       pos-=MAXSAMP;
  90.     m_samples[pos<<1]=tm;
  91.     m_samples[(pos<<1)+1]=delta;
  92.     m_curbytes+=delta;
  93.     ++m_nsamp;
  94.     if (!m_visible && tm-m_starttime>SHOWDELAY) {
  95.       m_visible=true;
  96.       ShowWindow(SW_SHOW);
  97.       UpdateWindow();
  98.     }
  99.     if (m_visible && tm-m_lastupdate>MINUPDATE) { // calculate speed
  100.       DWORD   timedelta=tm-m_samples[m_tail<<1];
  101.       DWORD   speed=0;
  102.       if (timedelta>0)
  103. speed=(DWORD)(((__int64)m_curbytes*1000/timedelta)>>10);
  104.       TCHAR   buf[128];
  105.       _sntprintf(buf,sizeof(buf)/sizeof(TCHAR),_T("%d KB  %d KB/s"),cur>>10,speed);
  106.       SetDlgItemText(IDC_PROGRESSTEXT,buf);
  107.       GetDlgItem(IDC_PROGRESSTEXT)->UpdateWindow();
  108.       m_lastupdate=tm;
  109.     }
  110.   }
  111. }
  112. BEGIN_MESSAGE_MAP(CProgressDlg, CDialog)
  113. //{{AFX_MSG_MAP(CProgressDlg)
  114. //}}AFX_MSG_MAP
  115. #if POCKETPC
  116. ON_WM_SETTINGCHANGE()
  117. #endif
  118. END_MESSAGE_MAP()
  119. /////////////////////////////////////////////////////////////////////////////
  120. // CProgressDlg message handlers
  121. BOOL CProgressDlg::OnInitDialog() {
  122.   CDialog::OnInitDialog();
  123.   
  124.   CString   msg;
  125.   msg.Format(_T("Loading %s..."),m_msg);
  126.   SetWindowText(msg);
  127.   return TRUE;
  128. }
  129. #if POCKETPC
  130. void CProgressDlg::OnSettingChange(UINT uFlags,LPCTSTR lpszSection) {
  131.   CWnd::OnSettingChange(uFlags,lpszSection);
  132. }
  133. #endif