2017-10-09 6 views
2

J'essaie d'utiliser Canvas pour peindre une forme de type dialogue. Je peux y mettre des bordures arrondies et un rectangle arrondi comme en-tête/titre. Je ne veux remplir que le titre avec un pinceau.Delphi 7 - Comment remplir un rectangle arrondi avec une brosse?

see form here

Cependant, je me bats pour remplir ce titre. Lorsque vous utilisez FillRect, tout le formulaire est repeint. J'ai essayé de chercher ici, donc si j'ai raté, il suffit de me montrer où aller. Sinon, comment puis-je le faire? En utilisant Delphi 7, événement OnPaint.

procedure TCustomDialog.FormPaint(Sender: TObject); 
var 
    Rect: TRect; 
    BorderColor: TColor; 
    BrushColor: TColor; 
begin 
    // Rect for Form's borders; 
    Rect.Left := 0; 
    Rect.Top := 0; 
    Rect.Right := ClientWidth; 
    Rect.Bottom := ClientHeight; 

    BorderColor := HtmlToTColor('#ffffff'); 
    BrushColor := HtmlToTColor('#ffffff'); 

    // Here I set the colors of Canvas.Pen (border) and Canvas.Brush (Filling), 
    // similar to Bootstrap themes/classes (Default, Success, Warning, Danger); 
    case DialogType of 
    dtInformation: 
    begin 
     BorderColor := HtmlToTColor(Header_Color_Pen_Information); 
     BrushColor := HtmlToTColor(Header_Color_Brush_Information); 
    end; 

    dtSuccess: 
    begin 
     BorderColor := HtmlToTColor(Header_Color_Pen_Success); 
     BrushColor := HtmlToTColor(Header_Color_Brush_Success); 
    end; 

    dtWarning: 
    begin 
     BorderColor := HtmlToTColor(Header_Color_Pen_Warning); 
     BrushColor := HtmlToTColor(Header_Color_Brush_Warning); 
    end; 

    dtError: 
    begin 
     BorderColor := HtmlToTColor(Header_Color_Pen_Error); 
     BrushColor := HtmlToTColor(Header_Color_Brush_Error); 
    end; 
    end; 

    with Canvas do 
    begin 
    Pen.Color := BorderColor; 
    Pen.Width := Form_Pen_Width; 

    // Draw rounded borders for Form; 
    RoundRect(1, 1, Rect.Right - 1, Rect.Bottom - 1, Form_Border_Radius - 1, Form_Border_Radius - 1); 

    // Rect for Dialog's Header; 
    Rect.Left := Component_Gutter; 
    Rect.Top := Component_Gutter; 
    Rect.Right := ClientWidth - Component_Gutter; 
    Rect.Bottom := Form_Header_Height; 

    RoundRect(Component_Gutter, Component_Gutter, ClientWidth - Component_Gutter, Form_Header_Height, 
    Form_Border_Radius - 2, Form_Border_Radius - 2); 

    Brush.Color := BrushColor; 
    FillRect(Rect); 
    end; 
end; 
+0

Votre lien d'image est court en. Merci de ne pas héberger d'images sur des sites externes. StackOverflow a son propre hébergement d'image. Veuillez télécharger votre image directement sur StackOverlow. –

+0

@RemyLebeau Édité. –

+3

Dans les préparations pour dessiner le rectangle arrondi, définissez 'Brush' à la couleur que vous voulez qu'il soit rempli. À partir de doc: * Utilisez RoundRect pour dessiner un rectangle arrondi à l'aide de Pen et remplissez-le avec Brush *. Si je comprends votre code, déplacez la ligne 'Brush.Color: = BrushColor;' avant l'appel 'RoundRect()' et supprimez l'appel 'FillRect()'. –

Répondre

7

Lorsque vous préparez-vous à dessiner le rectangle arrondi, définir Brush.Color d'avoir la couleur que vous voulez que le rectangle à remplir avec, avant de dessiner.

Le Documentation pour Delphi 7 dit:

rectangle
Dessine un rectangle sur la toile avec son coin supérieur gauche au point (X1, Y1) et son coin inférieur droit au point (X2 , Y2). Utilisez Rectangle pour dessiner une boîte en utilisant Pen et remplissez-la à l'aide de Brush.

RoundRect
Dessine un rectangle avec des coins arrondis sur le canevas.

De Delphi XE7 doc:

Utilisez RoundRect pour dessiner un rectangle arrondi en utilisant un stylo et le remplir avec brosse.

Donc, vous devez définir les couleurs pour Pen et Brush avant d'appeler RoundRect()

Le dernier bloc de code doit être conforme à

with Canvas do 
    begin 
    Pen.Color := BorderColor; 
    Pen.Width := Form_Pen_Width; 
    Brush.Color := BrushColor; // Add this line to control which fill color the form will have 

    // Draw rounded borders for Form; 
    RoundRect(1, 1, Rect.Right - 1, Rect.Bottom - 1, Form_Border_Radius - 1, Form_Border_Radius - 1); 

    // Rect for Dialog's Header; 
    Rect.Left := Component_Gutter; 
    Rect.Top := Component_Gutter; 
    Rect.Right := ClientWidth - Component_Gutter; 
    Rect.Bottom := Form_Header_Height; 

    Brush.Color := clYellow; // This line defines the fill color of the "header" 
    RoundRect(Component_Gutter, Component_Gutter, ClientWidth - Component_Gutter, Form_Header_Height, Form_Border_Radius - 2, Form_Border_Radius - 2); 

    Brush.Color := BrushColor; // Resets the brush color to the same as the form has 
// FillRect(Rect); Remove this line, as it overdraws the "header" incl. its border 
    end; 

Et un exemple d'image:

enter image description here

1

Pour remplir une forme non rectangulaire, on peut créer un HRGN de la forme souhaitée, par exemple avec la fonction Win32 CreateRoundRectRgn(), puis remplir la toile en utilisant ce HRGN avec la fonction Win32 FillRgn().

Alternativement, après avoir dessiné les frontières solides autour de la zone souhaitée, utilisez TCanvas.FloodFill() pour le remplir.