00001
00002
00003
00004
00005 #include "ProgressBarDLG.h"
00006
00007
00008 #ifdef _DEBUG
00009 #define new DEBUG_NEW
00010 #undef THIS_FILE
00011 static char THIS_FILE[] = __FILE__;
00012 #endif
00013
00014
00015 using namespace jbxwl;
00016
00017
00018
00020
00021
00022
00023 CProgressBarDLG::CProgressBarDLG(LPCTSTR tname, BOOL dispatch, CWnd* pParent)
00024 : CDialog(CProgressBarDLG::IDD, pParent)
00025 {
00026
00027
00028
00029
00030 Init();
00031
00032 dialogID = CProgressBarDLG::IDD;
00033 pWnd = pParent;
00034 progBar = NULL;
00035 gmax = PROGRESS_COUNTERMAX;
00036 title = tname;
00037 enableDisPatcher = dispatch;
00038 }
00039
00040
00041
00042 CProgressBarDLG::CProgressBarDLG(UINT nIDTemplate, LPCTSTR tname, BOOL dispatch, CWnd* pParent)
00043 : CDialog(nIDTemplate, pParent)
00044 {
00045 Init();
00046
00047 dialogID = nIDTemplate;
00048 pWnd = pParent;
00049 progBar = NULL;
00050 gmax = PROGRESS_COUNTERMAX;
00051 title = tname;
00052 enableDisPatcher = dispatch;
00053 }
00054
00055
00056
00057 CProgressBarDLG::CProgressBarDLG(CProgressBarDLG* counter, LPCTSTR tname, BOOL dispatch)
00058 {
00059 Init();
00060
00061 parent = counter;
00062 title = tname;
00063 enableDisPatcher = dispatch;
00064 }
00065
00066
00067
00068 CProgressBarDLG::~CProgressBarDLG()
00069 {
00070 if (child !=NULL) delete child;
00071 if (parent!=NULL) parent->child = NULL;
00072 Stop();
00073 }
00074
00075
00076
00077 void CProgressBarDLG::Init()
00078 {
00079 dialogID = 0;
00080 pWnd = NULL;
00081 progBar = NULL;
00082
00083 max = 0;
00084 fill = 0;
00085 pos = 0;
00086
00087 gmax = 0;
00088 base = 0;
00089 grate = 1.0;
00090 lrate = 1.0;
00091 prate = 1.0;
00092 parent = NULL;
00093 child = NULL;
00094 title = _T("");
00095 enableDisPatcher = TRUE;
00096 }
00097
00098
00099
00100 void CProgressBarDLG::Clear()
00101 {
00102 title = _T("");
00103 base = 0;
00104 grate = 1.0;
00105 lrate = 1.0;
00106 prate = 1.0;
00107
00108 max = 0;
00109 fill = 0;
00110 pos = 0;
00111
00112 if (child!=NULL) delete child;
00113 child = NULL;
00114
00115 if (progBar!=NULL) progBar->SetPos(0);
00116 }
00117
00118
00119
00120 BOOL CProgressBarDLG::OnInitDialog()
00121 {
00122 if (parent==NULL) {
00123
00124
00125
00126 if (progBar==NULL) progBar = (CProgressCtrl*)GetDlgItem(IDC_PROGBAR_M);
00127
00128 }
00129 return TRUE;
00130 }
00131
00132
00133
00134 void CProgressBarDLG::DoDataExchange(CDataExchange* pDX)
00135 {
00136 CDialog::DoDataExchange(pDX);
00137
00138
00139
00140 }
00141
00142
00143
00144 BEGIN_MESSAGE_MAP(CProgressBarDLG, CDialog)
00145
00146
00147 END_MESSAGE_MAP()
00148
00149
00150
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163 CVCounter* CProgressBarDLG::MakeChildCounter(int m)
00164 {
00165 if (m<=0) return NULL;
00166 ResetRate(m, m);
00167
00168 child = new CProgressBarDLG(this, (LPCTSTR)title, enableDisPatcher);
00169 child->SetMax(m);
00170 return (CVCounter*)child;
00171 }
00172
00173
00174
00175
00176
00177 void CProgressBarDLG::DeleteChildCounter()
00178 {
00179 PutFill();
00180 if (child!=NULL) delete child;
00181 child = NULL;
00182 }
00183
00184
00185
00186
00187
00188
00189
00190
00191 CVCounter* CProgressBarDLG::GetUsableCounter()
00192 {
00193 if (child==NULL) return (CVCounter*)this;
00194 else return child->GetUsableCounter();
00195 }
00196
00197
00198
00199
00200
00201 void CProgressBarDLG::SetMax(int num)
00202 {
00203 if (num<=0) return;
00204
00205 if (gmax==0) gmax = num;
00206 grate = (double)gmax/(double)num;
00207 fill = max = num;
00208 }
00209
00210
00211
00212
00213
00214
00215 void CProgressBarDLG::Start(int m, char* tn)
00216 {
00217 cancel = false;
00218
00219 if (parent==NULL) {
00220 this->Create(dialogID, pWnd);
00221 this->ShowWindow(SW_SHOW);
00222
00223 if (tn!=NULL) title = mbs2ts(tn);
00224 if (!title.IsEmpty()) SetWindowText(title);
00225 start = true;
00226
00227 if (progBar!=NULL) {
00228 progBar->SetPos(0);
00229 progBar->SetRange((short)0, (short)PROGRESS_COUNTERMAX);
00230 progBar->SetStep(1);
00231 }
00232 }
00233 SetMax(m);
00234 }
00235
00236
00237
00238
00239
00240 void CProgressBarDLG::Stop()
00241 {
00242 max = 0;
00243 pos = 0;
00244 fill = 0;
00245 base = 0;
00246 grate = 1.0;
00247 lrate = 1.0;
00248 title = _T("");
00249 cancel = false;
00250 start = false;
00251
00252 if (parent==NULL) {
00253 DestroyWindow();
00254
00255 }
00256 }
00257
00258
00259
00260
00261
00262 void CProgressBarDLG::SetTitle(char* tn)
00263 {
00264 if (tn!=NULL) title = mbs2ts(tn);
00265
00266 if (parent!=NULL) {
00267 parent->SetTitle(tn);
00268 }
00269 else {
00270 if (start) SetWindowText(title);
00271 }
00272 }
00273
00274
00275
00276
00277
00278
00279
00280
00281 void CProgressBarDLG::PutFill()
00282 {
00283 pos = fill;
00284 int mem = base + (int)(grate*lrate*pos + 0.5);
00285
00286 if (parent!=NULL) {
00287 parent->SetPos(mem);
00288 }
00289 else {
00290 progBar->SetPos(mem);
00291 }
00292
00293 if (enableDisPatcher) DisPatcher();
00294 }
00295
00296
00297
00298
00299
00300
00301
00302 void CProgressBarDLG::ResetRate(int rng, int num)
00303 {
00304 if (rng<=0 || num<0) return;
00305 if (num==0) num = 1;
00306
00307 base = base + (int)(pos*lrate*grate + 0.5);
00308 lrate = (double)rng/(double)num;
00309 pos = 0;
00310 fill = num;
00311 }
00312
00313
00314
00315 void CProgressBarDLG::StepIt(int n)
00316 {
00317 pos += n;
00318 int mem = base + (int)(grate*lrate*pos + 0.5);
00319
00320 if (parent!=NULL) {
00321 parent->SetPos(mem);
00322 }
00323 else {
00324 progBar->SetPos(mem);
00325 }
00326
00327 if (enableDisPatcher) DisPatcher();
00328 }
00329
00330
00331
00332 void CProgressBarDLG::SetPos(int num)
00333 {
00334 if ((int)(lrate*num)>fill) return;
00335
00336 pos = num;
00337 int mem = base + (int)(grate*lrate*pos + 0.5);
00338
00339 if (parent!=NULL) {
00340 parent->SetPos(mem);
00341 }
00342 else {
00343 progBar->SetPos(mem);
00344 }
00345
00346 if (enableDisPatcher) DisPatcher();
00347 }
00348
00349
00350
00351 bool CProgressBarDLG::isCanceled()
00352 {
00353 if (parent==NULL) return cancel;
00354 else return parent->isCanceled();
00355 }
00356
00357
00358
00359
00360
00361 BOOL CProgressBarDLG::OnCommand(WPARAM wParam, LPARAM lParam)
00362 {
00363 if (wParam==IDCANCEL) cancel = true;
00364
00365 return CDialog::OnCommand(wParam, lParam);
00366 }
00367