2011-10-13 2 views
0

드롭 다운 메뉴 옵션을 추가하기 위해 TCornerButton에서 상속 한 새 구성 요소를 만들었습니다.TCornerButton 캔버스에 드로잉 위치가 잘못되었습니다

첫 번째 질문 ...

이유는이 문서에 설명 된대로 오히려 다음 "그림판"방법을 "AfterPaint"메서드를 재정의해야합니까. "페인트"를 재정의해도 그림이 나타나지 않았습니다.

두 번째 질문 ...

내가 화살표 가리키는 약간을 그립니다 "AfterPaint"방법을 사용 하는가하면 그 버튼에 포커스 때까지 권리에 대한 5 픽셀 오프셋. 버튼 위로 마우스를 가져 가면 문제가 해결되지 않습니다 (다시 칠하기를 기대할 수 있음). 나는이 코드를 "ScalePoint"의 유무와 상관없이 매번 묶었습니다. 디자인 타임에 잘못된 위치에도 표시됩니다. 런타임에 버튼이 포커스를 얻 자마자 화살표가 예상 위치로 이동합니다. 포커스가 풀리면 잘못된 위치로 다시 이동합니다. FYI. "너비"는 변함이 없습니다 - 나는 그것을 테스트했습니다.

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; 

답변

1

다른 접근 방식은 StyleLookup을 사용하는 것입니다. 디자이너는 StyleLookup을 사용하여 코드를 변경하지 않고 아래쪽 화살표를 변경할 수 있습니다. LFButton.Style 텍스트 파일에서 아래

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; 

저장 코드와는 StyleBook에로드합니다. 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 
+0

나는 이것이 어떻게 이루어져야 하는지를 알 수 있습니다. 그러나 이것은 내가 제품과 함께 배포 할 모든 스타일을 수정하는 것을 의미 할 것입니까? 스타일을 유지하려고하면 지저분 해 보입니다. Embarcadero가 표준 스타일의 변경 사항으로 업데이트를 릴리즈 할 때 무엇을해야합니까? – Martin

+0

자신의 스타일을 기본 스타일로 병합합니다. 기본 스타일을 수정하는 것은 지저분합니다. 다음은 스타일을 병합하는 예제입니다. http://stackoverflow.com/questions/7788440/correct-way-to-create-styles-for-custom-components/7811201#7811201 –

+0

이 문제에 대한 Embarcarero의 답변을 얻지 못했습니다. 하나지만 스타일 방법은 확실히 이것을하는 방법입니다. – Martin

관련 문제