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

C++Builder Discussion :

Paint d'un composant en boucle ?


Sujet :

C++Builder

  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Par défaut Paint d'un composant en boucle ?
    Re-bonjour,

    je travail toujours sur le même composant. Je surcharge la fonction Paint...lorsque j'ajoute ce composant à une fiche je le vois qui "clignote" (redessin en permanence). Et pas moyen de modifier les TPicture (plantage).

    Voila mon 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
     
    __fastcall TImageButton::TImageButton(TComponent* Owner)
       : TImage(Owner)
    {
       down = false;
     
       picture_down = new TPicture();
     
       if ( picture_down == NULL )
       {
          MessageDlg("Erreur : impossible de créer le TPicture pour PictureDown.",
             mtError, TMsgDlgButtons() << mbOK, 0 );
     
          Free();
       }
    }
    //---------------------------------------------------------------------------
    __fastcall TImageButton::~TImageButton( void )
    {
    // TImage::~TImage();
       delete picture_down;
    }
    //---------------------------------------------------------------------------
    void __fastcall TImageButton::SetPictureDown ( TPicture *value )
    {
       picture_down->Assign( value );
     
       if ( down )
          this->Invalidate();
    }
    //---------------------------------------------------------------------------
    void __fastcall TImageButton::MouseDown ( System::TObject* Sender,
                   TMouseButton Button, Classes::TShiftState Shift, int X, int Y )
    {
       TImage::OnMouseDown( Sender, Button , Shift, X, Y );
       this->down = true;
       this->Invalidate();
    }
    //---------------------------------------------------------------------------
    void __fastcall TImageButton::Paint( void )
    {
       if ( down )
          this->Canvas->Draw( 0, 0, this->picture_down->Graphic );
       else
          this->Canvas->Draw( 0, 0, this->Picture->Graphic );
    }
    et le .h :

    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
     
    class PACKAGE TImageButton : public TImage
    {
    private:
          // Propriétés
       TPicture *picture_down;
     
         // Autres variables
       bool  down;
     
          // Fonctions
       void __fastcall SetPictureDown ( TPicture *value );
    protected:
       virtual void __fastcall Paint ( void );
       virtual void __fastcall MouseDown ( System::TObject* Sender,
             TMouseButton Button, Classes::TShiftState Shift, int X, int Y );
    public:
       __fastcall TImageButton(TComponent* Owner);
       __fastcall ~TImageButton( void );
    __published:
       __property OnMouseDown;
       __property Picture;
     
       __property TPicture* PictureDown = {read = picture_down, write = SetPictureDown };
       __property bool      Down = { read = down, write = down };
    Merci d'avance pour votre aide !

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 49
    Par défaut
    Bonjour,

    Cela est dû au fait que le OnPaint génère systématiquement un rafraichissement de l'image et donc un nouvel événement OnPaint.

    Vous pourriez peut-être mémoriser le dernier état du tracé. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void __fastcall TImageButton::Paint( void )
    {
       if ( down )
       {
          if (!DownPainted) this->Canvas->Draw( 0, 0, this->picture_down->Graphic );
          DownPainted=true;
       }
       else
       {
          if (DownPainted) this->Canvas->Draw( 0, 0, this->Picture->Graphic );
          DownPainted=false;
       }
    }
    Cordialement,

    Michel.

  3. #3
    CGi
    CGi est déconnecté
    Expert confirmé
    Avatar de CGi
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 061
    Détails du profil
    Informations personnelles :
    Localisation : France, Allier (Auvergne)

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 061
    Par défaut
    Je ne comprend pas pourquoi ton composant decend de TImage ?
    Si c'est un contrôle graphic fait le decendre de TGraphicControl si c'est un
    contrôle fenétré fait le decendre de TCustomControl
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    C'est ce que je pense aussi, depuis un TCustomControl avec deux propriétés TPicture.

    Ou alors faire un swap au niveau des Bitmaps puisque c'est le bitmap qui s'affiche dans un TImage.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TGraphics::TBitmap *sw;
    sw = Picture->Bitmap; //bitmap du TImage 
    Picture->Bitmap = PictureDown->Bitmap;
    PictureDown->Bitmap = sw;
    A plus !

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Par défaut
    Ok je vais essayer avec TCustomControl.

    Je suis parti d'un TImage car je voulais reprendre le fonctionnement d'un TImage avec juste un TPicture en plus...

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Il faut quand même essayer la permutation des bitmaps.

    A plus !

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Par défaut
    J'ai fait la permutation des bitmap, ou presque, et cela fonctionne bien.

    Merci

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

Discussions similaires

  1. [Débutant] composant multiplier boucle
    Par adelcrb dans le forum C#
    Réponses: 10
    Dernier message: 26/08/2013, 20h14
  2. Problème de paint avec un composant personnalisé
    Par yuuzhantar dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 21/08/2009, 11h48
  3. Réponses: 2
    Dernier message: 19/03/2009, 13h54
  4. Afficher composants SWING boucle jeu
    Par billynirvana dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 06/10/2007, 08h32
  5. composant en boucle
    Par sefir dans le forum C++Builder
    Réponses: 4
    Dernier message: 03/05/2006, 20h31

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