452 lines
10 KiB
Plaintext
452 lines
10 KiB
Plaintext
(* ImageEn Build 7.0.0.06.2637 @ 7-4-17 14:58:42.679 *)
|
|
(*
|
|
Copyright (c) 1998-2017 by Carlotta Calandra. All rights reserved.
|
|
Copyright (c) 2011-2017 by Xequte Software.
|
|
|
|
This software comes without express or implied warranty.
|
|
In no case shall the author be liable for any damage or unwanted behavior of any
|
|
computer hardware and/or software.
|
|
|
|
Author grants you the right to include the component
|
|
in your application, whether COMMERCIAL, SHAREWARE, or FREEWARE.
|
|
|
|
ImageEn, IEvolution and ImageEn ActiveX may not be included in any
|
|
commercial, shareware or freeware libraries or components.
|
|
|
|
www.ImageEn.com
|
|
*)
|
|
|
|
(*
|
|
File version 1003
|
|
*)
|
|
|
|
unit iegradientbar;
|
|
|
|
{$R-}
|
|
{$Q-}
|
|
|
|
{$I ie.inc}
|
|
|
|
interface
|
|
|
|
uses
|
|
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, ImageEnProc, hyiedefs, iegdiplus;
|
|
|
|
type
|
|
|
|
// automatic mouse interactions
|
|
{!!
|
|
<FS>TIEMouseInteractItemsGr
|
|
|
|
<FM>Declaration<FC>
|
|
}
|
|
TIEMouseInteractItemsGr = ( migDragGrip );
|
|
{!!}
|
|
|
|
{!!
|
|
<FS>TIEMouseInteractGr
|
|
|
|
<FM>Declaration<FC>
|
|
type TIEMouseInteractGr = set of <A TIEMouseInteractItemsGr>;
|
|
!!}
|
|
TIEMouseInteractGr = set of TIEMouseInteractItemsGr;
|
|
|
|
{!!
|
|
<FS>TIEGradientBar
|
|
|
|
<FM>Description<FN>
|
|
TIEGradientBar component shows a gradient bar, with a grip with which the user can select a color or an index.
|
|
|
|
<FM>Methods and Properties<FN>
|
|
<TABLE2>
|
|
<R> <C_IMG_PUBLISHED> <C><A TIEGradientBar.BeginColor></C> </R>
|
|
<R> <C_IMG_PROPERTY> <C><A TIEGradientBar.Color></C> </R>
|
|
<R> <C_IMG_PROPERTY> <C><A TIEGradientBar.ColorIndex></C> </R>
|
|
<R> <C_IMG_PUBLISHED> <C><A TIEGradientBar.Direction></C> </R>
|
|
<R> <C_IMG_PUBLISHED> <C><A TIEGradientBar.EndColor></C> </R>
|
|
<R> <C_IMG_PUBLISHED> <C><A TIEGradientBar.MouseInteract></C> </R>
|
|
<R> <C_IMG_PROPERTY> <C><A TIEGradientBar.RGB></C> </R>
|
|
</TABLE>
|
|
|
|
<FM>Events<FN>
|
|
<TABLE2>
|
|
<R> <C_IMG_EVENT> <C><A TIEGradientBar.OnChange></C> </R>
|
|
</TABLE>
|
|
!!}
|
|
{$ifdef IEHASPLATFORMATTRIBUTE}
|
|
[ComponentPlatformsAttribute(pidWin32 or pidWin64)]
|
|
{$endif}
|
|
TIEGradientBar = class(TCustomControl)
|
|
private
|
|
{ Private declarations }
|
|
fColorIndex: integer;
|
|
fBeginColor: TColor;
|
|
fEndColor: TColor;
|
|
fGradient: array[0..255] of TColor;
|
|
fDirection: TIEGradientDir;
|
|
fOnChange: TNotifyEvent;
|
|
fMouseInteract: TIEMouseInteractGr;
|
|
procedure SetColorIndex(v: integer);
|
|
procedure SetBeginColor(v: TColor);
|
|
procedure SetEndColor(v: TColor);
|
|
function GetColor: TColor;
|
|
function GetRGB: TRGB;
|
|
procedure SetDirection(v: TIEGradientDir);
|
|
procedure SetMouseInteractGr(v: TIEMouseInteractGr);
|
|
function GetMouseInteractGr: TIEMouseInteractGr;
|
|
protected
|
|
{ Protected declarations }
|
|
procedure WMSize(var Message: TWMSize); message WM_SIZE;
|
|
procedure WMEraseBkgnd(var Message: TMessage); message WM_ERASEBKGND;
|
|
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
|
|
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
|
|
procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
|
|
procedure CalcGradient;
|
|
procedure DrawGrip;
|
|
public
|
|
{ Public declarations }
|
|
procedure Paint; override;
|
|
constructor Create(Owner: TComponent); override;
|
|
destructor Destroy; override;
|
|
property ColorIndex: integer read fColorIndex write SetColorIndex;
|
|
property Color: TColor read GetColor;
|
|
property RGB: TRGB read GetRGB;
|
|
published
|
|
{ Published declarations }
|
|
property BeginColor: TColor read fBeginColor write SetBeginColor default clBlack;
|
|
property EndColor: TColor read fEndColor write SetEndColor default clWhite;
|
|
property Direction: TIEGradientDir read fDirection write SetDirection default gdVertical;
|
|
|
|
{!!
|
|
<FS>TIEGradientBar.OnChange
|
|
|
|
<FM>Declaration<FC>
|
|
property OnChange: TNotifyEvent;
|
|
|
|
<FM>Description<FN>
|
|
Occurs when the user selects a color.
|
|
!!}
|
|
property OnChange: TNotifyEvent read fOnChange write fOnChange;
|
|
|
|
property MouseInteract: TIEMouseInteractGr read GetMouseInteractGr write SetmouseInteractGr default [migDragGrip];
|
|
property Width default 40;
|
|
property Height default 300;
|
|
property Align;
|
|
property DragCursor;
|
|
property DragMode;
|
|
property Enabled;
|
|
property ParentShowHint;
|
|
property PopupMenu;
|
|
property ShowHint;
|
|
property Visible;
|
|
property OnClick;
|
|
property OnDblClick;
|
|
property OnDragDrop;
|
|
property OnDragOver;
|
|
property OnEndDrag;
|
|
property OnMouseDown;
|
|
property OnMouseMove;
|
|
property OnMouseUp;
|
|
property OnStartDrag;
|
|
property OnContextPopup;
|
|
end;
|
|
|
|
implementation
|
|
|
|
uses
|
|
hyieutils;
|
|
|
|
{$R-}
|
|
|
|
constructor TIEGradientBar.Create(Owner: TComponent);
|
|
begin
|
|
inherited Create(Owner);
|
|
ControlStyle := ControlStyle + [csOpaque, csAcceptsControls];
|
|
Height := 300;
|
|
Width := 40;
|
|
fColorIndex := 0;
|
|
fBeginColor := clBlack;
|
|
fEndColor := clWhite;
|
|
fDirection := gdVertical;
|
|
fMouseInteract := [migDragGrip];
|
|
CalcGradient;
|
|
end;
|
|
|
|
destructor TIEGradientBar.Destroy;
|
|
begin
|
|
inherited;
|
|
end;
|
|
|
|
procedure TIEGradientBar.WMEraseBkgnd(var Message: TMessage);
|
|
begin
|
|
Message.Result := 0;
|
|
end;
|
|
|
|
procedure TIEGradientBar.WMSize(var Message: TWMSize);
|
|
begin
|
|
inherited;
|
|
end;
|
|
|
|
{!!
|
|
<FS>TIEGradientBar.ColorIndex
|
|
|
|
<FM>Declaration<FC>
|
|
property ColorIndex: integer;
|
|
|
|
<FM>Description<FN>
|
|
ColorIndex is the color index that user has selected. It can be 0 (<A TIEGradientBar.BeginColor>) up to 255 (<A TIEGradientBar.EndColor>).
|
|
|
|
!!}
|
|
procedure TIEGradientBar.SetColorIndex(v: integer);
|
|
begin
|
|
fColorIndex := v;
|
|
invalidate;
|
|
end;
|
|
|
|
{!!
|
|
<FS>TIEGradientBar.BeginColor
|
|
|
|
<FM>Declaration<FC>
|
|
property BeginColor: TColor;
|
|
|
|
<FM>Description<FN>
|
|
First color of the gradient bar.
|
|
!!}
|
|
procedure TIEGradientBar.SetBeginColor(v: TColor);
|
|
begin
|
|
fBeginColor := v;
|
|
CalcGradient;
|
|
invalidate;
|
|
end;
|
|
|
|
{!!
|
|
<FS>TIEGradientBar.EndColor
|
|
|
|
<FM>Declaration<FC>
|
|
property EndColor: TColor;
|
|
|
|
<FM>Description<FN>
|
|
Final color of the gradient bar.
|
|
!!}
|
|
procedure TIEGradientBar.SetEndColor(v: TColor);
|
|
begin
|
|
fEndColor := v;
|
|
CalcGradient;
|
|
invalidate;
|
|
end;
|
|
|
|
{!!
|
|
<FS>TIEGradientBar.Color
|
|
|
|
|
|
<FM>Declaration<FC>
|
|
property Color: TColor;
|
|
|
|
<FM>Description<FN>
|
|
The color the user has selected.
|
|
|
|
Read-only
|
|
|
|
!!}
|
|
function TIEGradientBar.GetColor: TColor;
|
|
begin
|
|
result := fGradient[fColorIndex];
|
|
end;
|
|
|
|
{!!
|
|
<FS>TIEGradientBar.RGB
|
|
|
|
<FM>Declaration<FC>
|
|
property RGB: <A TRGB>;
|
|
|
|
<FM>Description<FN>
|
|
The color the user has selected.
|
|
|
|
Read-only
|
|
|
|
<FM>See Also<FN>
|
|
- <A CreateRGB>
|
|
- <A TRGB2TColor>
|
|
- <A TColor2TRGB>
|
|
!!}
|
|
function TIEGradientBar.GetRGB: TRGB;
|
|
begin
|
|
result := TColor2TRGB(fGradient[fColorIndex]);
|
|
end;
|
|
|
|
{!!
|
|
<FS>TIEGradientBar.Direction
|
|
|
|
<FM>Declaration<FC>
|
|
property Direction: <A TIEGradientDir>;
|
|
|
|
<FM>Description<FN>
|
|
Direction is gdHorizontal for a horizontal bar or gdVertical for a vertical bar.
|
|
!!}
|
|
procedure TIEGradientBar.SetDirection(v: TIEGradientDir);
|
|
begin
|
|
fDirection := v;
|
|
invalidate;
|
|
end;
|
|
|
|
procedure TIEGradientBar.CalcGradient;
|
|
var
|
|
BeginRGB, EndRGB: TRGB;
|
|
ir, ig, ib: double;
|
|
q: integer;
|
|
begin
|
|
BeginRGB := TColor2TRGB(fBeginColor);
|
|
EndRGB := TColor2TRGB(fEndColor);
|
|
ir := (-EndRGB.r + BeginRGB.r) / 255;
|
|
ig := (-EndRGB.g + BeginRGB.g) / 255;
|
|
ib := (-EndRGB.b + BeginRGB.b) / 255;
|
|
for q := 0 to 255 do
|
|
fGradient[q] := RGB2TColor(blimit(EndRGB.r + trunc(q * ir)),
|
|
blimit(EndRGB.g + trunc(q * ig)),
|
|
blimit(EndRGB.b + trunc(q * ib)));
|
|
end;
|
|
|
|
procedure TIEGradientBar.Paint;
|
|
var
|
|
ii: double;
|
|
q: integer;
|
|
begin
|
|
Canvas.Pen.Style := psSolid;
|
|
Canvas.Pen.Mode := pmCopy;
|
|
case fDirection of
|
|
gdVertical:
|
|
begin
|
|
if ClientHeight < 2 then
|
|
exit;
|
|
ii := 255 / (ClientHeight - 1);
|
|
for q := 0 to ClientHeight - 1 do
|
|
begin
|
|
Canvas.Pen.Color := fGradient[trunc(ii * q)];
|
|
Canvas.MoveTo(0, q);
|
|
Canvas.LineTo(ClientWidth, q);
|
|
end;
|
|
end;
|
|
gdHorizontal:
|
|
begin
|
|
if ClientWidth < 2 then
|
|
exit;
|
|
ii := 255 / (ClientWidth - 1);
|
|
for q := 0 to ClientWidth - 1 do
|
|
begin
|
|
Canvas.Pen.Color := fGradient[trunc(ii * q)];
|
|
Canvas.MoveTo(q, 0);
|
|
Canvas.LineTo(q, ClientHeight);
|
|
end;
|
|
end;
|
|
end;
|
|
if (not (csDesigning in ComponentState)) and (migDragGrip in fMouseInteract) then
|
|
DrawGrip;
|
|
end;
|
|
|
|
// draw grip at fColorIndex position
|
|
|
|
procedure TIEGradientBar.DrawGrip;
|
|
var
|
|
ii: double;
|
|
pp: integer;
|
|
begin
|
|
Canvas.Pen.Style := psSolid;
|
|
Canvas.Pen.Mode := pmNot;
|
|
Canvas.Brush.Style := bsClear;
|
|
case fDirection of
|
|
gdVertical:
|
|
begin
|
|
ii := (ClientHeight - 1) / 255;
|
|
pp := trunc(fColorIndex * ii);
|
|
Canvas.Rectangle(0, pp + 3, clientwidth, pp - 3);
|
|
end;
|
|
gdHorizontal:
|
|
begin
|
|
ii := (ClientWidth - 1) / 255;
|
|
pp := trunc(fColorIndex * ii);
|
|
Canvas.Rectangle(pp - 3, 0, pp + 3, clientheight);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
// mouse movement
|
|
|
|
procedure TIEGradientBar.MouseMove(Shift: TShiftState; X, Y: Integer);
|
|
begin
|
|
inherited;
|
|
//
|
|
y := ilimit(y, 0, clientheight - 1);
|
|
x := ilimit(x, 0, clientwidth - 1);
|
|
if MouseCapture then
|
|
begin
|
|
if (migDragGrip in fMouseInteract) then
|
|
begin
|
|
DrawGrip;
|
|
case fDirection of
|
|
gdVertical: fColorIndex := trunc(y / (clientheight - 1) * 255);
|
|
gdHorizontal: fColorIndex := trunc(x / (clientwidth - 1) * 255);
|
|
end;
|
|
DrawGrip;
|
|
if Assigned(fOnChange) then
|
|
fOnChange(Self);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
// pressing button mouse
|
|
|
|
procedure TIEGradientBar.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
|
|
begin
|
|
inherited;
|
|
y := ilimit(y, 0, clientheight - 1);
|
|
x := ilimit(x, 0, clientwidth - 1);
|
|
if (Button = mbLeft) then
|
|
begin
|
|
if (migDragGrip in fMouseInteract) then
|
|
begin
|
|
DrawGrip;
|
|
case fDirection of
|
|
gdVertical: fColorIndex := trunc(y / (clientheight - 1) * 255);
|
|
gdHorizontal: fColorIndex := trunc(x / (clientwidth - 1) * 255);
|
|
end;
|
|
DrawGrip;
|
|
if Assigned(fOnChange) then
|
|
fOnChange(Self);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
// mouse up
|
|
|
|
procedure TIEGradientBar.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
|
|
begin
|
|
inherited;
|
|
end;
|
|
|
|
{!!
|
|
<FS>TIEGradientBar.MouseInteract
|
|
|
|
<FM>Declaration<FC>
|
|
property MouseInteract: <A TIEMouseInteractGr>;
|
|
|
|
<FM>Description<FN>
|
|
Specify the automatic interactions with mouse (user).
|
|
|
|
MouseInteract can be migDragGrip to select a color (or an index).
|
|
!!}
|
|
procedure TIEGradientBar.SetMouseInteractGr(v: TIEMouseInteractGr);
|
|
begin
|
|
fMouseInteract := v;
|
|
end;
|
|
|
|
function TIEGradientBar.GetMouseInteractGr: TIEMouseInteractGr;
|
|
begin
|
|
result := fMouseInteract;
|
|
end;
|
|
|
|
end.
|
|
|
|
|
|
|
|
|