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 :

[PaintBox] Persistance du dessin non créé dans onPaint


Sujet :

C++Builder

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 7
    Points : 5
    Points
    5
    Par défaut [PaintBox] Persistance du dessin non créé dans onPaint
    Bonjour,

    J'ai créé un PaintBox dans lequel l'utilisateur peut dessiner en :
    • créant une forme, une ligne, ou dessiner à main levée,
      choisissant la taille de crayon, la couleur


    J'ai géré tout ça avec les événements onMouseMove, onMouseDown, onMouseUp.

    Le problème est que le dessin créé n'est pas persistant car "il est 'effacé' dès qu'un message WM_PAINT sera reçu et aura traité le composant PaintBox."

    Comment faire en sorte que mon dessin soit persistant ?

    J'avais pour idée de sauvegarder le dessin entier du paintBox puis de le réaffecter au paintBox lors de l'événement onPaint. Comment faire cela ?
    (j'ai essayé de sauvegarder PaintBox1->Canvas mais j'arrive pas à le réaffecter...)

    Le problème est de taille étant donné qu'il peut y avoir des traits de plusieurs tailles, de plusieurs couleurs.... (donc sauvegarder tous les mouvements de souris ne serait pas gérable !)

    J'espère que vous pourrez m'aider !! Merci d'avance
    --> Princesse
    Il n'est pas difficile d'avoir une idée. Ce qui est difficile, c'est de les avoir toutes.

  2. #2
    Membre chevronné
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Points : 1 911
    Points
    1 911
    Par défaut
    En principe, on dessine hors écran dans un bitmap et on dessine le bitmap via la méthode Canvas->Draw dans l'événement OnPaint du PaintBox. À chaque modification du bitmap, vous pouvez aussi forcer un Paint de manière à ce que l'utilisateur voit ses modifications à l'écran. Dans ces conditions, le dessin sera persistant.

    À bientôt
    Gilles

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Merci.

    J'ai essayé de "dessiner" dans un bitmap (invisible)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pBitmap->Canvas->LineTo(X, Y);
    puis dans le onPaint, dans le onPaint du PaintBox faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    paintBox->Canvas->Draw(0,0,pBitmap);
    Mais il me dessine rien dans le PaintBox
    --> Princesse
    Il n'est pas difficile d'avoir une idée. Ce qui est difficile, c'est de les avoir toutes.

  4. #4
    JEG
    JEG est déconnecté
    Membre éclairé
    Avatar de JEG
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 211
    Points : 727
    Points
    727
    Par défaut
    As-tu mis

    pBitmap->Canvas->MoveTo(0, 0);

    avant ton lineto ?

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Oui j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pBitmap->Canvas->PenPos = TPoint(X, Y);
    avec X et Y la position de la souris dans mon paintbox (quand je mettais paintBox->Canvas->LineTo(X, Y), la ligne s'affichait bien !!)

    En fait, tout ce que je faisais avant avec un paintBox, je l'ai remplacé par pBitmap
    --> Princesse
    Il n'est pas difficile d'avoir une idée. Ce qui est difficile, c'est de les avoir toutes.

  6. #6
    JEG
    JEG est déconnecté
    Membre éclairé
    Avatar de JEG
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 211
    Points : 727
    Points
    727
    Par défaut
    ca devrait pourtant marcher...

  7. #7
    Membre chevronné
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Points : 1 911
    Points
    1 911
    Par défaut
    Attention, après avoir agi sur le bitmap, il faut forcer un Paint au moins une fois. Le OnPaint ne sert que si on doit repeindre. Ainsi après avoir écrit dans le bitmap, vous pouvez faire disparaître votre fenêtre puis la faire réapparaître, là le Paint sera appelé et vous verrez quelque chose. Donc après avoir agi sur le bitmap, forcez un Paint.

    À bientôt
    Gilles

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Voilà mon "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
    Graphics::TBitmap *pBitmap = new Graphics::TBitmap();
     
    void __fastcall TfmMain::paintBoxPaint(TObject *Sender)
    {
     
      try
      {
        paintBox->Canvas->Draw(0,0,pBitmap);    
      }
      catch (...)
     
      {
        ShowMessage("Ne peut charger ni afficher le bitmap");
      }
     
    }
     
    //---------------------------------------------------------------------------
    void __fastcall TfmMain::paintBoxMouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
     
      pBitmap->Canvas->PenPos = TPoint(X, Y);
      pBitmap->Canvas->LineTo(X, Y);
     
    }
     
    //---------------------------------------------------------------------------
    void __fastcall TfmMain::paintBoxMouseMove(TObject *Sender,
          TShiftState Shift, int X, int Y)
    {
     
            if(Shift.Contains(ssLeft))
               pBitmap->Canvas->LineTo(X, Y);
    }
    //---------------------------------------------------------------------------
    void __fastcall TfmMain::paintBoxMouseUp(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
       pBitmap->Canvas->LineTo(X, Y);
     
       paintBox->Repaint();
     
    }
    Si je remplace pBitmap par paintBox, je visualise bien un tracé... Mais là, aucun tracé !

    EDIT: oui pour tester j'ai forcé le paint dans l'événement MouseUp
    --> Princesse
    Il n'est pas difficile d'avoir une idée. Ce qui est difficile, c'est de les avoir toutes.

  9. #9
    Membre chevronné
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Points : 1 911
    Points
    1 911
    Par défaut
    N'avez-vous pas oublié de donner une dimension au Bitmap par exemple dans l'événement OnSHow de la forme principale

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void __fastcall TForm1::FormShow(TObject *Sender)
    {
    BM->Width=PaintBox1->Width;
    BM->Height=PaintBox1->Height;
    }
    Sur MouseDown, il suffit de faire un MoveTo, c'est tout.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void __fastcall TForm1::PaintBox1MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
    BM->Canvas->MoveTo(X, Y);
    }
    Le try/catch est inutile dans le OnPaint

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void __fastcall TForm1::PaintBox1Paint(TObject *Sender)
    {
    PaintBox1->Canvas->Draw(0,0,BM);
    }
    Créez le bitmap dans le constructeur de la forme principale

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    __fastcall TForm1::TForm1(TComponent* Owner)
       : TForm(Owner)
    {
    BM=new Graphics::TBitmap();
    }
    Et n'oubliez pas de la détruire dans le OnDestroy da la forme principale

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void __fastcall TForm1::FormDestroy(TObject *Sender)
    {
    delete BM;
    }
    À bientôt
    Gilles

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    C'est parfait

    Je vous remercie beaucoup pour la rapidité et la qualité de vos réponses !!!

    A bientôt Gilles.
    --> Princesse
    Il n'est pas difficile d'avoir une idée. Ce qui est difficile, c'est de les avoir toutes.

  11. #11
    JEG
    JEG est déconnecté
    Membre éclairé
    Avatar de JEG
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 211
    Points : 727
    Points
    727
    Par défaut
    si le problème est résolu ==> mettre le tag résolu

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 14/02/2005, 19h41
  2. [ALGO] dessiner un triangle dans le bon sens
    Par lefait dans le forum Algorithmes et structures de données
    Réponses: 13
    Dernier message: 05/02/2005, 14h38
  3. dessiner un tableau dans WORD?
    Par sali dans le forum VBA Word
    Réponses: 2
    Dernier message: 26/01/2005, 14h11
  4. [EJB] [JSP] Méthode EJB non reconnue dans jsp
    Par stago dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 06/07/2004, 09h52
  5. Dessiner une ligne dans un cube transparent ?
    Par Muetdhiver dans le forum OpenGL
    Réponses: 4
    Dernier message: 04/05/2004, 11h06

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