IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants VCL Delphi Discussion :

Panel avec des bords ronds ....


Sujet :

Composants VCL Delphi

  1. #1
    Membre du Club
    Inscrit en
    Juin 2003
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 55
    Points : 41
    Points
    41
    Par défaut Panel avec des bords ronds ....
    Bonjour,

    Est-il possible d'avoir sous delphi un panel avec des bords arrondis ?

    Ce composant existe-t-il ?

    Merci d'avance pour votre réponse,

    Cordialement,

    Djedjeridoo

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 80
    Points : 62
    Points
    62
    Par défaut
    Non, ce composant n'existe pas de base sous delphi.

    Maintenant, il n'est surement pas compliqué a crée a partir d'un TPanel, donc il y a surement quelqu'un qui l'a créé un jour.

    reste soit a le trouver sur le net,
    soit a esperer que quelq'un sur le forum l'ai.

    bon courage.

  3. #3
    bjl
    bjl est déconnecté
    Membre averti Avatar de bjl
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : Brésil

    Informations forums :
    Inscription : Décembre 2002
    Messages : 263
    Points : 338
    Points
    338
    Par défaut
    Créer un panel à coins rond, n'est pas excessivement compliqué avec des régions

    le plus casse pied, c'est de dessiner les bordures ces coins en fonction des options borderstyle, BevelInner, BevelOuter, et BevelWidth.

    sinon, voilà déjà un début de code: il reste la partie dessin à faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    Uses Classes, Controls, ExtCtrls;
     
    Type TRoundPanel = Class(Tpanel)
      Private
        FCorner : Integer;
        FMaxCorner : Integer;
        Procedure SetCorner( Value : Integer);
        Procedure SetRgn;
      Protected
      Public
        Constructor Create(Aowner : Tcomponent);
        Procedure SetBounds( ALeft, ATop, Awidth, AHeight : Integer); override;
        Procedure Paint; Override;
        Procedure SetParent( AParent : TWinControl); Override;
      Published
        Property Corner : Integer read FCorner Write SetCorner default 10;
      End;
     
    implementation
     
    Uses math, Windows, Graphics;
     
    Constructor TRoundPanel.Create(Aowner : Tcomponent);
    Begin
    Inherited;
    FMaxCorner := 10; {nitialisation à une valeur bidon mais au poins égale à FCorner}
    FCorner := 10;
    End;
     
     
    Procedure TRoundPanel.SetCorner( Value : Integer);
    Begin
    FMaxCorner :=  min( Height, Width) div 2; {Corner doit être inférieur
      à la moitié du coté le plus petit}
    FCorner := Value;
    EnsureRange( 0, Fcorner, FMaxCorner);
    SetRgn; {mise à jour de la région}
    End;
     
     
    Procedure TRoundPanel.SetBounds( ALeft, ATop, Awidth, AHeight : Integer);
    Var
    OldHeight, OldWidth : Integer;
    Begin
    OldHeight := Height;
    OldWidth := Width;
    inherited;
    If (OldWidth <> Width) or (OldHeight <> Height) then
      SetCorner( Fcorner); {on vérifie que corner reste inférieur à la moitié du
      coté le plus petit : on en profites pour rafraichir la région même si
      Fcorner ne change pas}
    ENd;
     
     
    Procedure TRoundPanel.SetParent( AParent : TWinControl);
    Begin
    inherited;
    SetRgn;
    End;
     
    Procedure TRoundPanel.SetRgn;
    Var
      rgn : Hrgn;
      ACorner : Integer;
    Begin
    If Parent = Nil then exit; {Pour éviter une exception si pas de parent}
    {on récupère une région : les valeurs de p1 à p4 sont à vérifier : on met -1 pour left et top
    de manière à pouvoir dessiner les bordures}
    rgn := CreateRoundRectRgn(- 1,  - 1, Width + 1, Height + 1, FCorner * 2, FCorner * 2);
    SetWindowRgn(handle, rgn, True); {on assigne la région au handle du control fenètré}
    DeleteObject(Rgn); {on supprime la région après usage}
    Invalidate;  {appel à peinture}
    End;
     
     
    Procedure TRoundPanel.Paint;
    Begin
    inherited;
    // dessin des coins à implémenter
    End;

  4. #4
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Je complète le travail de bjl

    1) Il faut rajouter l'unité Themes dans le uses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Uses math, Windows, Graphics, themes;
    2) et puis ça dans l'implémentation, et vous avez Un Panel aux coins arrondis (mettre la propriété BevelWith à 2 pour de meilleurs résultats quand vous utiliserez votre Panel) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    procedure RoundFrame(Canvas: TCanvas; var Rect: TRect; TopColor, BottomColor: TColor;
      Width ,TailleCoin: Integer);
     
      procedure DoRect;
      begin
        with Canvas, Rect do
        begin
          Pen.Color := TopColor;
          RoundRect(Left,Top,Right,Bottom,TailleCoin,TailleCoin);
          Pen.Color := BottomColor;
          RoundRect(Left-1,Top,Right,Bottom,TailleCoin,TailleCoin);
        end;
      end;
     
    begin
      Canvas.Pen.Width := 1;
      Dec(Rect.Bottom); Dec(Rect.Right);
      while Width > 0 do
      begin
        Dec(Width);
        DoRect;
        InflateRect(Rect, -1, -1);
      end;
      Inc(Rect.Bottom); Inc(Rect.Right);
    end;
     
    Procedure TRoundPanel.Paint;
    const
      Alignments: array[TAlignment] of Longint = (DT_LEFT, DT_RIGHT, DT_CENTER);
    var
      Rect: TRect;
      TopColor, BottomColor: TColor;
      FontHeight: Integer;
      Flags: Longint;
     
      procedure AdjustColors(Bevel: TPanelBevel);
      begin
        TopColor := clBtnHighlight;
        if Bevel = bvLowered then TopColor := clBtnShadow;
        BottomColor := clBtnShadow;
        if Bevel = bvLowered then BottomColor := clBtnHighlight;
      end;
     
    begin
      Rect := GetClientRect;
      if BevelOuter <> bvNone then
      begin
        AdjustColors(BevelOuter);
        RoundFrame(Canvas, Rect, TopColor, BottomColor, BevelWidth,FCorner);
      end;
      RoundFrame(Canvas, Rect, Color, Color, BorderWidth,FCorner);
      if BevelInner <> bvNone then
      begin
        AdjustColors(BevelInner);
        RoundFrame(Canvas, Rect, TopColor, BottomColor, BevelWidth ,FCorner);
      end;
      with Canvas do
      begin
        if not ThemeServices.ThemesEnabled or not ParentBackground then
        begin
          Brush.Color := Color;
          FillRect(Rect);
        end;
        Brush.Style := bsClear;
        Font := Self.Font;
        FontHeight := TextHeight('W');
        with Rect do
        begin
          Top := ((Bottom + Top) - FontHeight) div 2;
          Bottom := Top + FontHeight;
        end;
        Flags := DT_EXPANDTABS or DT_VCENTER or Alignments[Alignment];
        Flags := DrawTextBiDiModeFlags(Flags);
        DrawText(Handle, PChar(Caption), -1, Rect, Flags);
      end;
    end;

Discussions similaires

  1. Menu gauche vertical avec des coins ronds
    Par matinpeys dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 16/06/2011, 23h53
  2. Des tableaux avec des bords arrondis ?
    Par whitespirit dans le forum Word
    Réponses: 14
    Dernier message: 16/06/2011, 06h55
  3. Requete SQL avec des bords !
    Par defacta dans le forum Langage SQL
    Réponses: 3
    Dernier message: 03/10/2007, 13h55
  4. Problème avec des bords phantomatiques dans un IFRAME
    Par spacexion dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 27/07/2007, 17h46
  5. Inserer des bords ronds
    Par Him dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 04/05/2006, 21h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo