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

VC++ .NET Discussion :

Dessiner sur une pictureBox transparente


Sujet :

VC++ .NET

  1. #1
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut Dessiner sur une pictureBox transparente
    bonjour,
    je travaille avec visual C++ 2010 express pour un appli cartographique.
    Je dessine sans pb sur un panel (lignes, rectangles, cercles...).
    Maintenant, je fais un peu plus compliqué:
    le panel porte une image en background et une pictureBox que je rend transparente (comme si c'était une plaque de verre) et je tente de dessiner dessus.
    Le code dans le constructeur de ma Form:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    panel1->BackgroundImage = Image::FromFile("images/Abondance_small.jpg");
    pictureBox1->BackColor = System::Drawing::Color::Transparent;
    SetStyle(ControlStyles::SupportsTransparentBackColor, true);
    Rien ne se passe, aucun tracé n'est réalisé.

    Peut-on dessiner sur une paintBox transparente?
    Le code est-il correct ou y a t'il un défaut dans le raisonnement?

    Merci pour vos suggestions.

  2. #2
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut dessin sur paintBox transparente bis
    Bonjour,
    en parlant aux autres, on réalise où l'on écrit de travers.
    Donc j'arrive à nouveau à tracer mes segments mais je bousille complètement la carte qui est sur le panel.
    C'est comme si la pictureBox ne jouait pas sont rôle de panneau de verre en me laissant dessiner sur le panel...

    Faut-il que je trace mes segments et rafraîchisse systématiquement la carte qui est en dessous? Ou y a t-il une autre technique?

    Merci.

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 157
    Points : 12 271
    Points
    12 271
    Par défaut
    Si vous êtes en début de projet, n'utilisez plus WinForms mais WPF car les effets de transparence semblent bien mieux gérés.

  4. #4
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut
    bonsoir,
    ce n'est pas un projet au sens industriel du terme mais pour des étudiants en cycle informatique.
    Je cherche à leur faire appréhender le C++ à travers un EDI actuel. Visual C++ c'est déjà du c++ avec du CLI en plus. J'aimerais en rester là afin de ne pas trop charger l'apprentissage.

    Pour ce qui est de la phase faisabilité du projet que je mène, j'en suis à dessiner des segments sur la pictureBox par dessus la carte portée par le panel. Pour l'instant, je recharge la carte entre chaque dessin du segment. Le rendu n'est pas terrible bien sûr.

    Ce que je cherche à faire est il réalisable avec un résultat acceptable ?

    Merci.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 157
    Points : 12 271
    Points
    12 271
    Par défaut
    Désolé pour le délai de réponse.

    La transparence peut être problématique avec WinForms, mais un prenant un peu de recul, je ne vois pas pourquoi vous avez besoin de cette pictureBox.
    le panel porte une image en background et une pictureBox que je rend transparente (comme si c'était une plaque de verre) et je tente de dessiner dessus
    Comme l'image est en background, les affichages du panel se feront sur le background, donc sans l'utilisation d'une pictureBox transparente.

    Pouvez-vous poster une solution VS2010 avec un projet minimaliste pour reproduire le problème ?

  6. #6
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut
    bonjour,
    je ne suis pas aux pièces!!

    Mon souci vient du fait que je voulais dessiner un segment de manière continue tout en déplaçant la souris (comme dans Paint). Donc j'efface le segment "précédent" en prenant la couleur du fond puis je dessine le segment "courant" avec la couleur choisie. Tant qu'il n'y a pas d'image en background, c'est satisfaisant. Avec une image, celle-ci est affectée par l'opération d'effacement du segment. D'où mon idée d'utiliser une pictureBox transparente par dessus le panel et dessiner sur cette pictureBox. Mais le résultat reste le même.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    if(e->Button == System::Windows::Forms::MouseButtons::Left)
    {
    s->effacer(panel1);	//effacer "l'ancien" segment
    				pExt.X = e->X;
    				pExt.Y = e->Y;
    				s->setExtremite(pExt);
    				s->dessiner(panel1);	//dessiner le segment courant
    				//redessiner les segments qui ont pu être effacés
    				for(int i=0; i<conteneur->Count; i++)
    					conteneur[i]->dessiner(panel1);
    			}

  7. #7
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut
    Je viens de découvrir que mettre une tabulation dans le code poste d'office ce que l'on est en train d'écrire.
    Je reprend donc à partir du 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
     
    //code du gestionnaire d'évènement mouseMove
    if(e->Button == System::Windows::Forms::MouseButtons::Left)
    {
    	s->effacer(panel1);	//effacer "l'ancien" segment
    	pExt.X = e->X;
    	pExt.Y = e->Y;
    	s->setExtremite(pExt);
    	s->dessiner(panel1);	//dessiner le segment courant
    	//redessiner les segments qui ont pu être effacés
    	for(int i=0; i<conteneur->Count; i++)
    		conteneur[i]->dessiner(panel1);
    }
     
    //méthode effacer du segment
    void CSegment::effacer(Panel^ pA)
    {
    	Graphics^ g = pA->CreateGraphics();
    	//prendre la couleur du fond
    	Pen^ drawingPen = gcnew Pen(pA->BackColor);
    	g->DrawLine(drawingPen, pOrg, pExt);
    	delete g;
    }
     
    //méthode dessiner du segment
    void CSegment::dessiner(Panel^ pA)
    {
    	Graphics^ g = pA->CreateGraphics();
    	//prendre la couleur du segment
    	Pen^ drawingPen = gcnew Pen(couleur);
    	g->DrawLine(drawingPen, pOrg, pExt);
    	delete g;
    }
    C'est peut-être pas vraiment la bonne technique ou alors ce n'est pas possible avec les Forms.
    Une alternative: je ne dessine pas en continu le segment mais après que les deux points aient été cliqués.

    Merci.

  8. #8
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 76
    Points : 96
    Points
    96
    Par défaut
    Bonjour


    Ceci est juste une petite suggestion, plutôt que de travailler avec un picturebox ou tout autre type de contrôle auquel assigner de la transparence, pourquoi ne pas utiliser une Bitmap et dessiner sur cette Bitmap?

    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Bitmap^ b = gcnew Bitmap( int l , int h , PixelFormat::Format32bppArgb );
     
    Graphics^ g = Graphics::FromImage(b);
     
    // dessiner sur g
     
    delete g;
    J'utilise cette méthode sur une interface graphique pour la photo et ça marche très bien.

  9. #9
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut
    Bonjour,
    merci pour la suggestion. C'est ce qu'il me fallait.
    Merci

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

Discussions similaires

  1. Drag and drop sur une PictureBox
    Par abdiouldbody dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 17/06/2009, 15h55
  2. Dessiner sur une image
    Par alex6891 dans le forum Java ME
    Réponses: 1
    Dernier message: 16/04/2006, 02h45
  3. [Debutant] Un thread qui dessine sur une fenetre ???
    Par Spartan03 dans le forum OpenGL
    Réponses: 6
    Dernier message: 05/04/2006, 20h19
  4. Déplacer, zoomer, dessiner (sur) une image
    Par charlito dans le forum 2D
    Réponses: 4
    Dernier message: 22/02/2006, 01h58
  5. [Servlet] [Image] Dessiner sur une image
    Par gaia_dev dans le forum 2D
    Réponses: 5
    Dernier message: 01/09/2004, 17h11

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