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 :

TPaintBox ou TImage?


Sujet :

C++Builder

  1. #1
    Membre averti
    Étudiant
    Inscrit en
    Novembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2005
    Messages : 16
    Par défaut TPaintBox ou TImage?
    Bonjour à tous ,

    Je souhaite réaliser une interface permettant à l'utilisateur de créer un dessin (comme paint).
    Mon utilisateur doit pouvoir faire des formes simples comme rectangle, cercle, ellipse, etc ...

    J'aimerai savoir s'il faut mieux utiliser une TImage ou bien une TPaintBox ?

    De plus, j'aimerai savoir comment gérer les boutons pour que, lorsque l'on clique sur un bouton de forme (par exemple rectangle), cela crée un rectangle avec avoir cliqué sur le dessin. Je n'arrive pas a voir comment faire

    Idem pour la souris, j'arrive à faire un point sur mon dessin lorsque l'on clique dessus, mais comment faire pour afficher des points tant que l'utilisateur n'a pas laché le bouton de la souris


    Je vous en remercie d'avance!
    Nico

  2. #2
    Membre expérimenté Avatar de Twindruff
    Inscrit en
    Janvier 2005
    Messages
    216
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 216
    Par défaut
    J'aimerai savoir s'il faut mieux utiliser une TImage ou bien une TPaintBox ?
    Je sais pas ça à l'air deux composants voisins a priori, tu peux commencer à programmer avec l'un des deux et puis changer après au pire (en supprimant l'ancien et en créant un nouveau avec le même nom)

    De plus, j'aimerai savoir comment gérer les boutons pour que, lorsque l'on clique sur un bouton de forme (par exemple rectangle), cela crée un rectangle avec avoir cliqué sur le dessin. Je n'arrive pas a voir comment faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    enum pinceau {point, ligne, rectangle};
    // ...
    pinceau MonPinceau=point;
    // ...
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        MonPinceau=droite;
    }
    Idem pour la souris, j'arrive à faire un point sur mon dessin lorsque l'on clique dessus, mais comment faire pour afficher des points tant que l'utilisateur n'a pas laché le bouton de la souris
    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
    bool ToucheEnfoncee;
    // ...
    void __fastcall TForm1::FormMouseDown(...)
    {
         ToucheEnfoncee=true;
    }
     
    void __fastcall TForm1::FormMouseUp(...)
    {
         ToucheEnfoncee=false;
    }
     
    void __fastcall TForm1::FormMouseMove(...)
    {
         if(ToucheEnfoncee)
              //dessiner
    }

  3. #3
    Membre expérimenté
    Avatar de Djob
    Inscrit en
    Août 2002
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 215
    Par défaut
    Je te conseille d'utiliser une PaintBox.

    Voici un exemple très simple avec deux boutons de type TSpeedButton avec les propriétés (AllowUp=true et GroupIndex=1), représentant le bouton Rectangle et un autre bouton ( Cercle par Exemple ).Ainsi un seul des boutons de forme peut être enfoncé.

    Dans l'exemple suivant on joue avec l'evenement OnMouseDown de Paintbox qui te donne les coordonnées du click sur ta TPaintbox:
    Quand tu clique sur la TPainBox et que le bouton rectangle est enfoncé , alors un rectangle est dessiné :

    le mieux est de tester l'exemple :

    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
     
    //fonction de dessin d'un rectangle sur un Canvas ( le canvas de la paintbox par exemple)
     
    void __fastcall DessinerRectanglePlein(TCanvas * Canvas,int top, int left,int height,int width,TColor col_interior,TColor col_border)
    {
       if(Canvas==NULL) return;
       TColor SaveBrushColor =Canvas->Brush->Color;
       TColor SavePenColor = Canvas->Pen->Color;
       Canvas->Brush->Color= col_interior;
       Canvas->Pen->Color =  col_border;
       Canvas->Rectangle(left,top,left+width,top+width);
       Canvas->Brush->Color=SaveBrushColor;
       Canvas->Pen->Color = SavePenColor;
    }
     
    // evenement OnMouseDown
    void __fastcall TForm1::PaintBox1MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
      if(SpeedBtnRect->Down){  // si le bouton rectangle est enfoncé
        DessinerRectanglePlein(PaintBox1->Canvas,Y,X,50,50,clRed,clYellow);
      }
    }

  4. #4
    Membre averti
    Étudiant
    Inscrit en
    Novembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2005
    Messages : 16
    Par défaut
    Tout d'abord, je tiens a vous remercier de vouloir m'aider, c'est vraiment sympa !

    La mauvaise nouvelle c'est que je n'arrive pas a faire marcher tout ce que vous me dites, et le plus frustant c'est que vous etes sur que ca doit marcher lol

    Pour Twindruff:
    Au niveau de la souris, je n'arrive pas à le faire marcher. En effet, le booleen ne change pas de valeur quand je clique (pourtant il est bien définit, peut etre un probleme entre la TImage et la TForm pour les déclarations d'événements?)

    Pour Djob:
    Apres m'etre embrouillé les pinceaux, j'ai réussi !!
    Et il possible que l'on voit le rectangle se former apres le premier clique et lorsqu'on bouge la souris? et la, ca serait impecc

    reste plus qu'a gérer la souris apres, parceque je n'ai pas encore réussi

    Me tappez pas !!

    Encore merci
    Nico

  5. #5
    Membre expérimenté Avatar de Twindruff
    Inscrit en
    Janvier 2005
    Messages
    216
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 216
    Par défaut
    Au niveau de la souris, je n'arrive pas à le faire marcher. En effet, le booleen ne change pas de valeur quand je clique (pourtant il est bien définit, peut etre un probleme entre la TImage et la TForm pour les déclarations d'événements?)
    En fait ces évènements c'est pour ton TImage.
    Tu as besoin du MouseUp sur la TForm aussi au cas où tu relache sur la Form et pas sur le TImage.
    Ensuite tu peux faire quelques raffinements car il se peut que tu relache à l'extérieur de la fenêtre ...

    reste plus qu'a gérer la souris apres, parceque je n'ai pas encore réussi
    Tu dois utiliser les arguments int X, int Y qui te sont fournis par arguments dans les évènements MouseDown, MouseUp, MouseMove.

  6. #6
    Membre averti
    Étudiant
    Inscrit en
    Novembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2005
    Messages : 16
    Par défaut
    Je viens de trouver mon problème. Ca marche impeccable. J'ai tout fait correctement sauf que j'avais créée les fonctions "à la main", sans les avoir assignées a l'onglet events de l'objet inspector de la TImage ... donc il ne faisait rien

    Eh bien, je viens de faire un bond grâce à vous deux, merci bien !

    Me reste qu'à trouver le moyen d'aggrandir les rectangles avec la souris, et la ca serait génial

    Encore merci!
    Nico

  7. #7
    Membre expérimenté Avatar de Twindruff
    Inscrit en
    Janvier 2005
    Messages
    216
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 216
    Par défaut
    J'ai tout fait correctement sauf que j'avais créée les fonctions "à la main"
    Ca devait être long

    Me reste qu'à trouver le moyen d'aggrandir les rectangles avec la souris, et la ca serait génial
    je t'ai dit, tu dois utiliser les arguments int X, int Y qui te sont fournis par arguments dans les évènements MouseDown, MouseUp, MouseMove.

  8. #8
    Membre expérimenté
    Avatar de Djob
    Inscrit en
    Août 2002
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 215
    Par défaut
    Bon pour gérer de façon très simple l'affichage d'un rectangle au déplacement de la souris,
    je te donne un exemple plus complet qui repose sur l'astuce suivante :

    avec une TImage pour garder ton dessin final ( mettre la proprité StrechDraw=true pour eviter le scintillement )
    et une TPainbox par dessus la TImage
    (et toujours les 2 boutons(SpeedButtons) de forme ...).

    Le principe est le suivant :
    TImage garde en mémoire l'image final
    TPaintBox ici se contente de dessiner et effacer ton rectangle temporaire


    dans le .h :
    ajouter le boolean appuye qui sert à savoir si le bouton de click est maintenu quand tu bouge la souris sur le TPaintbox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class TForm1 : public TForm
    {
        ...
    private:	// User declarations
    public:		// User declarations
            __fastcall TForm1(TComponent* Owner);
            bool appuye;  //  <------------------------------ !!!
    };

    dans le cpp :

    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
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
       //fond blanc de Timage
        Image1->Canvas->Brush->Color=clWhite;
        Image1->Canvas->FillRect(Image1->Canvas->ClipRect);
    }
    //---------------------------------------------------------------------------
    //fonction de dessin de rectangle
    void __fastcall DessinerRectangle(TCanvas * Canvas,int top, int left,int height,int width,TColor col_interior,TColor col_border)
    {
       if(Canvas==NULL) return;
       TColor SaveBrushColor =Canvas->Brush->Color;
       TColor SavePenColor = Canvas->Pen->Color;
       Canvas->Brush->Color= col_interior;
       Canvas->Pen->Color =  col_border;
       Canvas->Rectangle(left,top,left+width,top+height);
       Canvas->Brush->Color=SaveBrushColor;
       Canvas->Pen->Color = SavePenColor;
    }
     
    //fonction desin de rectangle temporaire
    void __fastcall DessinerRectangleVide(TCanvas * Canvas,int top, int left,int height,int width,TColor col_border)
    {
       if(Canvas==NULL) return;
     
       TColor SavePenColor = Canvas->Pen->Color;
       TBrushStyle SaveStyle = Canvas->Brush->Style;
       Canvas->Brush->Style = bsClear;
       Canvas->Pen->Color =  col_border;
       Canvas->Rectangle(left,top,left+width,top+height);
       Canvas->Pen->Color = SavePenColor;
       Canvas->Brush->Style =SaveStyle;
    }
     
     
     
    //evenement OnMouseDown de TPaintbox
    void __fastcall TForm1::PaintBox1MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
            appuye=true;        // le click est maintenu
    }
    //---------------------------------------------------------------------------
     
    //evenement OnMouseUp de TPaintbox
    void __fastcall TForm1::PaintBox1MouseUp(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
            appuye=false; // le click est relaché
            if(SpeedBtnRect->Down){  
              // alors on dessine sur l'Image
              DessinerRectangle(Image1->Canvas,Y,X,50,50,clRed,clYellow);
            }
    }
    //---------------------------------------------------------------------------
    //evenement OnMouseMove de TPaintbox
    void __fastcall TForm1::PaintBox1MouseMove(TObject *Sender,
          TShiftState Shift, int X, int Y)
    {
       if(appuye){  // si le click est maintenu on efface le dernier rectangle temporaire
            PaintBox1->Repaint();
       }
       if(SpeedBtnRect->Down && appuye){       //si click maintenu et bouton rectangle enfoncé
     
           //on dessine le rectangle temporaire
           DessinerRectangleVide(PaintBox2->Canvas,Y,X,50,50,clBlack);
     
       }
    }
    //---------------------------------------------------------------------------

  9. #9
    Membre averti
    Étudiant
    Inscrit en
    Novembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2005
    Messages : 16
    Par défaut
    Merci beaucoup, je pense avoir compris comment faire (je verrai cela quand j'aurai du temps libre) !

    Juste un petit truc qui me chiffone :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Canvas->Rectangle(left,top,left+width,top+width);
    Je pense que tu as fais une erreur entre width et heigth. Truc con certe, mais le temps de comprendre comment marche Canvas, ben tu vois des rectangle (ou plutot des carrés) un peu partout
    De plus, j'ai cru comprendre que Canvas->Rectangle demande les coordonnées de ces 2 points caractéristiques, et non sa hauteur et largeur.
    Enfin, c'est pas tres grave

    Encore merci à vous deux
    Bonne soirée,
    Nico

  10. #10
    Membre expérimenté
    Avatar de Djob
    Inscrit en
    Août 2002
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 215
    Par défaut
    oui c'est vrai tu as raison
    je corrige ça en haut

    c'est Canvas->Rectangle(left,top,left+width,top+height);

    avec selon l'aide builder
    void __fastcall Rectangle(int X1, int Y1, int X2, int Y2);

    X1,Y1 : point en haut à gauche de ton rectangle
    X2,Y2 : point en bas à droite de ton rectangle

    X1 = left
    Y1 = top
    X2 = left+ width
    Y2 = top+ height

  11. #11
    Membre averti
    Étudiant
    Inscrit en
    Novembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2005
    Messages : 16
    Par défaut
    Sujet résolu, merci à Djob et Twindruff pour vos réponses !

    Nico

  12. #12
    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 !

    Juste pour info :

    On peut très facilement modéliser des objets graphiques à l'aide de classes toutes simples.
    Il suffit de définir une classe de base dotée d'un certain nombre de méthodes virtuelles
    que les classes dérivées (celles des objets graphiques) surchargent avec leur propres
    méthodes, apportant ainsi leur propres fonctionnalités.

    C'est à envisager lorsqu'il faut agir sur les objets graphiques de façon plus en profondeur.

    Pour de plus amples informations sur ce qu'il est possible de faire en graphisme
    et en géométrie : à consommer sans modération

    A plus !

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 26/10/2011, 20h22
  2. Différences entre TImage et TPaintBox ?
    Par [ZiP] dans le forum Débuter
    Réponses: 2
    Dernier message: 26/10/2011, 10h53
  3. Timage et Canvas??
    Par vanack dans le forum C++Builder
    Réponses: 4
    Dernier message: 14/04/2007, 11h38
  4. [TImage] Transfert de Picture par pixels.
    Par H2D dans le forum Langage
    Réponses: 9
    Dernier message: 25/10/2003, 14h37
  5. TImage
    Par Thylia dans le forum C++Builder
    Réponses: 5
    Dernier message: 09/07/2002, 20h03

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