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

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  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 412
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 412
    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