我创建了一个继承自TCornerButton的新组件,以添加下拉菜单选项。
第一个问题......
为什么我需要覆盖“AfterPaint”方法,而不是文档中描述的“Paint”方法。覆盖“画图”也不会导致任何绘图。
第二个问题......
当我使用“AfterPaint”方法绘制一个向下指向箭头时,它的偏移量约为5个像素,直到按钮获得焦点。只是将鼠标悬停在按钮上似乎无法解决问题(正如您所期望的那样,重复出现)。我在代码中使用和不使用“ScalePoint”并且每次都错了。 它在设计时也显示在错误的位置。一旦按钮在运行时获得焦点,箭头就会移动到预期位置。当它失去焦点时,它会移回错误的位置。 仅供参考。 “宽度”没有改变 - 我已经测试过了。
procedure TLFButton.AfterPaint;
var
down_arrow: TPolygon;
x, y: Extended;
begin
inherited;
if FDropDownButton then
begin
Canvas.Fill := TText(FindStyleResource('text')).Fill;
x := Width - 12;
y := (Height / 2) - 3;
SetLength(down_arrow, 3);
down_arrow[0] := ScalePoint(PointF(x, y), Scale.X, Scale.Y);
down_arrow[1] := ScalePoint(PointF(x+8,y), Scale.X, Scale.Y);
down_arrow[2] := ScalePoint(PointF(x+4,y+6), Scale.X, Scale.Y);
Canvas.FillPolygon(down_arrow, 255);
end;
end;
答案 0 :(得分:1)
另一种方法是使用StyleLookup。 通过使用StyleLookup,设计人员可以在不更改代码的情况下更改向下箭头。
constructor TLFButton.Create(AOwner: TComponent);
begin
inherited;
FDropDownButton := true;
end;
procedure TLFButton.SetDropDownButton(const Value: boolean);
var
obj: TFmxObject;
begin
FDropDownButton := Value;
obj := FindStyleResource('dropdownbutton');
if obj is TControl then
TControl(obj).visible := Value;
end;
将下面的代码保存在LFButton.Style文本文件中并将其加载到样书中。 TPath =小向下箭头。
object _1: TLayout
Align = alClient
Position.Point = '(0,33)'
Width = 842.000000000000000000
Height = 715.000000000000000000
object TLayout
StyleName = 'LFButtonStyle'
Position.Point = '(375,345)'
Width = 91.000000000000000000
Height = 24.000000000000000000
DesignVisible = False
object TRectangle
StyleName = 'background'
Align = alContents
Width = 91.000000000000000000
Height = 24.000000000000000000
HitTest = False
Fill.Kind = bkGradient
Fill.Gradient.Points = <
item
Color = claWhite
end
item
Color = xFFFEFEFE
Offset = 0.472727268934249900
end
item
Color = xFFDDDDDD
Offset = 0.512727260589599600
end
item
Color = xFFDBDBDB
Offset = 1.000000000000000000
end>
Stroke.Color = xFF989898
XRadius = 3.000000000000000000
YRadius = 3.000000000000000000
object TGradientAnimation
Duration = 0.200000002980232200
Trigger = 'IsMouseOver=true;IsPressed=false'
StartValue.Points = <
item
Color = claWhite
end
item
Color = xFFFEFEFE
Offset = 0.472727268934249900
end
item
Color = xFFDDDDDD
Offset = 0.512727260589599600
end
item
Color = xFFDBDBDB
Offset = 1.000000000000000000
end>
StopValue.Points = <
item
Color = xFFA5D9FF
end
item
Color = xFFA5D9FF
Offset = 0.472727268934249900
end
item
Color = xFFA5D9FF
Offset = 0.512727260589599600
end
item
Color = xFFA5D9FF
Offset = 1.000000000000000000
end>
PropertyName = 'Fill.Gradient'
end
object TGradientAnimation
Duration = 0.200000002980232200
Trigger = 'IsMouseOver=false;IsPressed=false'
StartValue.Points = <
item
Color = xFFA5D9FF
end
item
Color = xFFA5D9FF
Offset = 0.472727268934249900
end
item
Color = xFFA5D9FF
Offset = 0.512727260589599600
end
item
Color = xFFA5D9FF
Offset = 1.000000000000000000
end>
StopValue.Points = <
item
Color = claWhite
end
item
Color = xFFFEFEFE
Offset = 0.472727268934249900
end
item
Color = xFFDDDDDD
Offset = 0.512727260589599600
end
item
Color = xFFDBDBDB
Offset = 1.000000000000000000
end>
PropertyName = 'Fill.Gradient'
end
object TColorAnimation
Duration = 0.200000002980232200
Inverse = True
Trigger = 'IsMouseOver=false;IsPressed=true'
StartValue = xFF34BFFE
StopValue = xFFA5D9FF
PropertyName = 'Fill.Color'
end
object TColorAnimation
Duration = 0.200000002980232200
Trigger = 'IsMouseOver=true;IsPressed=true'
StartValue = xFF34BFFE
StopValue = xFFA5D9FF
PropertyName = 'Fill.Color'
end
end
object TText
StyleName = 'text'
Align = alClient
Position.Point = '(5,3)'
Locked = True
Width = 66.000000000000000000
Height = 18.000000000000000000
Padding.Rect = '(5,3,5,3)'
HitTest = False
Text = 'button'
end
object TGlowEffect
Trigger = 'IsFocused=true'
Enabled = False
Softness = 0.200000002980232200
GlowColor = x82005ACC
Opacity = 0.899999976158142100
end
object TLayout
Align = alRight
Position.Point = '(76,0)'
Locked = True
Width = 15.000000000000000000
Height = 24.000000000000000000
object TPath
StyleName = 'dropdownbutton'
Align = alCenter
Position.Point = '(3,9)'
Width = 8.000000000000000000
Height = 5.000000000000000000
HitTest = False
Fill.Color = claBlack
Stroke.Kind = bkNone
Data.Path = {
04000000000000000000000000000000010000000000803F0000000001000000
0000003F0000803F030000000000000000000000}
end
end
end
end