GDI+ [Résolu]

Signaler
Messages postés
5
Date d'inscription
samedi 15 mars 2008
Statut
Membre
Dernière intervention
1 février 2009
-
Messages postés
5
Date d'inscription
samedi 15 mars 2008
Statut
Membre
Dernière intervention
1 février 2009
-
Bonjour à tous, voila la situation : 
j'ai un programme qui permet de tracer à vu des ronds et des rectangles dans une pictureBox avec ma souris.
C'est bien, mais l'ennuie c'est que dés que je trace une nouvelle figure dedans l'ancienne s'efface : ce que je ne veux pas!
(en effet, j'aimerais pouvoir par la suite  utiliser les figures déjà tracer pour les sélectionner, puis les modifier ou les supprimer)
J'aimerais utiliser drawImage(), ci dessous voici mon code source.
S'il vous plaît aider moi je suis étudiant!!!


using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Drawing.Drawing2D;



/*
* _A pour Attribut
* _C pour Composant
*/




namespace



Paint
{


public



partial



class



Fenetre_Principale
:

Form

{


private



Graphics
_Apalette;


private



Pen
_Apinceau;


private



Color
_Apinceau_couleur =

Color
.Black;


private



bool
_Apinceau_dessine_rectangle =

true
;


private



bool
_Apinceau_dessine_cercle =

false
;


private



int
_Acadre_bord_droit, _Acadre_bord_inferieur;


private



int
_Acadre_bord_gauche, _Acadre_bord_superieur;


private



bool
_Aen_traceage =

false
;


private



Point
_Aposition_depart_souris =

Point
.Empty;


private



Point
_Aposition_arrivee_souris =

Point
.Empty;


private



Rectangle
_Arectangle =

Rectangle
.Empty;


private



Bitmap
_Adessin_imageBMP;


public
Fenetre_Principale()
{
InitializeComponent();
_CpictureBox_aperçu_couleur_pinceau.BackColor = _Apinceau_couleur;
_Apinceau =

new



Pen
(_Apinceau_couleur);
_Apalette = _CpictureBox_toile.CreateGraphics();
_Acadre_bord_gauche = 0;
_Acadre_bord_droit = _CpictureBox_toile.Width;
_Acadre_bord_superieur = 0;
_Acadre_bord_inferieur = _CpictureBox_toile.Height;
_Adessin_imageBMP =

new



Bitmap
(_CpictureBox_toile.Width, _CpictureBox_toile.Height);
}


private



void
couleurToolStripMenuItem_Click(

object
sender,

EventArgs
e)
{


if
(_CcolorDialog.ShowDialog() ==

DialogResult
.OK)
_Apinceau_couleur = _CcolorDialog.Color;
_CpictureBox_aperçu_couleur_pinceau.BackColor = _Apinceau_couleur;
_Apinceau =

new



Pen
(_Apinceau_couleur);
}







private



void
_CpictureBox_toile_MouseDown(

object
sender,

MouseEventArgs
e)
{
_Aen_traceage =

true
;
_Aposition_depart_souris =

new



Point
(e.X, e.Y);
_Aposition_arrivee_souris =

Point
.Empty;
_Arectangle =

Rectangle
.Empty;
}


private



void
_CpictureBox_toile_MouseUp(

object
sender,

MouseEventArgs
e)
{_Aen_traceage =

false
;}


private



void
_CpictureBox_toile_MouseMove(

object
sender,

MouseEventArgs
e)
{


Cursor
.Current =

Cursors
.Cross;


int
first_X, first_Y, last_X, last_Y;


int
X_location, Y_location;


int
X_location_opposite, Y_location_opposite;


int
distance_X, distance_Y;


if
(_Aen_traceage)

//si je suis en train de tracer une figure

{
_Aposition_arrivee_souris =

new



Point
(e.X, e.Y);
first_X = _Aposition_depart_souris.X;
first_Y = _Aposition_depart_souris.Y;
last_X = _Aposition_arrivee_souris.X;
last_Y = _Aposition_arrivee_souris.Y;


if
(first_X < last_X)

//de gauche à droite

{
X_location = first_X;
   

if
(last_X < _Acadre_bord_droit)
   {X_location_opposite = last_X;}
   

else
//dépassement
   
{X_location_opposite = _Acadre_bord_droit;}
}


else
//de droite à gauche

{
X_location_opposite = first_X;


if
(last_X > _Acadre_bord_gauche)
   {X_location = last_X;}


else
//dépassement

{X_location = _Acadre_bord_gauche;}
}


if
(first_Y < last_Y)

//de haut en bas

{
Y_location = first_Y;


if
(last_Y < _Acadre_bord_inferieur)
{Y_location_opposite = last_Y;}


else
//dépassement

{Y_location_opposite = _Acadre_bord_inferieur;}
}


else
//de bas en haut

{Y_location_opposite = first_Y;


if
(last_Y > _Acadre_bord_superieur)
{Y_location = last_Y;}


else
//dépassement

{Y_location = _Acadre_bord_superieur;}
}distance_X = X_location_opposite - X_location;
distance_Y = Y_location_opposite - Y_location;
_Arectangle =


new



Rectangle
(X_location, Y_location, distance_X, distance_Y);
_CpictureBox_toile.Invalidate(

this
.ClientRectangle);
}

//if (_Aen_traceage)

}

//_CpictureBox_toile_MouseMove






private



void
_CpictureBox_toile_Paint(

object
sender,

PaintEventArgs
e)
{
_Apalette = e.Graphics;


if
(_Aen_traceage)
   {


   if
(_Apinceau_dessine_rectangle)
   {
      _Apalette.DrawImage(_Adessin_imageBMP,

this
.ClientRectangle);
      _Apalette.DrawRectangle(_Apinceau, _Arectangle);
   }
   

if
(_Apinceau_dessine_cercle)
   {
      _Apalette.DrawEllipse(_Apinceau, _Arectangle);
   }
  }
}


private



void
rectangleToolStripMenuItem_Click(

object
sender,

EventArgs
e)
{
_Apinceau_dessine_rectangle =

true
;
_Apinceau_dessine_cercle =

false
;
}


private



void
cercleToolStripMenuItem_Click(

object
sender,

EventArgs
e)
{
_Apinceau_dessine_cercle =

true
;
_Apinceau_dessine_rectangle =

false
;
}

}
}

5 réponses

Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
36
Salut, si tu dessines sur le Graphics de la PictureBox les dessins ne sont pas persistants, si tu dessines sur le Graphics de l'image contenue dans la PictureBox alors les dessins seront persistants.
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
28
Salut

Tu peux regardes le tutorial
http://www.supinfo-projects.com/fr/2004/paint%5Fgdi%2B/3/

Et tu auras le code qui faut.

Bon coding
Messages postés
5
Date d'inscription
samedi 15 mars 2008
Statut
Membre
Dernière intervention
1 février 2009

Non je suis désolé je ne suis pas arriver à atteindre mon objectif,


soit j'utilise des DrawReversibleFrame
et les rectangles ne s'efface pas après le traceage du suivant
soit j'utilise des DrawRectangle, et je n'arrive pas à garder sur ma pictureBox les figures tracés!!
Quelle galère!




Aidez le pauvre développeur que je suiiiiss!!
Messages postés
5
Date d'inscription
samedi 15 mars 2008
Statut
Membre
Dernière intervention
1 février 2009

Voila, je suis arriver a peu près ce que je voulais mais je n'ai toujours pas fait un drawImage!!
je luttes, je luttes

namespace

Paint{

public
partial
class
Fenetre_Principale :
Form{

private
Graphics _Apalette;

private
Pen _Apinceau;

private
Color _Apinceau_couleur =
Color.Black;

private
bool _Apinceau_dessine_rectangle =
true;

private
bool _Apinceau_dessine_cercle =
false;

private
int _Acadre_bord_droit, _Acadre_bord_inferieur;

private
int _Acadre_bord_gauche, _Acadre_bord_superieur;

private
bool _Aen_traceage =
false;

private
Point _Aposition_depart_souris =
Point.Empty;

private
Point _Aposition_arrivee_souris =
Point.Empty;

private
Rectangle _Arectangle =
Rectangle.Empty;

private
Rectangle _Arectangle2 =
Rectangle.Empty;

private
Bitmap _Adessin_imageBMP;

public Fenetre_Principale(){

InitializeComponent();

_CpictureBox_aperçu_couleur_pinceau.BackColor = _Apinceau_couleur;

_Apinceau =

new
Pen(_Apinceau_couleur);_Apalette = _CpictureBox_toile.CreateGraphics();

_Acadre_bord_gauche = 0 + _CpictureBox_toile.Bounds.X;

_Acadre_bord_droit = _Acadre_bord_gauche + _CpictureBox_toile.Width;

_Acadre_bord_superieur = 0 + _CpictureBox_toile.Bounds.Y;

_Acadre_bord_inferieur = _Acadre_bord_superieur + _CpictureBox_toile.Height;

//_Adessin_imageBMP = new Bitmap(_CpictureBox_toile.Width, _CpictureBox_toile.Height);}

private
void couleurToolStripMenuItem_Click(
object sender,
EventArgs e){
if (_CcolorDialog.ShowDialog() DialogResult.OK)_Apinceau_couleur _CcolorDialog.Color;

_CpictureBox_aperçu_couleur_pinceau.BackColor = _Apinceau_couleur;

_Apinceau =

new
Pen(_Apinceau_couleur);}

private
void _CpictureBox_toile_dessin_Click(
object sender,
EventArgs e){

}

private
void _CpictureBox_toile_MouseDown(
object sender,
MouseEventArgs e){
_Aen_traceage true;_Aposition_depart_souris PointToClient(MousePosition);
_Aposition_arrivee_souris Point.Empty;_Arectangle

Rectangle.Empty;}

private
void _CpictureBox_toile_MouseUp(
object sender,
MouseEventArgs e){

_Aen_traceage =

false;

ControlPaint.DrawReversibleFrame(RectangleToScreen(_Arectangle), _Apinceau_couleur,
FrameStyle.Dashed);

_Apalette.DrawRectangle(_Apinceau, _Arectangle2);

}

private
void _CpictureBox_toile_MouseMove(
object sender,
MouseEventArgs e){

/** new Rectangle(point.abscisse, point.ordonnee, distance1, distance2);

* new Rectangle(ptGaucheSup.X, ptGaucheSup.Y, (ptGaucheSup.X-ptDroitSup.X), (ptGaucheSup.Y-ptGaucheInf.Y));

*/

Cursor.Current =
Cursors.Cross;

int first_X, first_Y, last_X, last_Y;

int X_location, Y_location;

int X_location_opposite, Y_location_opposite;

int distance_X, distance_Y;

if (_Aen_traceage)
//si je suis en train de tracer une figure{

_Aposition_arrivee_souris = PointToClient(MousePosition);

first_X = _Aposition_depart_souris.X;

first_Y = _Aposition_depart_souris.Y;

last_X = _Aposition_arrivee_souris.X;

last_Y = _Aposition_arrivee_souris.Y;

if (first_X < last_X)
//de gauche à droite{

X_location = first_X;

if (last_X < _Acadre_bord_droit){

X_location_opposite = last_X;

}

else//dépassement{

X_location_opposite = _Acadre_bord_droit;

}

}

else//de droite à gauche{

X_location_opposite = first_X;

if (last_X > _Acadre_bord_gauche){

X_location = last_X;

}

else//dépassement{

X_location = _Acadre_bord_gauche;

}

}

if (first_Y < last_Y)
//de haut en bas{

Y_location = first_Y;

if (last_Y < _Acadre_bord_inferieur){

Y_location_opposite = last_Y;

}

else//dépassement{

Y_location_opposite = _Acadre_bord_inferieur;

}

}

