advglowbutton.pas
来自「一个非常棒的控件.做商业软件特别适用.里面的控件涉及面非常的广,有兴趣的话可以下」· PAS 代码 · 共 1,982 行 · 第 1/5 页
PAS
1,982 行
gppen.Free;
path.Free;
end;
procedure DrawOpenRoundRectRight(graphics: TGPGraphics; PC: TColor; X,Y,Width,Height,Radius: integer;Hot: boolean);
var
path:TGPGraphicsPath;
gppen:TGPPen;
begin
path := TGPGraphicsPath.Create;
gppen := tgppen.Create(ColorToARGB(PC),1);
path.AddLine(X, Y, X + width - (radius *2), Y);
path.AddArc(X + width - (radius*2), Y, radius*2, radius*2, 270, 90);
path.AddLine(X + width, Y + radius, X + width, Y + height - (radius*2));
path.AddArc(X + width - (radius*2), Y + height - (radius*2), radius*2, radius*2,0,90);
path.AddLine(X + width , Y + height, X, Y + height);
graphics.DrawPath(gppen, path);
gppen.Free;
path.Free;
if hot then
begin
path := TGPGraphicsPath.Create;
gppen := tgppen.Create(ColorToARGB(BrightnessColor(PC,-5)),1);
path.AddLine(X , Y, X , Y + Height);
graphics.DrawPath(gppen, path);
gppen.Free;
path.Free;
end
else
begin
path := TGPGraphicsPath.Create;
// 3D color effect
gppen := tgppen.Create(ColorToARGB(BrightnessColor(clwhite,-10)),1);
path.AddLine(X, Y + 2, X, Y + Height - 2);
graphics.DrawPath(gppen, path);
gppen.Free;
path.Free;
end;
end;
//------------------------------------------------------------------------------
procedure DrawDottedRoundRect(graphics: TGPGraphics; PC: TColor; X,Y,Width,Height,Radius: integer);
var
path:TGPGraphicsPath;
gppen:TGPPen;
begin
path := TGPGraphicsPath.Create;
gppen := tgppen.Create(ColorToARGB(PC),1);
gppen.SetDashStyle(DashStyleDot);
path.AddLine(X + radius, Y, X + width - (radius*2), Y);
path.AddArc(X + width - (radius*2), Y, radius*2, radius*2, 270, 90);
path.AddLine(X + width, Y + radius, X + width, Y + height - (radius*2));
path.AddArc(X + width - (radius*2), Y + height - (radius*2), radius*2, radius*2,0,90);
path.AddLine(X + width - (radius*2), Y + height, X + radius, Y + height);
path.AddArc(X, Y + height - (radius*2), radius*2, radius*2, 90, 90);
path.AddLine(X, Y + height - (radius*2), X, Y + radius);
path.AddArc(X, Y, radius*2, radius*2, 180, 90);
path.CloseFigure;
graphics.DrawPath(gppen, path);
gppen.Free;
path.Free;
end;
//------------------------------------------------------------------------------
procedure DrawRoundRect(graphics: TGPGraphics; PC: TColor; X,Y,Width,Height,Radius: integer);
var
path:TGPGraphicsPath;
gppen:TGPPen;
begin
path := TGPGraphicsPath.Create;
gppen := tgppen.Create(ColorToARGB(PC),1);
path.AddLine(X + radius, Y, X + width - (radius*2), Y);
path.AddArc(X + width - (radius*2), Y, radius*2, radius*2, 270, 90);
path.AddLine(X + width, Y + radius, X + width, Y + height - (radius*2));
path.AddArc(X + width - (radius*2), Y + height - (radius*2), radius*2, radius*2,0,90);
path.AddLine(X + width - (radius*2), Y + height, X + radius, Y + height);
path.AddArc(X, Y + height - (radius*2), radius*2, radius*2, 90, 90);
path.AddLine(X, Y + height - (radius*2), X, Y + radius);
path.AddArc(X, Y, radius*2, radius*2, 180, 90);
path.CloseFigure;
graphics.DrawPath(gppen, path);
gppen.Free;
path.Free;
end;
procedure DrawArrow(Canvas: TCanvas; ArP: TPoint; ArClr, ArShad: TColor; Down:boolean);
begin
if Down then
begin
Canvas.Pen.Color := ArClr;
Canvas.MoveTo(ArP.X, ArP.Y);
Canvas.LineTo(ArP.X + 5, ArP.Y);
Canvas.MoveTo(ArP.X + 1, ArP.Y + 1);
Canvas.LineTo(ArP.X + 4, ArP.Y + 1);
Canvas.Pixels[ArP.X + 2, ArP.Y + 2] := ArClr;
Canvas.Pixels[ArP.X, ArP.Y + 1] := ArShad;
Canvas.Pixels[ArP.X + 4, ArP.Y + 1] := ArShad;
Canvas.Pixels[ArP.X + 1, ArP.Y + 2] := ArShad;
Canvas.Pixels[ArP.X + 3, ArP.Y + 2] := ArShad;
Canvas.Pixels[ArP.X + 2, ArP.Y + 3] := ArShad;
end
else
begin
Canvas.Pen.Color := ArClr;
Canvas.MoveTo(ArP.X, ArP.Y);
Canvas.LineTo(ArP.X, ArP.Y + 5);
Canvas.MoveTo(ArP.X + 1, ArP.Y + 1);
Canvas.LineTo(ArP.X + 1, ArP.Y + 4);
Canvas.Pixels[ArP.X + 2, ArP.Y + 2] := ArClr;
Canvas.Pixels[ArP.X + 2, ArP.Y + 1] := ArShad;
Canvas.Pixels[ArP.X + 1, ArP.Y + 4] := ArShad;
Canvas.Pixels[ArP.X + 2, ArP.Y + 1] := ArShad;
Canvas.Pixels[ArP.X + 3, ArP.Y + 2] := ArShad;
Canvas.Pixels[ArP.X + 3, ArP.Y + 2] := ArShad;
end;
end;
procedure DrawButtonBackground(Canvas: TCanvas; Graphics: TGPGraphics; R: TRect; CF,CT: TColor; Gradient: TGDIPGradient; Upper: boolean);
var
path: TGPGraphicsPath;
pthGrBrush: TGPPathGradientBrush;
linGrBrush: TGPLinearGradientBrush;
w,h,w2,h2: Integer;
colors : array[0..0] of TGPColor;
count: Integer;
begin
w := r.Right - r.Left;
h := r.Bottom - r.Top;
h2 := h div 2;
w2 := w div 2;
// draw background
if Upper then
Canvas.Brush.Color := CF
else
Canvas.Brush.Color := CT;
Canvas.FillRect(rect(r.Left , r.Top, r.Right , r.Bottom));
// Create a path that consists of a single ellipse.
path := TGPGraphicsPath.Create;
if Upper then // take borders in account
path.AddEllipse(r.Left, r.Top - h2 + 2, r.Right , r.Bottom)
else
path.AddEllipse(r.Left, r.Top, r.Right , r.Bottom);
pthGrBrush := nil;
linGrBrush := nil;
case Gradient of
ggRadial: pthGrBrush := TGPPathGradientBrush.Create(path);
ggVertical: linGrBrush := TGPLinearGradientBrush.Create(MakeRect(r.Left,r.Top,w,h),ColorToARGB(CF),ColorToARGB(CT), LinearGradientModeVertical);
ggDiagonalForward: linGrBrush := TGPLinearGradientBrush.Create(MakeRect(r.Left,r.Top,w,h),ColorToARGB(CF),ColorToARGB(CT), LinearGradientModeForwardDiagonal);
ggDiagonalBackward: linGrBrush := TGPLinearGradientBrush.Create(MakeRect(r.Left,r.Top,w,h),ColorToARGB(CF),ColorToARGB(CT), LinearGradientModeBackwardDiagonal);
end;
if Gradient = ggRadial then
begin
if Upper then
pthGrBrush.SetCenterPoint(MakePoint(r.Left + w2, r.Top))
else
pthGrBrush.SetCenterPoint(MakePoint(r.Left + w2, r.Bottom));
// Set the color at the center point to blue.
if Upper then
begin
pthGrBrush.SetCenterColor(ColorToARGB(CT));
colors[0] := ColorToARGB(CF);
end
else
begin
pthGrBrush.SetCenterColor(ColorToARGB(CF));
colors[0] := ColorToARGB(CT);
end;
count := 1;
pthGrBrush.SetSurroundColors(@colors, count);
graphics.FillRectangle(pthGrBrush, r.Left, r.Top, r.Right, r.Bottom);
pthGrBrush.Free;
end
else
begin
graphics.FillRectangle(linGrBrush, r.Left, r.Top, r.Right, r.Bottom);
linGrBrush.Free;
end;
path.Free;
end;
//------------------------------------------------------------------------------
function DrawVistaButton(Canvas: TCanvas; r: TRect; CFU, CTU, CFB, CTB, PC: TColor;
GradientU, GradientB: TGDIPGradient; Caption:Widestring; DrawCaption: Boolean; AFont: TFont;
Images: TImageList; ImageIndex: Integer; EnabledImage: Boolean; Layout: TButtonLayout;
DropDownButton: Boolean; DrawDwLine: Boolean; Enabled: Boolean; Focus: Boolean; DropDownPos: TDropDownPosition;
Picture: TGDIPPicture; AntiAlias: TAntiAlias; DrawPic: Boolean; Glyph: TBitmap; ButtonDisplay: TButtonDisplay; Transparent, Hot: boolean;
ButtonPosition: TButtonPosition; DropDownSplit, DrawBorder, OverlapText, WordWrap, AutoSize, Rounded, DropDir: Boolean; Spacing: integer): TSize;
var
graphics : TGPGraphics;
path: TGPGraphicsPath;
pthGrBrush: TGPPathGradientBrush;
linGrBrush: TGPLinearGradientBrush;
count: Integer;
w,h,h2,h2d: Integer;
colors : array[0..0] of TGPColor;
fontFamily: TGPFontFamily;
font: TGPFont;
rectf: TGPRectF;
stringFormat: TGPStringFormat;
solidBrush: TGPSolidBrush;
x1,y1,x2,y2: single;
fs: integer;
sizerect: TGPRectF;
ImgX, ImgY, ImgW, ImgH: Integer;
BtnR, DwR: TRect;
BR1,BR2: TRect;
DR1,DR2: TRect;
AP: TPoint;
szRect: TRect;
tm: TTextMetric;
ttf: boolean;
Radius: integer;
begin
BtnR := R;
if Rounded then
Radius := 3
else
Radius := 0;
if DropDownPos = dpRight then
begin
DwR := Rect(BtnR.Right - DropDownSectWidth, BtnR.Top, BtnR.Right, BtnR.Bottom);
if DropDownButton then
BtnR.Right := DwR.Left;
end
else // DropDownPos = doBottom
begin
DwR := Rect(BtnR.Left, BtnR.Bottom - DropDownSectWidth, BtnR.Right, BtnR.Bottom);
if DropDownButton then
BtnR.Bottom := DwR.Top;
end;
w := r.Right - r.Left;
h := r.Bottom - r.Top;
h2 := h div 2;
// Create GDI+ canvas
graphics := TGPGraphics.Create(Canvas.Handle);
if not Transparent then
begin
if DropDownButton and (DrawDwLine) and DropDownSplit then
begin
if DropDownPos = dpRight then
begin
DR1 := Rect(r.Right - 12, r.Top + h2 - 1, r.Right, r.Bottom);
DR2 := Rect(r.Right - 12, r.Top, r.Right, r.Bottom - h2);
BR1 := Rect(r.Left, r.Top + h2 - 1, r.Right - 12, r.Bottom);
BR2 := Rect(r.Left, r.Top, r.Right - 12, r.Bottom - h2);
end
else
begin
DR1 := Rect(r.Left, r.Bottom - 6, r.Right, r.Bottom);
DR2 := Rect(r.Left, r.Bottom - 12, r.Right, r.Bottom - 6);
DR2 := Rect(r.Left, r.Bottom - 12, r.Right, r.Bottom);
h2d := (r.Bottom - r.Top - 12) div 2;
BR1 := Rect(r.Left, r.Top + h2d - 1, r.Right, r.Bottom - 12);
BR2 := Rect(r.Left, r.Top, r.Right, r.Bottom - 12 - h2d);
end;
if ButtonDisplay = bdDropDown then
begin
DrawButtonBackground(Canvas, Graphics, BR1, CTB, CFB, GradientB, False);
DrawButtonBackground(Canvas, Graphics, BR2, CFU, CTU, GradientU, True);
DrawButtonBackground(Canvas, Graphics, DR2, BrightnessColor(CFU,-10), BrightnessColor(CTU,-10), GradientU, True);
if (DropDownPos = dpRight) then
DrawButtonBackground(Canvas, Graphics, DR1, BrightnessColor(CTB,-10), BrightnessColor(CFB,-10), GradientB, False);
end
else
begin
DrawButtonBackground(Canvas, Graphics, BR1, BrightnessColor(CTB,-10), BrightnessColor(CFB,-10), GradientB, False);
DrawButtonBackground(Canvas, Graphics, BR2, BrightnessColor(CFU,-10), BrightnessColor(CTU,-10), GradientU, True);
DrawButtonBackground(Canvas, Graphics, DR2, CFU, CTU, ggRadial, True);
if DropDownPos = dpRight then
DrawButtonBackground(Canvas, Graphics, DR1, CTB, CFB, GradientB, False);
end;
end
else
begin
DrawButtonBackground(Canvas, Graphics, Rect(r.left, r.Top + h2 - 1, r.Right, r.Bottom), CTB, CFB, GradientB, False);
DrawButtonBackground(Canvas, Graphics, Rect(r.Left, r.Top, r.Right, r.Bottom - h2), CFU, CTU, GradientU, True);
end;
end;
graphics.SetSmoothingMode(SmoothingModeAntiAlias);
if not Transparent and DrawBorder then
begin
case ButtonPosition of
bpStandalone: DrawRoundRect(Graphics, PC, r.Left, r.Top, r.Right - 1, r.Bottom - 1, Radius);
bpLeft: DrawOpenRoundRectLeft(Graphics, PC, r.Left, r.Top, r.Right - 1, r.Bottom - 1, Radius);
bpRight: DrawOpenRoundRectRight(Graphics, PC, r.Left, r.Top, r.Right - 1, r.Bottom - 1, Radius, Hot);
bpMiddle: DrawOpenRoundRectMiddle(Graphics, PC, r.Left, r.Top, r.Right - 1, r.Bottom - 1, Radius, Hot);
end;
end;
if Focus then // Draw focus line
begin
graphics.SetSmoothingMode(SmoothingModeAntiAlias);
DrawRoundRect(graphics, $E4AD89,r.Left + 1,r.Top + 1, r.Right - 3, r.Bottom - 3, Radius);
graphics.SetSmoothingMode(SmoothingModeAntiAlias);
DrawDottedRoundRect(graphics, clGray,r.Left + 2,r.Top + 2, r.Right - 5, r.Bottom - 5, Radius);
end;
fontFamily := TGPFontFamily.Create(AFont.Name);
fs := 0;
ImgX := 0;
ImgY := 0;
ImgH := 0;
ImgW := 0;
if (fsBold in AFont.Style) then
fs := fs + 1;
if (fsItalic in AFont.Style) then
fs := fs + 2;
if (fsUnderline in AFont.Style) then
fs := fs + 4;
if Assigned(Glyph) and not Glyph.Empty and (Glyph.Width > 1) and (Glyph.Height > 1) then
begin
ImgW := Glyph.Width;
ImgH := Glyph.Height;
end
else if not Picture.Empty then
begin
Picture.GetImageSizes;
ImgW := Picture.Width;
ImgH := Picture.Height;
end
else
begin
if (ImageIndex > -1) and Assigned(Images) then
begin
ImgW := Images.Width;
ImgH := Images.Height;
{end
else if Assigned(ToolImage) and not (ToolImage.Empty) and (ToolImage.Width > 1) then
begin
ImgW := ToolImage.Width;
ImgH := ToolImage.Height; }
end;
end;
if (ImgW > 0) then
ImgW := ImgW + Spacing;
if (Caption <> '') then
begin
Canvas.Font.Name := AFont.Name;
ttf := false;
GetTextMetrics(Canvas.Handle, tm);
if ((tm.tmPitchAndFamily AND TMPF_VECTOR) = TMPF_VECTOR) then
begin
if not ((tm.tmPitchAndFamily AND TMPF_DEVICE) = TMPF_DEVICE) then
begin
ttf := true;
end
end;
font := TGPFont.Create(fontFamily, AFont.Size , fs, UnitPoint);
w := BtnR.Right - BtnR.Left;
h := BtnR.Bottom - BtnR.Top;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?