GDI+

Résolu
cs_magicfab2008 Messages postés 5 Date d'inscription samedi 15 mars 2008 Statut Membre Dernière intervention 1 février 2009 - 20 avril 2008 à 00:31
cs_magicfab2008 Messages postés 5 Date d'inscription samedi 15 mars 2008 Statut Membre Dernière intervention 1 février 2009 - 20 avril 2008 à 18:53
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

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
20 avril 2008 à 17:13
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.
3
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Modérateur Dernière intervention 15 juillet 2011 37
20 avril 2008 à 01:17
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
0
cs_magicfab2008 Messages postés 5 Date d'inscription samedi 15 mars 2008 Statut Membre Dernière intervention 1 février 2009
20 avril 2008 à 16:53
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!!
0
cs_magicfab2008 Messages postés 5 Date d'inscription samedi 15 mars 2008 Statut Membre Dernière intervention 1 février 2009
20 avril 2008 à 18:28
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;}

}

}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_magicfab2008 Messages postés 5 Date d'inscription samedi 15 mars 2008 Statut Membre Dernière intervention 1 février 2009
20 avril 2008 à 18:53
c'est bon, c'est bon j'ai trouvé!!
merci a vous les copains!!
0
Rejoignez-nous