else//de bas en haut{

Y_location_opposite = first_Y;

if (last_Y > _Acadre_bord_superieur){

Y_location = last_Y;

}

else//dépassement{

Y_location = _Acadre_bord_superieur;

}

}

distance_X = X_location_opposite - X_location;

distance_Y = Y_location_opposite - Y_location;

ControlPaint.DrawReversibleFrame(RectangleToScreen(_Arectangle), _Apinceau_couleur,
FrameStyle.Dashed);_Arectangle =

new
Rectangle(X_location, Y_location, distance_X, distance_Y);_Arectangle2 =

new
Rectangle(X_location - _Acadre_bord_gauche, Y_location - _Acadre_bord_superieur, distance_X, distance_Y);

ControlPaint.DrawReversibleFrame(RectangleToScreen(_Arectangle), _Apinceau_couleur,
FrameStyle.Dashed);

//_CpictureBox_toile.Invalidate(this.ClientRectangle);}

//if (_Aen_traceage) }

//_CpictureBox_toile_MouseMove

private
void _CpictureBox_toile_Paint(
object sender,
PaintEventArgs e){

}

private
void rectangleToolStripMenuItem_Click(
object sender,
EventArgs e){
_Apinceau_dessine_rectangle true;_Apinceau_dessine_cercle

false;}

private
void cercleToolStripMenuItem_Click(
object sender,
EventArgs e){
_Apinceau_dessine_cercle true;_Apinceau_dessine_rectangle

false;}

}

}
Messages postés
5
Date d'inscription
samedi 15 mars 2008
Statut
Membre
Dernière intervention
1 février 2009

c'est bon, c'est bon j'ai trouvé!!
merci a vous les copains!!