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++ Discussion :

[Debutant] Dessiner dans une PictureBox.


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 40
    Points : 21
    Points
    21
    Par défaut [Debutant] Dessiner dans une PictureBox.
    Bonjour.

    Je développe actuellement une application sous visual C++.net dans laquelle je souhaite éditer une image se trouvant dans une PictureBox.

    Voici le code:
    Déclaration de la PictureBox:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    this->pictureBox1->Cursor = System::Windows::Forms::Cursors::Cross;
    this->pictureBox1->Image = (cli::safe_cast<System::Drawing::Image^  >(resources->GetObject(L"pictureBox1.Image")));
    this->pictureBox1->Location = System::Drawing::Point(127, 30);
    this->pictureBox1->Name = L"pictureBox1";
    this->pictureBox1->Size = System::Drawing::Size(352, 288);
    this->pictureBox1->TabIndex = 5;
    this->pictureBox1->TabStop = false;
    Je déclare ensuite les évemements liés à la PictureBox:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    this->pictureBox1->MouseDown += gcnew System::Windows::Forms::MouseEventHandler(this, &Form1::pictureBox1_MouseDown);
    this->pictureBox1->MouseUp += gcnew System::Windows::Forms::MouseEventHandler(this, &Form1::pictureBox1_MouseUp);

    Ensuite, lorsque j'appuie sur la souris (et que je reste enfoncé) ca enregistre la position p1 initiale et lorsque je relâche celle ci, l'application enregistre la position p2 finale.
    Lorsque les deux positions ont été enregistréesn je teste si la deuxieme position est bien dans le caré de la pictureBox
    Si oui, je créé un Pen et un objet Graphics puis utilise la méthode DrawLine.
    Voici les deux fonctions qui font cela :

    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
    private: System::Void pictureBox1_MouseDown( Object^ sender, System::Windows::Forms::MouseEventArgs^ e )
    {
    	p1 = Cursor->Position;
    }
     
     
    private: System::Void pictureBox1_MouseUp( Object^ sender, System::Windows::Forms::MouseEventArgs^ e)
    {
            if ( p2.X > p1.X && p2.X < p1.X+352 && p2.Y > p1.Y && p2.Y < p1.Y+288 )
            {
    	        p2 = Cursor->Position;
            	Pen^ pinceau = gcnew Pen(Color::White, 4.0F);
    	        Graphics^ g = Form1::CreateGraphics();
            	g->DrawLine( pinceau, p1, p2 );
    	        delete pinceau;
            	delete g;
            }
    }
    Ca passe a la compilation... mais seul probleme... quand je le fait sur l'application ca dessine un trait blanc derriere la PictureBox, et je ne comprend vraiment pas pourquoi :/

    Merci d'avance pour vos possibles réponses

  2. #2
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 40
    Points : 46
    Points
    46
    Par défaut
    J'ai pas encore beaucoup fait de Windows Forms mais ayant pratiqué les MFC et au vue de ton code je dirais que tu instancies un Graphique mais pas spécialement issue de ton control, Form1::CreateGraphics() ne fait qu'appeler la méthode de la classe mère (si tu n'as pas redéfini le comportement).

    A vérifier avec this déjà ou l'object sender.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 40
    Points : 21
    Points
    21
    Par défaut
    Hmpf, je comprend pas trop ta réponse lol, désolé je suis encore un peu limite niveau connaissance de ce langage

    Sinon a part ca j'ai trouvé cette utilisation de DrawLine dans la bibli MSDN:
    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
    public:
       void DrawLineInt( PaintEventArgs^ e )
       {
          // Create pen.
          Pen^ blackPen = gcnew Pen( Color::Black,3.0f );
     
          // Create coordinates of points that define line.
          int x1 = 100;
          int y1 = 100;
          int x2 = 500;
          int y2 = 100;
     
          // Draw line to screen.
          e->Graphics->DrawLine( blackPen, x1, y1, x2, y2 );
       }
    Si j'ai bien compris, ca ferais ce que je veux... mais je ne sait pas d'où sortir le PaintEventArgs.

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    L'idée n'est pas de dessiner en direct. Si tu dessine en direct, comment le système va-t-il se débrouiller si par exemple on met une autre fenêtre par dessus, puis on veut réafficher la fenêtre initiale ? Le mieux est donc de sauvegarder dans une structure locale les informations de dessin (soit en vectoriel, les coordonnées des lignes à tracer, en mode bitmap un objet de type Image). Ensuite, tu peux redéfinir la fonction virtuelle Paint (je crois que c'est son nom) de ton contrôle, qui a déjà en paramètre un objet de type Graphics que tu peux utiliser directement.

  5. #5
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 40
    Points : 46
    Points
    46
    Par défaut
    Je vais essayer de développer un peu plus alors

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Graphics^ g = Form1::CreateGraphics();
    L'initialisation de ton Graphics fait appel à la méthode de la classe.

    Si tu regardes sur :
    http://msdn2.microsoft.com/fr-fr/lib...cs(VS.80).aspx

    Ils font appel à la méthode de l'objet (pas de la classe), il faut donc que tu utilises la méthode pour ton PictureBox.

    Dans ton cas tu es dans un événements que tu as enregistré pour ton control (pictureBox1) donc le paramètre Object^ sender devrait correspondre à ce dis control.

    Pour pouvoir dessiner dans ton control il est donc nécessaire de créer un Graphics pour celui-ci et donc d'appeler la méthode qui le concerne.

    Ce qui devrait donner sender->CreateGraphics ... un cast sera peut être nécessaire.

    Y'a un petit exemple du genre (en C#) sur : http://msdn2.microsoft.com/fr-fr/lib...gs(VS.80).aspx

    PS : Désolé c'est du VB mais c'est ce que tu veux faire on dirais http://plasserre.developpez.com/ve4-3.htm

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Points : 275
    Points
    275
    Par défaut
    'Alut.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Graphics^ g = Form1::CreateGraphics();
            	g->DrawLine( pinceau, p1, p2 );
    Ca fait longtemps que j'ai plus fait de .net, mais je ne vois pas de lien entre ta PictureBox et le Graphics.
    J'utiliserais plus un truc du style pictureBox1->Graphics->DrawLine(...).

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 40
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par Darwiz
    PS : Désolé c'est du VB mais c'est ce que tu veux faire on dirais http://plasserre.developpez.com/ve4-3.htm
    C'est un peu pareil que cela en C#
    http://developpez.net/forums/showthread.php?t=311319

    Mais lorsque je fais PictureBox1->CreateGraphics() ou un truc du style ca me dit que la méthode CreateGraphics n'est pas membre de la classe utilisée... idem pour ce que tu as écrit Albenejean.

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Points : 275
    Points
    275
    Par défaut
    Mais lorsque je fais PictureBox1->CreateGraphics() ou un truc du style ca me dit que la méthode CreateGraphics n'est pas membre de la classe utilisée... idem pour ce que tu as écrit Albenejean.
    Ce n'est qu'une idéé. Comme nous l'avons dit tous les deux, nous ne sommes pas surs de la syntaxe. Cherche dans la doc les fonctions et les données membres d'une PictureBox qui te permettent de dessiner. JolyLoic a parler d'une fonction Paint...

    Dans ton code, tu crée un objet Graphics qui appartient à la fenêtre et non à ta PictureBox.

    [EDIT]: de mémoire, il me semble que PictureBox à un objet Image en données membres. Regarde aussi par là.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 40
    Points : 21
    Points
    21
    Par défaut
    J'ai trouvé un constructeur de Graphics s'appelant FromImage, mon code donne ca maintenant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    private: System::Void pictureBox1_MouseUp( Object^ sender, System::Windows::Forms::MouseEventArgs^ e)
    	{
    	        p2 = Cursor->Position;
    		if (p2.X > p1.X && p2.X < p1.X+352 && p2.Y > p1.Y && p2.Y < p1.Y+288)
    		{
    			Pen^ pinceau = gcnew Pen(Color::White, 4.0F);
    			Graphics^ g = gcnew Graphics::FromImage(pictureBox1->Image);
    			g->DrawLine( pinceau, p1, p2 );
    			delete pinceau;
    			delete g;
    		}
    	}
    Mais il y a une erreur de syntaxe dans l'utilisation... serais-ce mon image qui fait déconner?

  10. #10
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 40
    Points : 46
    Points
    46
    Par défaut
    Bon j'ai fait un test rapide en créant un projet avec une PictureBox et mon code donne ça :

    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
    private: System::Void pictureBox1_MouseDown(System::Object *  sender, System::Windows::Forms::MouseEventArgs *  e)
    {
    	p1.X = e->X;
    	p1.Y = e->Y;
    }
     
    private: System::Void pictureBox1_MouseUp(System::Object *  sender, System::Windows::Forms::MouseEventArgs *  e)
    {
    //	if ( p2.X > p1.X && p2.X < p1.X+352 && p2.Y > p1.Y && p2.Y < p1.Y+288 )
    	{
    		p2.X = e->X;
    		p2.Y = e->Y;
    		Pen* pinceau = new Pen(Color::White, 4.0F);
    		Graphics* g = pictureBox1->CreateGraphics();
    		g->DrawLine( pinceau, p1, p2 );
     
    		pinceau->Dispose();
    		g->Dispose();
    	}
    }
    Pour info Cursor->Position te donne la position sur le bureau Windows et pas dans le controle du coup tu dessines peut être dans une zone que tu ne vois pas.

    En tout cas chez moi ça marche parfaitement, jpeux fournir le projet vide si tu veux .... j'ai rien fait de plus (c'est du Visual 2003)

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 40
    Points : 21
    Points
    21
    Par défaut
    Yép merci Darwiz c'est exactement ca. Je comprend pas pourquoi j'avais pas réussi a écrire ca avant... surement une faute toute conne lol.

    Quand au curseur il suffisait de le récupérer dans MouseEventArgs e.
    Le code donne cela au final:

    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
    private: System::Void pictureBox1_MouseDown( Object^ sender, System::Windows::Forms::MouseEventArgs^ e )
    {
    	p1.X = e->X;
    	p1.Y = e->Y;
    }
     
    private: System::Void pictureBox1_MouseUp( Object^ sender, System::Windows::Forms::MouseEventArgs^ e)
    {
    	p2.X = e->X;
    	p2.Y = e->Y;
    	Pen^ pinceau = gcnew Pen(Color::White, 4.0F);
    	Graphics^ g = pictureBox1->CreateGraphics();
    	g->DrawLine( pinceau, p1, p2 );
    	delete pinceau;
    	delete g;
    }
    Merci beaucoup pour votre aide !

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 40
    Points : 21
    Points
    21
    Par défaut
    J'ai un nouveau probleme (lol...), comme l'a dit JolyLoic quand je veux sauvegarder mon image avec le trait, bah le trait n'est pas pris en compte.

    Si j'ai bien compris ton idée JolyLoic, c'est de créer un fichier (.ini par exemple?) ou l'on stoque les coordonnées des deux points, et lorsque je veux sauvegarder, faire le trait avec cette méthode paint. C'est bien ca?

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    239
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 239
    Points : 173
    Points
    173
    Par défaut
    moi je tu conseille de travaille sous builder pour ce genre d'application, c'est mon avis............

    cordialement madjidri

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 40
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par madjidri
    moi je tu conseille de travaille sous builder pour ce genre d'application, c'est mon avis............

    cordialement madjidri
    Je peux plus trop faire machine arriere la. ^^

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

Discussions similaires

  1. Dessiner une grille dans une picturebox
    Par hamza.rezgui dans le forum Windows Forms
    Réponses: 2
    Dernier message: 11/03/2013, 09h24
  2. Dessin d'un rectangle arrondi dans une picturebox
    Par iclic dans le forum VB 6 et antérieur
    Réponses: 19
    Dernier message: 19/11/2010, 11h27
  3. Réponses: 5
    Dernier message: 18/02/2008, 13h48
  4. Dessiner dans une PictureBox
    Par pj69100 dans le forum MFC
    Réponses: 4
    Dernier message: 22/04/2006, 18h30
  5. [debutant]dessins dans une fenetre
    Par drosophile dans le forum 2D
    Réponses: 4
    Dernier message: 04/11/2004, 14h55

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