【delphi开源代码栏目提醒】:本文主要为网学会员提供MaskImageButton.pas,希望对需要MaskImageButton.pas网友有所帮助,学习一下!
{$A+,B-,D+,F-,G+,I+,K+,L+,N+,P+,Q-,R-,S+,T-,V-,W-,X+,Y+}
unit MaskImageButton;
{
*
** 根据图案自动生动边界的按纽
** 作者:未知
** 修改:午秋
** 更新:增加了一个Action 属性
*
}
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Buttons;
CONST FBevelWidth = 1;
type
TMaskImgBtn = class(TGraphicControl)
private
FAutoSize: Boolean;
FBitmap: TBitmap;
FBitmapUp: TBitmap;
FBitmapDown: TBitmap;
FHitTestMask: TBitmap;
FPrevCursorSaved: Boolean;
FPrevCursor: TCursor;
FPrevShowHintSaved: Boolean;
FPrevShowHint: Boolean;
FPreciseShowHint: Boolean;
procedure AdjustBounds;
procedure AdjustSize(var W, H: Integer);
function BevelColor(const AState: TButtonState; const TopLeft: Boolean): TColor;
procedure BitmapChanged(Sender: TObject);
procedure Create3DBitmap(Source: TBitmap; const AState: TButtonState; Target: TBitmap);
procedure SetAutoSize(Value: Boolean);
procedure SetBitmap(Value: TBitmap);
procedure SetBitmapDown(Value: TBitmap);
procedure SetBitmapUp(Value: TBitmap);
procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR;
procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;
procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
procedure CMSysColorChange(var Message: TMessage); message CM_SYSCOLORCHANGE;
protected
FState: TButtonState;
procedure DefineProperties(Filer: TFiler); override;
procedure DrawButtonText(Canvas: TCanvas; const Caption: String; TextBounds: TRect; State: TButtonState); virtual;
function GetPalette: HPALETTE; override;
procedure Loaded; 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 ReadBitmapDownData(Stream: TStream); virtual;
procedure ReadBitmapUpData(Stream: TStream); virtual;
procedure WriteBitmapDownData(Stream: TStream); virtual;
procedure WriteBitmapUpData(Stream: TStream); virtual;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Click; override;
procedure Invalidate; override;
function PtInMask(const X, Y: Integer): Boolean; virtual;
procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
property BitmapUp: TBitmap read FBitmapUp;
property BitmapDown: TBitmap read FBitmapDown;
published
property Action;
property AutoSize: Boolean read FAutoSize write SetAutoSize default True;
property Bitmap: TBitmap read FBitmap write SetBitmap;
property Caption;
property Enabled;
property Font;
property ParentFont;
property ShowHint;
property Visible;
property OnClick;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
end;
procedure Register;
implementation
type
Apair = Array[0..1] of Integer;
function MakeMask(ColorBmp: TBitmap; TransparentColor: TColor): TBitmap;
var R: TRect;
OldBkColor: TColorRef;
begin
Result := TBitmap.Create;
try
Result.Monochrome := True;
Result.Width := ColorBmp.Width;
Result.Height := ColorBmp.Height;
OldBkColor := SetBkColor(ColorBmp.Canvas.Handle, ColorToRGB(TransparentColor));
R := Rect(0, 0, ColorBmp.Width, ColorBmp.Height);
Result.Canvas.CopyMode := cmSrcCopy;
Result.Canvas.CopyRect(R, ColorBmp.Canvas, R);
SetBkColor(ColorBmp.Canvas.Handle, OldBkColor);
except
Result.Free;
Raise;
end;
end;
function MakeBorder(Source, NewSource: TBitmap; const OffsetPts: Array of Apair;
TransparentColor: TCol