📄 gr32_image.pas
字号:
unit GR32_Image;
(* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Graphics32
*
* The Initial Developer of the Original Code is
* Alex A. Denisov
*
* Portions created by the Initial Developer are Copyright (C) 2000-2006
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Mattias Andersson <mattias@centaurix.com>
* Andre Beckedorf <Andre@metaException.de>
* Andrew P. Rybin <aprybin@users.sourceforge.net>
* Dieter K鰄ler <dieter.koehler@philo.de>
*
* ***** END LICENSE BLOCK ***** *)
interface
{$I GR32.inc}
uses
{$IFDEF CLX}
Qt, Types, QControls, QGraphics, QForms, QConsts,
{$IFDEF LINUX}Libc,{$ENDIF}
{$IFDEF MSWINDOWS}Windows,{$ENDIF}
{$ELSE}
Windows, Messages, Controls, Graphics, Forms,
{$ENDIF}
Classes, SysUtils, GR32, GR32_Layers, GR32_RangeBars, GR32_LowLevel,
GR32_System, GR32_Containers, GR32_RepaintOpt;
const
{ Paint Stage Constants }
PST_CUSTOM = 1; // Calls OnPaint with # of current stage in parameter
PST_CLEAR_BUFFER = 2; // Clears the buffer
PST_CLEAR_BACKGND = 3; // Clears a visible buffer area
PST_DRAW_BITMAP = 4; // Draws a bitmap
PST_DRAW_LAYERS = 5; // Draw layers (Parameter = Layer Mask)
PST_CONTROL_FRAME = 6; // Draws a dotted frame around the control
PST_BITMAP_FRAME = 7; // Draws a dotted frame around the scaled bitmap
type
TPaintStageEvent = procedure(Sender: TObject; Buffer: TBitmap32; StageNum: Cardinal) of object;
{ TPaintStage }
PPaintStage = ^TPaintStage;
TPaintStage = record
DsgnTime: Boolean;
RunTime: Boolean;
Stage: Cardinal; // a PST_* constant
Parameter: Cardinal; // an optional parameter
end;
{ TPaintStages }
TPaintStages = class
private
FItems: array of TPaintStage;
function GetItem(Index: Integer): PPaintStage;
public
destructor Destroy; override;
function Add: PPaintStage;
procedure Clear;
function Count: Integer;
procedure Delete(Index: Integer);
function Insert(Index: Integer): PPaintStage;
property Items[Index: Integer]: PPaintStage read GetItem; default;
end;
{ Alignment of the bitmap in TCustomImage32 }
TBitmapAlign = (baTopLeft, baCenter, baTile, baCustom);
TScaleMode = (smNormal, smStretch, smScale, smResize, smOptimal, smOptimalScaled);
TPaintBoxOptions = set of (pboWantArrowKeys, pboAutoFocus);
TRepaintMode = (rmFull, rmDirect, rmOptimizer);
{ TCustomPaintBox32 }
TCustomPaintBox32 = class(TCustomControl)
private
FBuffer: TBitmap32;
FBufferOversize: Integer;
FBufferValid: Boolean;
FRepaintMode: TRepaintMode;
FInvalidRects: TRectList;
FForceFullRepaint: Boolean;
FRepaintOptimizer: TCustomRepaintOptimizer;
FOptions: TPaintBoxOptions;
FOnGDIOverlay: TNotifyEvent;
FMouseInControl: Boolean;
FOnMouseEnter: TNotifyEvent;
FOnMouseLeave: TNotifyEvent;
procedure SetBufferOversize(Value: Integer);
{$IFNDEF CLX}
procedure WMEraseBkgnd(var Message: TWmEraseBkgnd); message WM_ERASEBKGND;
procedure WMGetDlgCode(var Msg: TWmGetDlgCode); message WM_GETDLGCODE;
procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
procedure CMInvalidate(var Message: TMessage); message CM_INVALIDATE;
procedure WMPaint(var Message: TMessage); message WM_PAINT;
{$ENDIF}
procedure DirectAreaUpdateHandler(Sender: TObject; const Area: TRect; const Info: Cardinal);
protected
procedure SetRepaintMode(const Value: TRepaintMode); virtual;
function CustomRepaint: Boolean; virtual;
function InvalidRectsAvailable: Boolean; virtual;
procedure DoPrepareInvalidRects; virtual;
procedure DoPaintBuffer; virtual;
procedure DoPaintGDIOverlay; virtual;
procedure DoBufferResized(const OldWidth, OldHeight: Integer); virtual;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
{$IFDEF CLX}
procedure MouseEnter(AControl: TControl); override;
procedure MouseLeave(AControl: TControl); override;
{$ELSE}
procedure MouseEnter; virtual;
procedure MouseLeave; virtual;
{$ENDIF}
procedure Paint; override;
procedure ResetInvalidRects;
procedure ResizeBuffer;
property BufferValid: Boolean read FBufferValid write FBufferValid;
property InvalidRects: TRectList read FInvalidRects;
{$IFDEF CLX}
function WidgetFlags: Integer; override;
{$ENDIF}
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function GetViewportRect: TRect; virtual;
procedure Flush; overload;
procedure Flush(const SrcRect: TRect); overload;
procedure Invalidate; override;
procedure ForceFullInvalidate; virtual;
procedure Loaded; override;
procedure Resize; override;
procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
property Buffer: TBitmap32 read FBuffer;
property BufferOversize: Integer read FBufferOversize write SetBufferOversize;
property Options: TPaintBoxOptions read FOptions write FOptions default [];
property MouseInControl: Boolean read FMouseInControl;
property RepaintMode: TRepaintMode read FRepaintMode write SetRepaintMode default rmFull;
property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
property OnGDIOverlay: TNotifyEvent read FOnGDIOverlay write FOnGDIOverlay;
end;
{ TPaintBox32 }
TPaintBox32 = class(TCustomPaintBox32)
private
FOnPaintBuffer: TNotifyEvent;
protected
procedure DoPaintBuffer; override;
public
property Canvas;
published
property Align;
property Anchors;
{$IFNDEF CLX}
property AutoSize;
{$ENDIF}
property Constraints;
property Cursor;
{$IFNDEF CLX}
property DragCursor;
{$ENDIF}
property Options;
property ParentShowHint;
property PopupMenu;
property RepaintMode;
property ShowHint;
property TabOrder;
property TabStop;
property Visible;
{$IFNDEF CLX}
property OnCanResize;
{$ENDIF}
property OnClick;
{$IFDEF DELPHI5}
property OnContextPopup;
{$ENDIF}
property OnDblClick;
property OnDragDrop;
property OnDragOver;
property OnEndDrag;
property OnGDIOverlay;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property OnMouseWheel;
property OnMouseWheelDown;
property OnMouseWheelUp;
property OnMouseEnter;
property OnMouseLeave;
property OnPaintBuffer: TNotifyEvent read FOnPaintBuffer write FOnPaintBuffer;
property OnResize;
property OnStartDrag;
end;
{ TCustomImage32 }
TImgMouseEvent = procedure(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer; Layer: TCustomLayer) of object;
TImgMouseMoveEvent = procedure(Sender: TObject; Shift: TShiftState;
X, Y: Integer; Layer: TCustomLayer) of object;
TPaintStageHandler = procedure(Dest: TBitmap32; StageNum: Integer) of object;
TCustomImage32 = class(TCustomPaintBox32)
private
FBitmap: TBitmap32;
FBitmapAlign: TBitmapAlign;
FLayers: TLayerCollection;
FOffsetHorz: Single;
FOffsetVert: Single;
FPaintStages: TPaintStages;
FPaintStageHandlers: array of TPaintStageHandler;
FPaintStageNum: array of Integer;
FScaleX: Single;
FScaleY: Single;
FScaleMode: TScaleMode;
FUpdateCount: Integer;
FOnBitmapResize: TNotifyEvent;
FOnChange: TNotifyEvent;
FOnInitStages: TNotifyEvent;
FOnMouseDown: TImgMouseEvent;
FOnMouseMove: TImgMouseMoveEvent;
FOnMouseUp: TImgMouseEvent;
FOnPaintStage: TPaintStageEvent;
FOnScaleChange: TNotifyEvent;
procedure BitmapResizeHandler(Sender: TObject);
procedure BitmapChangeHandler(Sender: TObject);
procedure BitmapAreaChangeHandler(Sender: TObject; const Area: TRect; const Info: Cardinal);
procedure BitmapDirectAreaChangeHandler(Sender: TObject; const Area: TRect; const Info: Cardinal);
procedure LayerCollectionChangeHandler(Sender: TObject);
procedure LayerCollectionGDIUpdateHandler(Sender: TObject);
procedure LayerCollectionGetViewportScaleHandler(Sender: TObject; var ScaleX, ScaleY: Single);
procedure LayerCollectionGetViewportShiftHandler(Sender: TObject; var ShiftX, ShiftY: Single);
function GetOnPixelCombine: TPixelCombineEvent;
procedure SetBitmap(Value: TBitmap32); {$IFDEF CLX}reintroduce;{$ENDIF}
procedure SetBitmapAlign(Value: TBitmapAlign);
procedure SetLayers(Value: TLayerCollection);
procedure SetOffsetHorz(Value: Single);
procedure SetOffsetVert(Value: Single);
procedure SetScale(Value: Single);
procedure SetScaleX(Value: Single);
procedure SetScaleY(Value: Single);
procedure SetOnPixelCombine(Value: TPixelCombineEvent);
protected
CachedBitmapRect: TRect;
CachedXForm: TCoordXForm;
CacheValid: Boolean;
OldSzX, OldSzY: Integer;
PaintToMode: Boolean;
procedure BitmapResized; virtual;
procedure BitmapChanged(const Area: TRect); reintroduce; virtual;
{$IFNDEF CLX}
function CanAutoSize(var NewWidth, NewHeight: Integer): Boolean; override;
{$ENDIF}
procedure DoInitStages; virtual;
procedure DoPaintBuffer; override;
procedure DoPaintGDIOverlay; override;
procedure DoScaleChange; virtual;
procedure InitDefaultStages; virtual;
procedure InvalidateCache;
function InvalidRectsAvailable: Boolean; override;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); overload; override;
procedure MouseMove(Shift: TShiftState; X, Y: Integer); overload; override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); overload; override;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer; Layer: TCustomLayer); reintroduce; overload; virtual;
procedure MouseMove(Shift: TShiftState; X, Y: Integer; Layer: TCustomLayer); reintroduce; overload; virtual;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer; Layer: TCustomLayer); reintroduce; overload; virtual;
{$IFDEF CLX}
procedure MouseLeave(AControl: TControl); override;
{$ELSE}
procedure MouseLeave; override;
{$ENDIF}
procedure SetRepaintMode(const Value: TRepaintMode); override;
procedure SetScaleMode(Value: TScaleMode); virtual;
procedure UpdateCache;
property UpdateCount: Integer read FUpdateCount;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure BeginUpdate; virtual;
function BitmapToControl(const APoint: TPoint): TPoint;
procedure Changed; virtual;
function ControlToBitmap(const APoint: TPoint): TPoint;
procedure EndUpdate; virtual;
procedure ExecBitmapFrame(Dest: TBitmap32; StageNum: Integer); virtual; // PST_BITMAP_FRAME
procedure ExecClearBuffer(Dest: TBitmap32; StageNum: Integer); virtual; // PST_CLEAR_BUFFER
procedure ExecClearBackgnd(Dest: TBitmap32; StageNum: Integer); virtual; // PST_CLEAR_BACKGND
procedure ExecControlFrame(Dest: TBitmap32; StageNum: Integer); virtual; // PST_CONTROL_FRAME
procedure ExecCustom(Dest: TBitmap32; StageNum: Integer); virtual; // PST_CUSTOM
procedure ExecDrawBitmap(Dest: TBitmap32; StageNum: Integer); virtual; // PST_DRAW_BITMAP
procedure ExecDrawLayers(Dest: TBitmap32; StageNum: Integer); virtual; // PST_DRAW_LAYERS
function GetBitmapRect: TRect; virtual;
function GetBitmapSize: TSize; virtual;
procedure Invalidate; override;
procedure Loaded; override;
procedure PaintTo(Dest: TBitmap32; DestRect: TRect); virtual;
procedure Resize; override;
procedure SetupBitmap(DoClear: Boolean = False; ClearColor: TColor32 = $FF000000); virtual;
property Bitmap: TBitmap32 read FBitmap write SetBitmap;
property BitmapAlign: TBitmapAlign read FBitmapAlign write SetBitmapAlign;
property Canvas;
property Layers: TLayerCollection read FLayers write SetLayers;
property OffsetHorz: Single read FOffsetHorz write SetOffsetHorz;
property OffsetVert: Single read FOffsetVert write SetOffsetVert;
property PaintStages: TPaintStages read FPaintStages;
property Scale: Single read FScaleX write SetScale;
property ScaleX: Single read FScaleX write SetScaleX;
property ScaleY: Single read FScaleY write SetScaleY;
property ScaleMode: TScaleMode read FScaleMode write SetScaleMode;
property OnBitmapResize: TNotifyEvent read FOnBitmapResize write FOnBitmapResize;
property OnBitmapPixelCombine: TPixelCombineEvent read GetOnPixelCombine write SetOnPixelCombine;
property OnChange: TNotifyEvent read FOnChange write FOnChange;
property OnInitStages: TNotifyEvent read FOnInitStages write FOnInitStages;
property OnMouseDown: TImgMouseEvent read FOnMouseDown write FOnMouseDown;
property OnMouseMove: TImgMouseMoveEvent read FOnMouseMove write FOnMouseMove;
property OnMouseUp: TImgMouseEvent read FOnMouseUp write FOnMouseUp;
property OnPaintStage: TPaintStageEvent read FOnPaintStage write FOnPaintStage;
property OnScaleChange: TNotifyEvent read FOnScaleChange write FOnScaleChange;
end;
TImage32 = class(TCustomImage32)
published
property Align;
property Anchors;
{$IFNDEF CLX}
property AutoSize;
{$ENDIF}
property Bitmap;
property BitmapAlign;
property Color;
property Constraints;
property Cursor;
{$IFNDEF CLX}
property DragCursor;
{$ENDIF}
property ParentColor;
property ParentShowHint;
property PopupMenu;
property RepaintMode;
property Scale;
property ScaleMode;
property ShowHint;
property TabOrder;
property TabStop;
property Visible;
property OnBitmapResize;
{$IFNDEF CLX}
property OnCanResize;
{$ENDIF}
property OnClick;
property OnChange;
{$IFDEF DELPHI5}
property OnContextPopup;
{$ENDIF}
property OnDblClick;
property OnGDIOverlay;
property OnDragDrop;
property OnDragOver;
property OnEndDrag;
property OnInitStages;
property OnKeyDown;
property OnKeyPress;
property OnKeyUp;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property OnMouseWheel;
property OnMouseWheelDown;
property OnMouseWheelUp;
property OnMouseEnter;
property OnMouseLeave;
property OnPaintStage;
property OnResize;
property OnStartDrag;
end;
TCustomImgView32 = class;
TScrollBarVisibility = (svAlways, svHidden, svAuto);
{ TIVScrollProperties }
TIVScrollProperties = class(TArrowBarAccess)
private
function GetIncrement: Integer;
function GetSize: Integer;
function GetVisibility: TScrollbarVisibility;
procedure SetIncrement(Value: Integer);
procedure SetSize(Value: Integer);
procedure SetVisibility(const Value: TScrollbarVisibility);
protected
ImgView: TCustomImgView32;
published
property Increment: Integer read GetIncrement write SetIncrement default 8;
property Size: Integer read GetSize write SetSize default 0;
property Visibility: TScrollBarVisibility read GetVisibility write SetVisibility default svAlways;
end;
TSizeGripStyle = (sgAuto, sgNone, sgAlways);
{ TCustomImgView32 }
TCustomImgView32 = class(TCustomImage32)
private
FCentered: Boolean;
FScrollBarSize: Integer;
FScrollBarVisibility: TScrollBarVisibility;
FScrollBars: TIVScrollProperties;
FSizeGrip: TSizeGripStyle;
FOnScroll: TNotifyEvent;
FOverSize: Integer;
procedure SetCentered(Value: Boolean);
procedure SetScrollBars(Value: TIVScrollProperties);
procedure SetSizeGrip(Value: TSizeGripStyle);
procedure SetOverSize(const Value: Integer);
protected
DisableScrollUpdate: Boolean;
HScroll: TCustomRangeBar;
VScroll: TCustomRangeBar;
procedure AlignAll;
procedure BitmapResized; override;
procedure DoDrawSizeGrip(R: TRect);
procedure DoScaleChange; override;
procedure DoScroll; virtual;
function GetScrollBarsVisible: Boolean;
function GetScrollBarSize: Integer;
function GetSizeGripRect: TRect;
function IsSizeGripVisible: Boolean;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
procedure Paint; override;
procedure Recenter;
procedure SetScaleMode(Value: TScaleMode); override;
procedure ScrollHandler(Sender: TObject); virtual;
procedure UpdateImage; virtual;
procedure UpdateScrollBars; virtual;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function GetViewportRect: TRect; override;
procedure Loaded; override;
procedure Resize; override;
procedure ScrollToCenter(X, Y: Integer);
procedure Scroll(Dx, Dy: Integer);
property Centered: Boolean read FCentered write SetCentered default True;
property ScrollBars: TIVScrollProperties read FScrollBars write SetScrollBars;
property SizeGrip: TSizeGripStyle read FSizeGrip write SetSizeGrip default sgAuto;
property OverSize: Integer read FOverSize write SetOverSize;
property OnScroll: TNotifyEvent read FOnScroll write FOnScroll;
end;
TImgView32 = class(TCustomImgView32)
property Align;
property Anchors;
{$IFNDEF CLX}
property AutoSize;
{$ENDIF}
property Bitmap;
property Centered;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -