📄 mmenvelp.pas
字号:
{========================================================================}
{= (c) 1995-98 SwiftSoft Ronald Dittrich =}
{========================================================================}
{= All Rights Reserved =}
{========================================================================}
{= D 01099 Dresden = Fax.: +49 (0)351-8037944 =}
{= Loewenstr.7a = info@swiftsoft.de =}
{========================================================================}
{= Actual versions on http://www.swiftsoft.de/mmtools.html =}
{========================================================================}
{= This code is for reference purposes only and may not be copied or =}
{= distributed in any format electronic or otherwise except one copy =}
{= for backup purposes. =}
{= =}
{= No Delphi Component Kit or Component individually or in a collection=}
{= subclassed or otherwise from the code in this unit, or associated =}
{= .pas, .dfm, .dcu, .asm or .obj files may be sold or distributed =}
{= without express permission from SwiftSoft. =}
{= =}
{= For more licence informations please refer to the associated =}
{= HelpFile. =}
{========================================================================}
{= $Date: 11.08.98 - 01:23:42 $ =}
{========================================================================}
unit MMEnvelp;
{$I COMPILER.INC}
interface
uses
{$IFDEF WIN32}
Windows,
{$ELSE}
WinProcs,
WinTypes,
{$ENDIF}
SysUtils,
Messages,
Classes,
Graphics,
Controls,
Forms,
Dialogs,
MMObj,
MMDIBCv,
MMPanel,
MMUtils,
MMString,
MMMulDiv,
MMMath,
MMObjLst,
MMPCMSup,
MMObsrv;
type
TMMEnvelopeKind = (ekRectangle, ekCircle, ekOwnerDraw);
TMMEnvelopeDrawPoint = procedure(Sender: TObject; Canvas: TCanvas;
Rect: TRect; Selected: Boolean) of object;
TMMEnvelope = class;
{-- TMMEnvelopePoint --------------------------------------------------}
TMMEnvelopePoint = class(TObject)
private
procedure Store(S: TStream); virtual;
procedure Load(S: TStream); virtual;
public
X_Value : Longint;
Y_Value : Longint;
Selected: Boolean;
constructor Create;
constructor CreateEx(X,Y: integer; Sel: Boolean);
procedure SetParams(X,Y: integer; Sel: Boolean);
procedure Assign(Source: TObject);
end;
{-- TMMEnvelopePointList ----------------------------------------------}
TMMEnvelopePointList = class(TObjectList)
private
FEnvelope: TMMEnvelope;
procedure PutPoint(Index: integer; Point: TMMEnvelopePoint);
function GetPoint(Index: integer): TMMEnvelopePoint;
protected
procedure ReadData(S: TStream); override;
procedure WriteData(S: TStream); override;
public
procedure Assign(Source: TPersistent); override;
property Items[Index: integer]: TMMEnvelopePoint read GetPoint write PutPoint; default;
end;
{-- TMMEnvelope -------------------------------------------------------}
TMMEnvelope = class(TMMMarkerPanel)
private
FDIBCanvas : TMMDIBCanvas;
FPoints : TMMEnvelopePointList;
FTempPoint : TMMEnvelopePoint;
FKind : TMMEnvelopeKind;
FPointSize : integer;
FStartIndex : integer;
FCurIndex : integer;
FUpSelect : Boolean;
FShiftBeginX : Longint; { StartPunkt der MausOperation X values }
FShiftBeginY : Longint; { StartPunkt der MausOperation Y Values }
FMinShiftX : Longint; { max Shiftbereich nach links immer negativ }
FMaxShiftX : Longint; { max Shiftbereich nach rechts immer pos. }
FMinShiftY : Longint; { max Shiftbereich nach oben immer negativ }
FMaxShiftY : Longint; { max Shiftbereich nach unten immer pos. }
FButton : TMouseButton;
FDragOffset : TPoint;
FDragRect : TRect;
FDragging : Boolean;
FMoving : Boolean;
FDrawMidLine : Boolean;
FMidLineColor : TColor;
FLineColor : TColor;
FPointColor : TColor;
FSelectedColor : TColor;
FMoveFirstPoint : Boolean;
FMoveLastPoint : Boolean;
FObservable : TMMObservable;
FOnChange : TNotifyEvent;
FOnDrawPoint : TMMEnvelopeDrawPoint;
procedure SetMovePoints(Index: integer; aValue: Boolean);
procedure SetKind(aValue: TMMEnvelopeKind);
procedure SetColors(index: integer; aValue: TColor);
procedure SetDrawMidLine(aValue: Boolean);
procedure SetPointSize(aValue: integer);
procedure SetPoints(aValue: TMMEnvelopePointList);
function GetCount: integer;
function Get_YValue(X_Value: Longint): Longint;
function GetSelected(Index: integer): Boolean;
procedure SetSelected(Index: integer; aValue: Boolean);
function GetSelectedCount: integer;
procedure CreateInitPoints;
procedure GetMaxRange(Index: integer; var minX, maxX, minY, maxY: Longint);
procedure RemapPoints(oldMinX,oldMaxX,oldMinY,oldMaxY: Longint);
procedure DoChanged(Sender: TObject);
procedure DrawEnvelopePoints(Canvas: TMMDIBCanvas);
procedure DrawEnvelope;
protected
procedure VLineDoted(aCanvas: TCanvas; x, y1, y2: integer; Clr: TColorRef); override;
procedure HLineDoted(aCanvas:TCanvas;x1,x2,y:integer;Clr:TColorRef); override;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: integer); override;
procedure MouseMove(Shift: TShiftState; X, Y: integer); override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
X, Y: integer); override;
procedure Paint; override;
procedure Changed; override;
procedure RangeChanged; override;
procedure DrawPoint(Canvas: TCanvas; Rect: TRect; Selected: Boolean); dynamic;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure SetBounds(aLeft, aTop, aWidth, aHeight: integer); override;
procedure AddObserver(O: TMMObserver);
procedure RemoveObserver(O: TMMObserver);
procedure SetRangeAll(MinX, MaxX, MinY, MaxY, YBase: Longint); override;
{ TODO: einige Eigenschaften verstecken }
procedure Clear;
procedure Reset;
function AddPoint(aPoint: TMMEnvelopePoint; Align: Boolean): Boolean;
procedure DelPoint(Index: integer);
function LocatePoint(X_Value: Longint): integer;
function FindPoint(X_Value: Longint): integer;
function FindPointAtPos(X, Y: integer): integer;
function QueryPoint(Point: TMMEnvelopePoint): Boolean;
procedure DeleteSelected;
procedure SelectAll(State: Boolean);
procedure SelectRange(idxA, idxB: integer; State: Boolean);
procedure SelectArea(Area: TRect; State: Boolean);
procedure QueryPolyMove(var minX, maxX, minY, maxY: Longint);
procedure PolyShift(DiffX, DiffY: Longint);
procedure Scale(Factor: Float);
property Count: integer read GetCount;
property YValue[X_Value: Longint]: Longint read Get_YValue;
property Select[Index: integer]: Boolean read GetSelected write SetSelected;
property CurrentIndex: integer read FCurIndex;
property SelectedCount: integer read GetSelectedCount;
published
{ Events }
property OnClick;
property OnDblClick;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property OnChange: TNotifyEvent read FOnChange write FOnChange;
property OnDrawPoint: TMMEnvelopeDrawPoint read FOnDrawPoint write FOnDrawPoint;
property Align;
property Bevel;
property Color default clBtnFace;
property Width default 200;
property Height default 100;
property ParentShowHint;
property ParentColor default False;
property ShowHint;
property Visible;
property Enabled;
property Kind: TMMEnvelopeKind read FKind write SetKind default ekRectangle;
property MidLineColor: TColor index 0 read FMidLineColor write SetColors default clBlack;
property LineColor: TColor index 1 read FLineColor write SetColors default clBlack;
property PointColor: TColor index 2 read FPointColor write SetColors default clWhite;
property SelectedColor: TColor index 3 read FSelectedColor write SetColors default clBlack;
property PointSize: integer read FPointSize write SetPointSize default 6;
property DrawMidLine: Boolean read FDrawMidLine write SetDrawMidLine default True;
property MoveFirstPoint: Boolean index 0 read FMoveFirstPoint write SetMovePoints default True;
property MoveLastPoint: Boolean index 1 read FMoveLastPoint write SetMovePoints default True;
property Points: TMMEnvelopePointList read FPoints write SetPoints;
end;
implementation
const
STREAMKENNUNG : Longint = $00564E45; { 'ENV ' }
{== TMMEnvelopePoint ====================================================}
constructor TMMEnvelopePoint.Create;
begin
inherited Create;
X_Value := 0;
Y_Value := 0;
Selected := False;
end;
{-- TMMEnvelopePoint ----------------------------------------------------}
constructor TMMEnvelopePoint.CreateEx(X,Y: integer; Sel: Boolean);
begin
inherited Create;
X_Value := X;
Y_Value := Y;
Selected := Sel;
end;
{-- TMMEnvelopePoint ----------------------------------------------------}
procedure TMMEnvelopePoint.Store(S: TStream);
begin
S.WriteBuffer(X_Value,SizeOf(X_Value));
S.WriteBuffer(Y_Value,SizeOf(Y_Value));
S.WriteBuffer(Selected,SizeOf(Selected));
end;
{-- TMMEnvelopePoint ----------------------------------------------------}
procedure TMMEnvelopePoint.Load(S: TStream);
begin
S.ReadBuffer(X_Value,SizeOf(X_Value));
S.ReadBuffer(Y_Value,SizeOf(Y_Value));
S.ReadBuffer(Selected,SizeOf(Selected));
end;
{-- TMMEnvelopePoint ----------------------------------------------------}
procedure TMMEnvelopePoint.Assign(Source: TObject);
begin
if Source is TMMEnvelopePoint then
begin
SetParams(TMMEnvelopePoint(Source).X_Value,
TMMEnvelopePoint(Source).Y_Value,
TMMEnvelopePoint(Source).Selected);
end;
end;
{-- TMMEnvelopePoint ----------------------------------------------------}
procedure TMMEnvelopePoint.SetParams(X,Y: integer; Sel: Boolean);
begin
X_Value := X;
Y_Value := Y;
Selected := Sel;
end;
{== TMMEnvelopePointList ================================================}
procedure TMMEnvelopePointList.PutPoint(Index: integer; Point: TMMEnvelopePoint);
begin
Put(Index, Point);
end;
{-- TMMEnvelopePointList ------------------------------------------------}
function TMMEnvelopePointList.GetPoint(Index: integer): TMMEnvelopePoint;
begin
Result := TMMEnvelopePoint(Get(Index));
end;
{-- TMMEnvelopePointList ------------------------------------------------}
procedure TMMEnvelopePointList.Assign(Source: TPersistent);
var
i: integer;
pt: TMMEnvelopePoint;
begin
if (Source is TMMEnvelopePointList) or (Source = nil) then
begin
BeginUpdate;
try
FreeAll;
if (Source <> nil) then
for i := 0 to TMMEnvelopePointList(Source).Count-1 do
begin
pt := TMMEnvelopePoint.Create;
pt.Assign(TMMEnvelopePointList(Source)[i]);
pt.Selected := False;
AddObject(pt);
end;
finally
EndUpdate;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -