📄 jvtransparentbutton.pas
字号:
function TJvTransparentButtonActionLink.IsCheckedLinked: Boolean;
begin
if FClient is TJvTransparentButton then
Result := inherited IsCheckedLinked and (TJvTransparentButton(FClient).Down = (Action as TCustomAction).Checked)
else
if FClient is TJvTransparentButton2 then
Result := inherited IsCheckedLinked and (TJvTransparentButton2(FClient).Down = (Action as TCustomAction).Checked)
else
Result := False;
end;
{$IFDEF VCL}
{$IFDEF COMPILER6_UP}
function TJvTransparentButtonActionLink.IsGroupIndexLinked: Boolean;
begin
Result := False;
end;
procedure TJvTransparentButtonActionLink.SetGroupIndex(Value: Integer);
begin
//
end;
{$ENDIF COMPILER6_UP}
{$ENDIF VCL}
procedure TJvTransparentButtonActionLink.SetChecked(Value: Boolean);
begin
if IsCheckedLinked then
begin
if FClient is TJvTransparentButton then
TJvTransparentButton(FClient).Down := Value
else
if FClient is TJvTransparentButton2 then
TJvTransparentButton2(FClient).Down := Value;
end;
end;
//=== { TJvTransparentButton } ===============================================
constructor TJvTransparentButton.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
AllowAllUp := True;
FNumGlyphs := 1;
FAutoGray := True;
FShowPressed := True;
FOffset := 1;
FBorderSize := 1;
FTransparent := True;
Flat := True;
FImList := TImageList.Create(Self);
FGlyph := TBitmap.Create;
FGrayGlyph := TBitmap.Create;
FDisabledGlyph := TBitmap.Create;
FGlyph.OnChange := GlyphChanged;
FNumGlyphs := 1;
FSpacing := 2;
FTextAlign := ttaCenter;
FWordWrap := False;
FOutline := fsExplorer;
end;
destructor TJvTransparentButton.Destroy;
begin
FGlyph.Free;
FGrayGlyph.Free;
FDisabledGlyph.Free;
// FImList.Free;
inherited Destroy;
end;
procedure TJvTransparentButton.CalcGlyphCount;
var
GlyphNum: Integer;
begin
if (Glyph <> nil) and (Glyph.Height > 0) then
begin
if Glyph.Width mod Glyph.Height = 0 then
begin
GlyphNum := Glyph.Width div Glyph.Height;
if GlyphNum > 4 then
GlyphNum := 1;
SetNumGlyphs(GlyphNum);
end;
end;
end;
procedure TJvTransparentButton.AddGlyphs(aGlyph: TBitmap; AColor: TColor; Value: Integer);
var
Bmp: TBitmap;
I, TmpWidth: Integer;
Dest, Source: TRect;
begin
FImList.Clear;
Bmp := TBitmap.Create;
try
if not aGlyph.Empty then
begin
{ destroy old list }
TmpWidth := aGlyph.Width div FNumGlyphs;
FImList.Width := TmpWidth;
FImList.Height := aGlyph.Height;
Bmp.Width := FImList.Width;
Bmp.Height := FImList.Height;
Dest := Rect(0, 0, Bmp.Width, Bmp.Height);
{ create the imagelist }
for I := 0 to FNumGlyphs - 1 do
begin
Source := Rect(I * Bmp.Width, 0, I * Bmp.Width + Bmp.Width, Bmp.Height);
Bmp.Canvas.CopyRect(Dest, aGlyph.Canvas, Source);
if I = 0 then { first picture }
begin
{ create the disabled and grayed bitmaps too }
FGrayGlyph.Assign(Bmp);
MonoBitmap(FGrayGlyph, 11, 59, 30);
FDisabledGlyph.Assign(Bmp);
BWBitmap(FDisabledGlyph);
end;
FImList.AddMasked(Bmp, Bmp.TransparentColor);
end;
{ add last }
FImList.AddMasked(FGrayGlyph, FGrayGlyph.TransparentColor);
FImList.AddMasked(FDisabledGlyph, FDisabledGlyph.TransparentColor);
end;
finally
Bmp.Free;
end;
Invalidate;
end;
procedure TJvTransparentButton.SetGlyph(Bmp: TBitmap);
begin
FGlyph.Assign(Bmp);
CalcGlyphCount;
Invalidate;
end;
procedure TJvTransparentButton.SetNumGlyphs(Value: TNumGlyphs);
begin
if FNumGlyphs <> Value then
begin
FNumGlyphs := Value;
GlyphChanged(Self);
Invalidate;
end;
end;
procedure TJvTransparentButton.SetFrameStyle(Value: TJvFrameStyle);
begin
if FOutline <> Value then
begin
FOutline := Value;
Flat := FTransparent;
Invalidate;
end;
end;
procedure TJvTransparentButton.SetTransparent(Value: Boolean);
begin
if FTransparent <> Value then
begin
FTransparent := Value;
Flat := FTransparent;
Invalidate;
end;
end;
procedure TJvTransparentButton.SetBorderWidth(Value: Cardinal);
begin
if FBorderSize <> Value then
begin
FBorderSize := Value;
Invalidate;
end;
end;
procedure TJvTransparentButton.SetWordWrap(Value: Boolean);
begin
if FWordWrap <> Value then
begin
FWordWrap := Value;
Invalidate;
end;
end;
procedure TJvTransparentButton.SetSpacing(Value: Integer);
begin
if FSpacing <> Value then
begin
FSpacing := Value;
Invalidate;
end;
end;
procedure TJvTransparentButton.SetAutoGray(Value: Boolean);
begin
if FAutoGray <> Value then
begin
FAutoGray := Value;
Invalidate;
end;
end;
procedure TJvTransparentButton.SetTextAlign(Value: TJvTextAlign);
begin
if FTextAlign <> Value then
begin
FTextAlign := Value;
Invalidate;
end;
end;
procedure TJvTransparentButton.PaintFrame(Canvas: TCanvas);
var
TmpRect: TRect;
FDrawIt: Boolean;
begin
TmpRect := Rect(0, 0, Width, Height);
{ draw the outline }
with Canvas do
begin
Brush.Color := Color;
Pen.Color := clBlack;
Pen.Width := BorderWidth;
if not Transparent then
FillRect(TmpRect);
if (bsMouseDown in MouseStates) or Down then
begin
case FrameStyle of
fsRegular:
if ShowPressed then
begin
Frame3D(Canvas, TmpRect, clBlack, clBtnHighlight, BorderWidth);
Frame3D(Canvas, TmpRect, clBtnShadow, clBtnFace, BorderWidth);
end;
fsExplorer:
if (bsMouseInside in MouseStates) or Down then
begin
if ShowPressed then
Frame3D(Canvas, TmpRect, clBtnShadow, clBtnHighlight, BorderWidth)
else
Frame3D(Canvas, TmpRect, clBtnHighlight, clBtnShadow, BorderWidth);
end;
fsIndent:
if ShowPressed then
begin
Frame3D(Canvas, TmpRect, clBlack, clBtnHighlight, BorderWidth);
Frame3D(Canvas, TmpRect, clBtnShadow, clBtnFace, BorderWidth);
end;
fsLight:
if ShowPressed then
Frame3D(Canvas, TmpRect, clBtnShadow, clBtnHighlight, BorderWidth);
fsDark:
if ShowPressed then
Frame3D(Canvas, TmpRect, cl3DDkShadow, clBtnFace, BorderWidth);
fsMono:
if ShowPressed then
Frame3D(Canvas, TmpRect, cl3DDkShadow, clBtnHighlight, BorderWidth);
end;
end
else
begin
FDrawIt := ((bsMouseInside in MouseStates) and Transparent) or not Transparent or (csDesigning in ComponentState);
case FrameStyle of
fsNone:
if csDesigning in ComponentState then
Frame3D(Canvas, TmpRect, clBlack, clBlack, 1);
fsRegular:
if FDrawIt then
begin
Frame3D(Canvas, TmpRect, clBtnHighlight, clBlack, BorderWidth);
Frame3D(Canvas, TmpRect, RGB(223, 223, 223), clBtnShadow, BorderWidth);
end;
fsExplorer:
if (bsMouseInside in MouseStates) or (csDesigning in ComponentState) then
Frame3D(Canvas, TmpRect, clBtnHighlight, clBtnShadow, BorderWidth);
fsIndent:
if FDrawIt then
begin
Frame3D(Canvas, TmpRect, clBtnShadow, clBtnHighlight, BorderWidth);
Frame3D(Canvas, TmpRect, clBtnHighlight, clBtnShadow, BorderWidth);
end;
fsLight:
if FDrawIt then
Frame3D(Canvas, TmpRect, clBtnHighlight, clBtnShadow, BorderWidth);
fsDark:
if FDrawIt then
Frame3D(Canvas, TmpRect, clBtnFace, cl3DDkShadow, BorderWidth);
fsMono:
if FDrawIt then
Frame3D(Canvas, TmpRect, clBtnHighlight, cl3DDkShadow, BorderWidth);
end;
end;
end;
end;
procedure TJvTransparentButton.PaintButton(Canvas: TCanvas);
var
Dest: TRect;
TmpWidth: Integer;
begin
with Canvas do
begin
{ find glyph bounding rect - adjust according to textalignment}
TmpWidth := FImList.Width;
if TmpWidth <= 0 then
TmpWidth := FGlyph.Width;
{ do top }
if Self.TextAlign in [ttaBottomLeft, ttaBottom, ttaBottomRight] then
Dest.Top := Spacing
else
if Self.TextAlign in [ttaTopLeft, ttaTop, ttaTopRight] then
Dest.Top := Height - FImList.Height - Spacing
else
Dest.Top := (Height - FImList.Height) div 2;
{ do left }
if Self.TextAlign = ttaLeft then
Dest.Left := Width - TmpWidth - Spacing
else
if Self.TextAlign = ttaRight then
Dest.Left := Spacing
else { left, center, right }
Dest.Left := (Width - TmpWidth) div 2;
Dest.Bottom := Dest.Top + FImList.Height;
Dest.Right := Dest.Left + TmpWidth;
if not FGlyph.Empty then
begin
DrawTheBitmap(Dest, Canvas);
FGlyph.Dormant;
end;
{ finally, do the caption }
if Length(Caption) > 0 then
DrawTheText(Dest, Canvas);
end;
end;
{ just like DrawText, but draws disabled instead }
function DrawDisabledText(DC: HDC; Caption: TCaption;
nCount: Integer; var lpRect: TRect; uFormat: Integer): Integer;
var
OldCol: Integer;
begin
OldCol := SetTextColor(DC, ColorToRGB(clBtnHighlight));
OffsetRect(lpRect, 1, 1);
DrawText(DC, Caption, nCount, lpRect, uFormat);
OffsetRect(lpRect, -1, -1);
SetTextColor(DC, ColorToRGB(clBtnShadow));
Result := DrawText(DC, Caption, nCount, lpRect, uFormat);
SetTextColor(DC, OldCol);
end;
{ ARect contains the bitmap bounds }
procedure TJvTransparentButton.DrawTheText(ARect: TRect; Canvas: TCanvas);
var
Flags, MidX, MidY: Integer;
DC: HDC; { Col: TColor; }
TmpRect: TRect;
begin
if (bsMouseInside in MouseStates) and HotTrack then
Canvas.Font := HotTrackFont
else
Canvas.Font := Self.Font;
DC := Canvas.Handle; { reduce calls to GetHandle }
if FWordWrap then
Flags := DT_WORDBREAK
else
Flags := DT_SINGLELINE;
TmpRect := Rect(0, 0, Width, Height);
{ calculate width and height of text: }
DrawText(DC, Caption, Length(Caption), TmpRect, Flags or DT_CALCRECT);
{
if FWordWrap then
Canvas.TextExtent(Caption, TmpRect, WordBreak)
else
Canvas.TextExtent(Caption, TmpRect, 0);
}
MidY := TmpRect.Bottom - TmpRect.Top;
MidX := TmpRect.Right - TmpRect.Left;
Flags := DT_CENTER;
{ div 2 and shr 1 generates the exact same Asm code... }
case Self.TextAlign of
ttaTop:
OffsetRect(TmpRect, Width div 2 - MidX div 2, ARect.Top - MidY - Spacing);
ttaTopLeft:
OffsetRect(TmpRect, Spacing, ARect.Top - MidY - Spacing);
ttaTopRight:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -