progress.cxx
上传用户:hzhsqp
上传日期:2007-01-06
资源大小:1600k
文件大小:4k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * progress.cxx
  3.  *
  4.  * Progress bar control.
  5.  *
  6.  * Portable Windows Library
  7.  *
  8.  * Copyright (c) 1993-1998 Equivalence Pty. Ltd.
  9.  *
  10.  * The contents of this file are subject to the Mozilla Public License
  11.  * Version 1.0 (the "License"); you may not use this file except in
  12.  * compliance with the License. You may obtain a copy of the License at
  13.  * http://www.mozilla.org/MPL/
  14.  *
  15.  * Software distributed under the License is distributed on an "AS IS"
  16.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  17.  * the License for the specific language governing rights and limitations
  18.  * under the License.
  19.  *
  20.  * The Original Code is Portable Windows Library.
  21.  *
  22.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  23.  *
  24.  * Portions are Copyright (C) 1993 Free Software Foundation, Inc.
  25.  * All Rights Reserved.
  26.  *
  27.  * Contributor(s): ______________________________________.
  28.  *
  29.  * $Log: progress.cxx,v $
  30.  * Revision 1.6  1998/12/20 09:14:42  robertj
  31.  * Added pragma implementation for GNU compiler.
  32.  *
  33.  * Revision 1.5  1998/11/30 04:52:16  robertj
  34.  * New directory structure
  35.  *
  36.  * Revision 1.4  1998/09/23 06:29:40  robertj
  37.  * Added open source copyright license.
  38.  *
  39.  */
  40. #ifdef __GNUC__
  41. #pragma implementation "progress.h"
  42. #endif
  43. #include <pwlib.h>
  44. #include <pwclib/progress.h>
  45. PProgressMeter::PProgressMeter(PInteractor * parent,
  46.                           unsigned theMin,
  47.                           unsigned theMax,
  48.       BOOL percentFlag)
  49.   : PControl(parent, PNotifier(), NULL),
  50.     minimum(theMin),
  51.     maximum(theMax),
  52.     value(0),
  53.     showPercent(percentFlag)
  54. {
  55.   SetDimensions(100, 12, LocalCoords);
  56.   SetForegroundColour(PColour::Blue);
  57.   SetBackgroundColour(owner->GetButtonBkColour());
  58. }
  59. PProgressMeter::PProgressMeter(PInteractorLayout * parent,
  60.                                PRESOURCE_ID ctlID,
  61.                                const PNotifier & notify,
  62.                                void * valuePtr)
  63.   : PControl(parent, ctlID, notify, valuePtr),
  64.     minimum(0),
  65.     maximum(100),
  66.     value(0),
  67.     showPercent(TRUE)
  68. {
  69.   SetForegroundColour(PColour::Blue);
  70.   SetBackgroundColour(owner->GetButtonBkColour());
  71. }
  72. void PProgressMeter::SetValue(unsigned newValue, BOOL update)
  73. {
  74.   unsigned int v = PMAX(minimum, PMIN(maximum, newValue));
  75.   if (v != value) {
  76.     value = v;
  77.     Invalidate();
  78.     if (update)
  79.       Update();
  80.   }
  81. }
  82. unsigned PProgressMeter::GetValue() const
  83. {
  84.   return value;
  85. }
  86. unsigned PProgressMeter::GetMin() const
  87. {
  88.   return minimum;
  89. }
  90. void PProgressMeter::SetMin(unsigned newMin) 
  91. {
  92.   minimum = newMin;
  93. }
  94. unsigned PProgressMeter::GetMax() const
  95. {
  96.   return maximum;
  97. }
  98. void PProgressMeter::SetMax(unsigned newMax) 
  99. {
  100.   maximum = newMax;
  101. }
  102. void PProgressMeter::OnRedraw(PCanvas & canvas)
  103. {
  104.   PRect bounds(GetDrawingBounds(LocalCoords));
  105.   PColour fg = GetForegroundColour();
  106.   PColour bg = GetBackgroundColour();
  107.   canvas.SetFillFgColour(PColour::Clear);
  108.   canvas.DrawBevelledRect(bounds, FALSE, TRUE);
  109.   bounds.Inflate(-1, -1);
  110.   PORDINATE pos = bounds.Left() +
  111.                     (bounds.Width() * (value - minimum)) / (maximum - minimum);
  112.   PRect done(bounds), notDone(bounds);
  113.   done.SetRight(pos);
  114.   notDone.SetLeft(PMIN(notDone.Right(), pos));
  115.   canvas.SetFillFgColour(bg);
  116.   canvas.FillRect(notDone);
  117.   canvas.SetFillFgColour(fg);
  118.   canvas.FillRect(done);
  119.   if (showPercent) {
  120.     unsigned long percentage = (100 * (value - minimum)) / (maximum - minimum);
  121.     PString str(PString::Printf, "%i%%", percentage);
  122.     canvas.SetTextBkColour(PColour::Clear);
  123.     // draw left side 
  124.     canvas.SetClipRect(done);
  125.     canvas.SetTextFgColour(bg);
  126.     canvas.DrawString(bounds, str, PCanvas::Centred | PCanvas::CentreVertical);
  127.     // draw right side 
  128.     canvas.SetClipRect(notDone);
  129.     canvas.SetTextFgColour(fg);
  130.     canvas.DrawString(bounds, str, PCanvas::Centred | PCanvas::CentreVertical);
  131.   }
  132. }