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 :

Comment ajouter un effet relief sur les rectangles que je dessine ?


Sujet :

Composants VCL Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 624
    Points : 199
    Points
    199
    Par défaut Comment ajouter un effet relief sur les rectangles que je dessine ?
    Bonjour à tous,

    sur un canvas tout simple je dessine un rectangle. Je trouve le dessin un peu trop simple, je voudrais donc y ajouter un effet "relief", alors j'ai essayé de dessiner un autre rectangle de couleur grise mais l'effet n'est pas très réussi.

    auriez vous une idée plus "pro" ?

    Merci pour vos conseils !
    Amicalement,
    Bruno

    voici le bout de code :

    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
    81
    82
    83
    84
    85
    86
    87
    PROCEDURE TBCSNode.Draw( Canvas : TCanvas );
     CONST
        Dx : Integer = -2;
        Dy : Integer = -2;
     VAR R : TRect;
         x1, y1, x2, y2: Integer;
         W, H : Integer;
         s : STRING;
         c: PChar;
     BEGIN
      IF Visible THEN
       BEGIN
        W:=Width;
        H:=Height;
        x1:=x-W DIV 2;
        y1:=y-H DIV 2;
        x2:=x1+W;
        y2:=y1+H;
        WITH Canvas DO
         BEGIN
     
          // Ici pour l'ombrage
          if FShadow then
          Begin
            Brush.Color:=clGray;
            Pen.Color:=clGray;
            CASE FShape OF
             stRectangle, stSquare      : Rectangle(x1-Dx, y1-Dy, x2-Dx, y2-Dy);
             stRoundRect, stRoundSquare : RoundRect(x1-Dx, y1-Dy, x2-Dx, y2-Dy, 16, 16);
             stEllipse, stCircle        : Ellipse(x1-Dx, y1-Dy, x2-Dx, y2-Dy);
            END;
          End;
     
          Brush.Color:=clWhite;
          Pen.Color:=clBlack;
     
          Brush.Style:=bsSolid;
          IF (FColor<>clNone) THEN
           Brush.Color:=FColor;
          CASE FShape OF
           stRectangle, stSquare      : Rectangle(x1, y1, x2, y2);
           stRoundRect, stRoundSquare : RoundRect(x1, y1, x2, y2, 16, 16);
           stEllipse, stCircle        : Ellipse(x1, y1, x2, y2);
          END;
     
          IF (FName<>'') THEN
           BEGIN
            c:=PChar(FName);
     
            If FShowAccelChar then
              DrawText(Canvas.Handle, c, Length(FName), R, DT_CALCRECT)
            Else
              DrawText(Canvas.Handle, c, Length(FName), R, DT_CALCRECT or DT_NOPREFIX);
     
            H:=R.Bottom-R.Top;
            W:=R.Right-R.Left;
     
            R.Left:=(x1+x2-W) div 2;
            R.Right:=R.Left+W;
     
            R.Top:=(y1+y2-H) div 2;
            R.Bottom:=R.Top+H;
     
            Brush.Style:=bsClear;
            case FTextAlign of
              0 : If FShowAccelChar then
                    DrawText(Canvas.Handle, c, Length(FName), R, DT_LEFT)
                  Else
                    DrawText(Canvas.Handle, c, Length(FName), R, DT_LEFT or DT_NOPREFIX);
              1 : If FShowAccelChar then
                    DrawText(Canvas.Handle, c, Length(FName), R, DT_CENTER)
                  Else
                    DrawText(Canvas.Handle, c, Length(FName), R, DT_CENTER or DT_NOPREFIX);
              2 : If FShowAccelChar then
                    DrawText(Canvas.Handle, c, Length(FName), R, DT_RIGHT)
                  Else
                    DrawText(Canvas.Handle, c, Length(FName), R, DT_RIGHT or DT_NOPREFIX);
            else
              If FShowAccelChar then
                DrawText(Canvas.Handle, c, Length(FName), R, DT_CENTER)
              Else
                DrawText(Canvas.Handle, c, Length(FName), R, DT_CENTER or DT_NOPREFIX);
            end;
           END;
         END;
       END;
     END; {* PROC .Draw *}

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    bonjour, l'effet 3D est généralement obtenu en utilisant 2 couleurs...prend une image écran d'un écran Windows et agrandi la, tu verras qu'un bouton est fait d'un cadre noir, et de deux lignes blanches et deux lignes grises par exemple

  3. #3
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    regarde peut etre du cote de la fonction DrawEdgede l'API windows

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 624
    Points : 199
    Points
    199
    Par défaut
    Bonjour à tous,

    effectivement la solution serait d'utiliser DrawEdge mais alors j'ai ceci comme problème dans mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    var
      aRect : TRect
     
    ...
     
    stRectangle, stSquare      : Begin
                                          aRect := Rect(x1-Dx, y1-Dy, x2-Dx, y2-Dy);
                                          DrawEdge(Handle, aRect, EDGE_RAISED, BF_RECT);
                                        End;
    j'ai une erreur sur le Rect(
    [Erreur] BCSNode.pas(637): Opérateur ou point-virgule manquant

    est-ce normal que quand je pointe la souris sur Rect j'ai :
    prop BCSGraphNode.Rect : TRect - BCSNode.pas

    même avec Windows.Rect j'ai l'erreur suivante...
    [Erreur] BCSNode.pas(637): Identificateur non déclaré : 'Rect'

    Désolé de vous embêter avec mes problèmes...

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 624
    Points : 199
    Points
    199
    Par défaut
    Re-Bonjour à tous,

    la solution est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    aRect := Classes.Rect(x1-Dx, y1-Dy, x2-Dx, y2-Dy);
    Amicalement,
    Bruno

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 16/03/2010, 12h07
  2. comment ajouté l'effet de lumiere sur ma scene ?
    Par the-morpher dans le forum XNA/Monogame
    Réponses: 6
    Dernier message: 30/04/2009, 22h53
  3. Réponses: 2
    Dernier message: 19/02/2006, 13h46
  4. Comment faire un tail -f sur les logs binaires mysql-bin ?
    Par mediaforest dans le forum Requêtes
    Réponses: 8
    Dernier message: 24/09/2005, 13h34

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