2011-10-13 4 views
0

J'ai créé un nouveau composant qui hérite de TCornerButton pour ajouter une option de menu déroulant.Dessiner sur la toile d'un TCornerButton se trompe de position

Première question ...

Pourquoi ai-je besoin de remplacer la méthode « AfterPaint » plutôt que la méthode « Paint » comme décrit dans la documentation. Surcharger la "Peinture" n'a pas abouti à un dessin.

deuxième question ...

Lorsque j'utilise la méthode « AfterPaint » pour dessiner un peu plus bas flèche pointant vers son décalage à droite d'environ 5 pixels jusqu'à ce que le bouton se concentrer. Juste survoler le bouton ne semble pas résoudre le problème (comme vous vous attendez à ce qu'un repaint se produise). J'ai lié ceci avec et sans le "ScalePoint" dans le code et chaque fois c'est faux. Il apparaît également dans la mauvaise position au moment du design. Dès que le bouton est mis au point à l'exécution, la flèche se déplace vers la position attendue. Quand il perd le focus, il revient à la mauvaise position. FYI. La "largeur" ​​ne change pas - j'ai testé pour cela.

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; 

Répondre

1

Une approche différente consiste à utiliser un StyleLookup. En utilisant un StyleLookup, un concepteur est capable de changer la flèche pointant vers le bas sans changer le code. Enregistrez le code ci-dessous dans un fichier texte LFButton.Style et chargez-le dans un StyleBook. TPath = la petite flèche pointant vers le bas.

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

Je peux voir comment c'est ainsi que les choses devraient être faites. Cela signifierait cependant de modifier tous les styles que je prévois de distribuer avec le produit correct? Cela semble désordonné d'essayer de maintenir les styles. Lorsque Embarcadero publie une mise à jour avec des modifications aux styles standards, que doit-on faire? – Martin

+0

Fusionnez votre propre style dans un style par défaut. Modifier un style par défaut est désordonné. Voici un exemple de fusion de styles: http://stackoverflow.com/questions/7788440/correct-way-to-create-styles-for-custom-components/7811201#7811201 –

+0

Je n'ai jamais eu de réponse d'Embarcarero à ce sujet un mais la méthode de style est certainement le moyen de le faire. – Martin

Questions connexes