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

Langage Delphi Discussion :

[GDI+] Problèmes de rafraîchissement


Sujet :

Langage Delphi

  1. #1
    ILP
    ILP est déconnecté
    Membre confirmé
    Avatar de ILP
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2002
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 258
    Points : 609
    Points
    609
    Par défaut [GDI+] Problèmes de rafraîchissement
    Bonjour,
    J'utilise actuellement l'API GDI+ de Progdigy pour dessiner des cadres dans mon application avec des TPaintBox.
    Les cadres ressemblent à ça :
    Nom : CaptureOK.png
Affichages : 90
Taille : 2,1 Ko
    Mais, j'ai un petit problème de rafraîchissement quand je passe une autre fenêtre par dessus le cadre. Ce qui donne ça :
    Nom : CapturePasOK.png
Affichages : 85
Taille : 2,6 Ko
    Voici le code que j'utilise dans le OnPaint du TPaintBox :
    Code Pascal : 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
    procedure TForm1.PB_EtatPaint(Sender: TObject);
    const
      Coin = 7.5;
      Arc  = 2 * Coin;
    var
      Dessin: TGPGraphics;
      Crayon: TGPPen;
      Degrade: TGPLinearGradientBrush;
      Chemin: TGPGraphicsPath;
      Larg, Haut: Integer;
    begin
      // Créer le dessin
      Dessin := TGPGraphics.Create(TPaintBox(Sender).Canvas.Handle);
      Dessin.SetCompositingQuality(CompositingQualityHighQuality);
      Dessin.SetSmoothingMode(SmoothingModeAntiAlias);
     
      // Créer le crayon pour les contours
      Crayon := TGPPen.Create(MakeColor($00, $80, $C0));
     
      // Créer le dégradé de couleur
      with TPaintBox(Sender) do
        Degrade := TGPLinearGradientBrush.Create(MakeRect(Canvas.ClipRect),
          MakeColor($FF, $FF, $FF), ColorRefToARGB(ColorToRGB(Color)),
          LinearGradientModeVertical);
     
      // Initialise le chemin
      Chemin := TGPGraphicsPath.Create();
      try
        with TPaintBox(Sender) do
        begin
          Larg := Width - 1;
          Haut := Height - 1;
        end;
     
        with Chemin do
        begin
          // Haut
          AddLine(Coin, 0, Larg - Coin, 0);
          // Coin haut-droit
          AddArc(Larg - Arc, 0, Arc, Arc, 270, 90);
          // Droit
          AddLine(Larg, Coin, Larg, Haut - Coin);
          // Coin bas-droit
          AddArc(Larg - Arc, Haut - Arc, Arc, Arc, 0, 90);
          // Bas
          AddLine(Larg - Coin, Haut, Coin, Haut);
          // Coin bas-gauche
          AddArc(0, Haut - Arc, Arc, Arc, 90, 90);
          // Gauche
          AddLine(0, Haut - Coin, 0, Coin);
          // Coin haut-gauche
          AddArc(0, 0, Arc, Arc, 180, 90);
        end;
     
        with Dessin do
        begin
          Clear(ColorRefToARGB(ColorToRGB(TPaintBox(Sender).Color)));
          DrawPath(Crayon, Chemin);
          FillPath(Degrade, Chemin);
        end;
      finally
        Crayon.Free();
        Degrade.Free();
        Chemin.Free();
        Dessin.Free();
      end;
    end;
    Est-ce que quelqu'un saurai d'où vient le problème ? Si ça se trouve c'est un truc tous con que j'ai oublié .
    Merci d'avance de votre aide.

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 691
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 691
    Points : 13 121
    Points
    13 121
    Par défaut
    Je ne connais pas spécialement GDI+, mais ce que l'on constate est que tu calcules un dégradé correspondant à la fiche complête, mais que tu ne le reproduit que sur le ClipRect (la zone précédemment recouverte devant être rafraîchie).

  3. #3
    ILP
    ILP est déconnecté
    Membre confirmé
    Avatar de ILP
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2002
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 258
    Points : 609
    Points
    609
    Par défaut
    Exact, je me doutais que c'était un truc tous bête.
    Voici, la partie du code corrigée :
    Code Pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      // Créer le dégradé de couleur
      with TPaintBox(Sender) do
        Degrade := TGPLinearGradientBrush.Create(MakeRect(ClientRect),
          MakeColor($FF, $FF, $FF), ColorRefToARGB(ColorToRGB(Color)),
          LinearGradientModeVertical);
    Merci pour ton aide .

  4. #4
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    utilise un backbuffer (Tbitmap)

    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
     
     
    type
      {Form} = class(TForm)
        {PaintBox} : TPaintBox;
      private
        fBackBuffer : Tbitmap;
      end;
     
    // .... //
     
    procedure {Form.OnCreate};
    begin
      DoubleBuffered := true;
     
      fBackBuffer := TBitmap.Create;
      fBackBuffer.pixelFormat := pf32bit;
    end;
     
    procedure {Form.OnDestroy};
    begin
      fBackBuffer.Free;
    end;
     
    procedure {PaintBox.OnPaint};
    var
      GPX : TGPGraphics;
      GPP : TGPPen;
      GPB : TGPSolidBrush;
      GPF : TGPFont;
    begin
      if not Assigned(fBackBuffer) then
        exit;
     
      BackBuffer.Width := {PaintBox}.Width;
      BackBuffer.Height := {PaintBox}.Height;
     
      GPX := TGPGraphics.Create(fBackBuffer.Canvas.Handle);
     
      { Ton code ici :: on dessine uniquement sur fBackBuffer}
     
      {PaintBox}.Canvas.Draw(0, 0, BackBuffer);
    end;
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  5. #5
    ILP
    ILP est déconnecté
    Membre confirmé
    Avatar de ILP
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2002
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 258
    Points : 609
    Points
    609
    Par défaut
    Merci pour l'astuce Docteur .
    Je pense que ce bout de code pourra mettre utile quand j'aurai beaucoup de dessins à effectuer avec GDI+.

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

Discussions similaires

  1. Problème de rafraîchissement
    Par vali7 dans le forum Langage
    Réponses: 1
    Dernier message: 18/04/2006, 18h12
  2. Réponses: 2
    Dernier message: 27/02/2006, 13h27
  3. [GDI] Problème de sauvegarde d'une bitmap
    Par Jedy dans le forum MFC
    Réponses: 1
    Dernier message: 15/02/2006, 15h23
  4. [MFC] Problème de rafraîchissement
    Par nmarf dans le forum MFC
    Réponses: 5
    Dernier message: 16/09/2005, 10h55
  5. Problème de rafraîchissement de données...
    Par Alain Dionne dans le forum Bases de données
    Réponses: 3
    Dernier message: 06/03/2004, 21h07

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