360 lines
8.9 KiB
ObjectPascal
360 lines
8.9 KiB
ObjectPascal
unit KOLProgBar;
|
|
|
|
interface
|
|
|
|
uses
|
|
Windows, Messages, KOL;
|
|
|
|
type
|
|
|
|
TBevel = (bvUp, bvDown, bvNone);
|
|
|
|
PColorProgBar =^TColorProgBar;
|
|
TColorProgressBar = PColorProgBar;
|
|
TColorProgBar = object(TObj)
|
|
private
|
|
{ Private declarations }
|
|
fControl : PControl;
|
|
fPosition: integer;
|
|
fOldPosit: integer;
|
|
fBColor,
|
|
fFColor : TColor;
|
|
fFirst : boolean;
|
|
fBorder : integer;
|
|
fParentCl: boolean;
|
|
fBevel : TBevel;
|
|
fMin,
|
|
fMax : integer;
|
|
fStr : string;
|
|
fFont : PGraphicTool;
|
|
fCanvas : PCanvas;
|
|
OldWind,
|
|
NewWind : longint;
|
|
procedure SetFColor(C: TColor);
|
|
procedure SetBColor(C: TColor);
|
|
procedure SetPos(P: integer);
|
|
procedure SetBorder(B: integer);
|
|
procedure SetParentCl(B: boolean);
|
|
procedure SetBevel(B: TBevel);
|
|
procedure SetMin(M: integer);
|
|
procedure SetMax(M: integer);
|
|
protected
|
|
{ Protected declarations }
|
|
procedure NewWndProc(var Msg: TMessage);
|
|
procedure Paint;
|
|
{ procedure WMPaint(var Msg: TMessage); message WM_PAINT;
|
|
procedure WMSize (var Msg: TMessage); message WM_SIZE;
|
|
procedure WMActiv(var Msg: TMessage); message WM_SHOWWINDOW;
|
|
procedure CMParCl(var Msg: TMessage); message CM_PARENTCOLORCHANGED;}
|
|
public
|
|
destructor Destroy; virtual;
|
|
function SetPosition(X, Y: integer): PColorProgBar; overload;
|
|
function SetSize(X, Y: integer): PColorProgBar; overload;
|
|
function SetAlign(A: TControlAlign): PColorProgBar; overload;
|
|
function GetFont: PGraphicTool;
|
|
{ Public declarations }
|
|
{ constructor Create(Owner: TControl); override;}
|
|
property Font: PGraphicTool read GetFont;
|
|
property FColor: TColor read fFColor write SetFColor;
|
|
property BColor: TColor read fBColor write SetBColor;
|
|
property Border: integer read fBorder write SetBorder;
|
|
property Position: integer read fPosition write SetPos;
|
|
property Max: integer read fMax write SetMax;
|
|
property Min: integer read fMin write SetMin;
|
|
property ParentColor: boolean read fParentCl write SetParentCl;
|
|
property Bevel: TBevel read fBevel write SetBevel;
|
|
end;
|
|
|
|
function NewTColorProgressBar(AOwner: PControl): PColorProgBar;
|
|
|
|
implementation
|
|
|
|
uses objects;
|
|
|
|
function NewTColorProgressBar;
|
|
var p: PColorProgBar;
|
|
c: PControl;
|
|
begin
|
|
{ New(Result, Create);}
|
|
c := pointer(_NewControl( AOwner, 'STATIC', WS_VISIBLE or WS_CHILD or
|
|
SS_LEFTNOWORDWRAP or SS_NOPREFIX or SS_NOTIFY,
|
|
False, nil ));
|
|
c.CreateWindow;
|
|
New(p, create);
|
|
AOwner.Add2AutoFree(p);
|
|
p.fControl := c;
|
|
p.fFont := NewFont;
|
|
p.fCanvas := NewCanvas(GetDC(c.Handle));
|
|
p.fMin := 0;
|
|
p.fMax := 100;
|
|
p.fFColor := clRed;
|
|
p.fBColor := clBtnFace;
|
|
p.fBorder := 4;
|
|
p.fBevel := bvDown;
|
|
p.fFirst := True;
|
|
p.fPosition := 50;
|
|
p.fFont.FontStyle := [fsBold];
|
|
Result := p;
|
|
p.OldWind := GetWindowLong(c.Handle, GWL_WNDPROC);
|
|
p.NewWind := LongInt(MakeObjectInstance(p.NewWndProc));
|
|
SetWindowLong(c.Handle, GWL_WNDPROC, p.NewWind);
|
|
end;
|
|
|
|
destructor TColorProgBar.Destroy;
|
|
begin
|
|
SetWindowLong(fControl.Handle, GWL_WNDPROC, OldWind);
|
|
FreeObjectInstance(Pointer(NewWind));
|
|
fCanvas.Free;
|
|
fFont.Free;
|
|
inherited;
|
|
end;
|
|
|
|
function TColorProgBar.SetPosition(X, Y: integer): PColorProgBar;
|
|
begin
|
|
fControl.Left := X;
|
|
fControl.Top := Y;
|
|
Result := @self;
|
|
end;
|
|
|
|
function TColorProgBar.SetSize(X, Y: integer): PColorProgBar;
|
|
begin
|
|
fControl.Width := X;
|
|
fControl.Height := Y;
|
|
Result := @self;
|
|
end;
|
|
|
|
function TColorProgBar.SetAlign(A: TControlAlign): PColorProgBar;
|
|
begin
|
|
fControl.Align := A;
|
|
Result := @self;
|
|
end;
|
|
|
|
function TColorProgBar.GetFont;
|
|
begin
|
|
Result := fFont;
|
|
end;
|
|
|
|
|
|
procedure TColorProgBar.NewWndProc;
|
|
begin
|
|
Msg.Result := CallWindowProc(Pointer(OldWind), fControl.Handle, Msg.Msg, Msg.wParam, Msg.lParam);
|
|
case Msg.Msg of
|
|
WM_PAINT: Paint;
|
|
WM_SIZE: begin
|
|
fFirst := True;
|
|
Paint;
|
|
end;
|
|
WM_ACTIVATE:
|
|
begin
|
|
fFirst := True;
|
|
Paint;
|
|
end;
|
|
{CM_PARENTCOLORCHANGED:
|
|
begin
|
|
if fParentCl then begin
|
|
if Msg.wParam <> 0 then
|
|
BColor := TColor(Msg.lParam) else
|
|
BColor := (Parent as TForm).Color;
|
|
FColor := (Parent as TForm).Font.Color;
|
|
end;
|
|
end;}
|
|
end;
|
|
end;
|
|
|
|
procedure TColorProgBar.SetFColor;
|
|
begin
|
|
fFColor := C;
|
|
fFirst := True;
|
|
Paint;
|
|
end;
|
|
|
|
procedure TColorProgBar.SetBColor;
|
|
begin
|
|
fBColor := C;
|
|
fFirst := True;
|
|
Paint;
|
|
end;
|
|
|
|
procedure TColorProgBar.SetPos;
|
|
begin
|
|
fPosition := P;
|
|
Paint;
|
|
end;
|
|
|
|
procedure TColorProgBar.SetBorder;
|
|
begin
|
|
fBorder := B;
|
|
fFirst := True;
|
|
Paint;
|
|
end;
|
|
|
|
procedure TColorProgBar.SetParentCl;
|
|
begin
|
|
fParentCl := B;
|
|
if B then begin
|
|
{ Perform(CM_PARENTCOLORCHANGED, 0, 0);}
|
|
Paint;
|
|
end;
|
|
end;
|
|
|
|
procedure TColorProgBar.SetBevel;
|
|
begin
|
|
fBevel := B;
|
|
fFirst := True;
|
|
Paint;
|
|
end;
|
|
|
|
procedure TColorProgBar.SetMin;
|
|
begin
|
|
fMin := M;
|
|
fFirst := True;
|
|
if fMax = fMin then fMax := fMin + 1;
|
|
Paint;
|
|
end;
|
|
|
|
procedure TColorProgBar.SetMax;
|
|
begin
|
|
fMax := M;
|
|
fFirst := True;
|
|
if fMin = fMax then fMin := fMax - 1;
|
|
Paint;
|
|
end;
|
|
|
|
procedure Frame3D(Canvas: PCanvas; var Rect: TRect; TopColor, BottomColor: TColor;
|
|
Width: Integer);
|
|
|
|
procedure DoRect;
|
|
var
|
|
TopRight, BottomLeft: TPoint;
|
|
begin
|
|
with Canvas^, Rect do
|
|
begin
|
|
TopRight.X := Right;
|
|
TopRight.Y := Top;
|
|
BottomLeft.X := Left;
|
|
BottomLeft.Y := Bottom;
|
|
Pen.Color := TopColor;
|
|
PolyLine([BottomLeft, TopLeft, TopRight]);
|
|
Pen.Color := BottomColor;
|
|
Dec(BottomLeft.X);
|
|
PolyLine([TopRight, BottomRight, BottomLeft]);
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
Dec(Rect.Bottom); Dec(Rect.Right);
|
|
while Width > 0 do
|
|
begin
|
|
Dec(Width);
|
|
DoRect;
|
|
InflateRect(Rect, -1, -1);
|
|
end;
|
|
Inc(Rect.Bottom); Inc(Rect.Right);
|
|
end;
|
|
|
|
function ColorToRGB(Color: TColor): Longint;
|
|
begin
|
|
if Color < 0 then
|
|
Result := GetSysColor(Color and $000000FF) else
|
|
Result := Color;
|
|
end;
|
|
|
|
procedure TColorProgBar.Paint;
|
|
var Rct: TRect;
|
|
Trc: TRect;
|
|
Twk: TRect;
|
|
Str: string;
|
|
Rht: integer;
|
|
Len: integer;
|
|
Rgn: HRgn;
|
|
Stw: integer;
|
|
begin
|
|
GetClientRect(fControl.Handle, Rct);
|
|
Trc := Rct;
|
|
if (fPosition <= fOldPosit) or fFirst then begin
|
|
case fBevel of
|
|
bvUp: begin
|
|
Frame3D(fCanvas, Rct, clWhite, clBlack, 1);
|
|
end;
|
|
bvDown: begin
|
|
Frame3D(fCanvas, Rct, clBlack, clWhite, 1);
|
|
end;
|
|
end;
|
|
|
|
fFirst := False;
|
|
fCanvas.brush.Color := fBColor;
|
|
fCanvas.FillRect(Rct);
|
|
end;
|
|
Rct := Trc;
|
|
|
|
InflateRect(Rct, -fBorder, -fBorder);
|
|
Rct.Right := Rct.Left + (Rct.Right - Rct.Left) * fPosition div (Max - Min);
|
|
|
|
Str := ' ' + int2str(fPosition * 100 div (fMax - fMin)) + '% ';
|
|
|
|
SelectObject(fCanvas.Handle, fFont.Handle);
|
|
Stw := fCanvas.TextWidth(Str);
|
|
Trc.Left := (fControl.width - Stw) div 2;
|
|
Trc.Right := (fControl.width + Stw) div 2 + 1;
|
|
Twk := Rct;
|
|
|
|
fCanvas.brush.Color := fFColor;
|
|
if (Rct.Right <= Trc.Left) then begin
|
|
fCanvas.FillRect(Rct);
|
|
end else begin
|
|
Twk.Right := Trc.Left;
|
|
fCanvas.FillRect(Twk);
|
|
end;
|
|
|
|
Rht := Rct.Right;
|
|
Len := Length(Str);
|
|
|
|
Rct.Left := (fControl.width - Stw) div 2;
|
|
Rct.Right := (fControl.width + Stw) div 2 + 1;
|
|
|
|
if fStr <> Str then begin
|
|
if (Rct.Right > Rht) or (fCanvas.TextHeight(Str) > (Rct.Bottom - Rct.Top)) then begin
|
|
Rgn := CreateRectRgn(Rht, Rct.Top, Rct.Right, Rct.Bottom);
|
|
SelectClipRgn(fCanvas.Handle, Rgn);
|
|
SelectObject(fCanvas.Handle, fFont.Handle);
|
|
SetBkColor(fCanvas.Handle, ColorToRGB(fBColor));
|
|
SetTextColor(fCanvas.Handle, ColorToRGB(fFColor));
|
|
DrawText(fCanvas.Handle, @Str[1], Len, Rct, DT_TOP or DT_NOCLIP);
|
|
SelectClipRgn(fCanvas.Handle, 0);
|
|
DeleteObject(Rgn);
|
|
end;
|
|
end;
|
|
|
|
if Rht < Rct.Right then begin
|
|
Rct.Right := Rht;
|
|
end;
|
|
|
|
Dec(Rct.Left);
|
|
Inc(Rct.Right);
|
|
|
|
if (Rct.Right > Rct.Left) then begin
|
|
SelectObject(fCanvas.Handle, fFont.Handle);
|
|
SetBkColor(fCanvas.Handle, ColorToRGB(fFColor));
|
|
SetTextColor(fCanvas.Handle, ColorToRGB(fBColor));
|
|
DrawText(fCanvas.Handle, @Str[1], Len, Rct, DT_TOP);
|
|
if Rct.Right < Trc.Right then begin
|
|
Twk := Rct;
|
|
Twk.Top := Twk.Top + fCanvas.TextHeight(Str);
|
|
fCanvas.brush.Color := fFColor;
|
|
fCanvas.Fillrect(Twk);
|
|
end;
|
|
end;
|
|
|
|
if (Rct.Right >= Trc.Right) then begin
|
|
Rct.Left := Trc.Right - 2;
|
|
Rct.Right := Rht;
|
|
SetBkColor(fCanvas.Handle, ColorToRGB(fFColor));
|
|
fCanvas.FillRect(Rct);
|
|
end;
|
|
|
|
fStr := Str;
|
|
fOldPosit := fPosition;
|
|
end;
|
|
|
|
end.
|