【问题标题】:Drawing on the canvas of a TCornerButton is getting the position wrong在 TCornerButton 的画布上绘制位置错误
【发布时间】:2011-10-13 22:55:48
【问题描述】:

我创建了一个继承自 TCornerButton 的新组件以添加下拉菜单选项。

第一个问题...

为什么我需要重写“AfterPaint”方法而不是文档中描述的“Paint”方法。覆盖“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;

【问题讨论】:

    标签: delphi delphi-xe2 firemonkey


    【解决方案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
    

    【讨论】:

    • 我可以看到这样的事情应该怎么做。然而,这意味着修改我计划与产品一起分发的所有样式对吗?试图保持风格听起来很混乱。当 Embarcadero 发布对标准样式进行更改的更新时,应该怎么做?
    • 将您自己的样式合并为默认样式。修改默认样式很麻烦。以下是合并样式的示例:stackoverflow.com/questions/7788440/…
    • 我从来没有从 Embarcarero 那里得到答案,但风格方法绝对是做到这一点的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    相关资源
    最近更新 更多