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

Windows Forms Discussion :

Dessin avec GDI+


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 29
    Points : 13
    Points
    13
    Par défaut Dessin avec GDI+
    Je dois faire un travail dans lequel on me demande de dessiner des formes (soit carré, triangle ou triangle inversé) suite à un choix de l'utilisateur (il coche un bouton radio --> mais là n'est pas le problème). L'utilisateur doit choisir deux couleurs différentes à partir de deux combo box différents (le combo box 1 et le combo box 2) Il doit aussi dire le nombre de petits carrés qui formeront son image (entre 3 et 15 et il écrit ce chiffre dans un combo box).

    Voici mon problème:

    Pour un carré ( figure choisie) de 3 petits carrés par 3 petits carrés, il faut que j'alterne les couleurs.

    Ex:

    rouge bleu rouge
    bleu rouge bleu
    rouge bleu rouge

    mais dans mon cas nous retrouvons:

    rouge bleu rouge
    rouge bleu rouge
    rouge bleu rouge

    et ça ne fonctionne donc pas.

    De plus, l'utilisateur ayant un choix de couleur à faire dans son combo box, je n'arrive pas à convertir son choix pour que mon programme choisisse la bonne brosse, donc la bonne couleur --> Je pensais faire un switch case pour sa couleur, mais C# ne veut pas l'accepter dans la déclaration suivante:
    Voici le code que j'ai écrit pour le carré:
    private void btnDessiner_Click(object sender, EventArgs e)
    {
    Color Couleur1 = Color.Red;
    Color Couleur2 = Color.Blue;
    Color Couleur3 = Color.Yellow;
    Color Couleur4 = Color.Orange;
    Color Couleur5 = Color.MidnightBlue;
    SolidBrush BrosseRouge = new SolidBrush(Couleur1);
    SolidBrush BrosseBleue = new SolidBrush(Couleur2);
    SolidBrush BrosseJaune = new SolidBrush(Couleur3);
    SolidBrush BrosseOrange = new SolidBrush(Couleur4);
    SolidBrush BrosseBleueMinuit = new SolidBrush(Couleur5);
    Graphics Dessin = this.panDessin.CreateGraphics();
    Dessin.FillRectangle(BrosseBleueMinuit, 0, 0, 300, 300);
    int y = 4;
    int x = 4;
    int nNbreCarres;
    string sBrosseChoisie1;
    string sBrosseChoisie2;
    int j=1;
    int k=1;

    try
    {
    nNbreCarres = Convert.ToInt32(txtNbreCarres.Text);
    }
    catch
    {
    MessageBox.Show("Le nombre de carrés est invalide",
    "Validation du nombre de carrés",
    MessageBoxButtons.OK,
    MessageBoxIcon.Error);
    txtNbreCarres.Focus();
    return;
    }

    if (nNbreCarres < 3 || nNbreCarres > 15)
    {
    MessageBox.Show("Le nombre de carrés doit être entre 3 et 15 inclusivement",
    "Validation du nombre de carrés",
    MessageBoxButtons.OK,
    MessageBoxIcon.Error);
    txtNbreCarres.Focus();
    return;
    }

    switch (cboCouleur1.SelectedIndex)
    {
    case 0: sBrosseChoisie1 = "BrosseRouge";
    break;
    case 1 : sBrosseChoisie1 = "BrosseBleue";
    break;
    case 2 : sBrosseChoisie1 = "BrosseJaune";
    break;
    case 3 :

    default:sBrosseChoisie1 = "BrosseOrange";
    break;
    }

    switch (cboCouleur2.SelectedIndex)
    {
    case 0 : sBrosseChoisie2 = "BrosseRouge";
    break;
    case 1 : sBrosseChoisie2 = "BrosseBleue";
    break;
    case 2 : sBrosseChoisie2 = "BrosseJaune";
    break;
    case 3 :
    default: sBrosseChoisie2 = "BrosseOrange";
    break;
    }

    Dessin.FillRectangle(BrosseBleueMinuit, x, y, 300, 300);

    if (rbCarre.Checked)
    {
    while (j <= nNbreCarres)
    {
    while (k <= nNbreCarres)
    {
    Dessin.FillRectangle(sBrosseChoisie1 x, y, 10, 10);
    x = x + 15;
    k++;
    if (k <= nNbreCarres)
    {
    Dessin.FillRectangle(sBrosseChoisie2, x, y, 10, 10);
    x = x + 15;
    k++;
    }
    }
    y = y + 15;
    j++;
    k = 1;
    x = 4;
    }
    }


    Merci de m'aider le plus rapidement possible.

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 194
    Points
    5 194
    Par défaut
    salut

    en vitesse

    sBrossechoisie1 et 2 ne doivent pas etre des string, mais des solidBrush

    et dans les switch case, il te faut leur affecter l'une des solidbrush que tu as crées plus haut

    Perso, si je peux te donner un conseil, je ferais directement un usercontrol avec les méthodes qui vont bien et en surchargeant le OnPaint()

    Parce que la méthode avec le CreateGraphics(), c'est vraiment pas terrible dans la mesure ou une fois le dessin fait, bouge ta fenetre, ou fait la passer en arrière plan et fais la revenir devant.. yaura plus rien dessus

  3. #3
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Points : 706
    Points
    706
    Par défaut
    Pense à libérer tes objets de type SolidBrush pour ne pas obliger le GC à le faire.
    idem avec l'objet Graphics.

  4. #4
    Membre expérimenté Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Points : 1 732
    Points
    1 732
    Par défaut
    Salut !
    Un carré c'est un carré, ca a deux dimensions, même si c'est les même. Je vois pas du tout comment tu fais pour savoir où tu est dans tes boucles.

    Boolean bUseFirstBrush = true;
    SolidBrush b1 = new SolidBrush(Color.Red); // T'ennuis pas a stocker les couleurs
    SolidBrush b2 = new SolidBrush(Color.Blue);
    SolidBrush UsingBrush = null;
    int mX = 3; // où autre dimension
    int mY = 3; // Même dimensions que X
    int iX = 0; // Les index ca commence à 0, c'est plus simple surtout dans le cas de coordonnées
    int iY = 0;
    int iTileSize = 10;

    while(iY < mY) // 0, 1, 2 => ca fait bien 3 carrés
    {
    while(iX < mY)
    {
    if (bUseFirstBrush) { UsingBrush = b1; } else { UsingBrush = b2; }
    Dessin.FillRectangle(UsingBrush, iX * iTileSize, iY * iTileSize, iTileSize, iTileSize);
    bUseFirstBrush != bUseFirstBrush;
    iX++;
    }
    iX = 0; // On recommence une ligne, donc on repart de zéro
    iY++;
    }

    Beaucoup plus simple de t'y retrouver, et tu aura bien tes carré avec les couleurs dans l'ordre que tu voulais. Car toi tu déssinais tes carrés par 2, le bleue, suivit du rouge si yavais assez de place dans la ligne, et tu recommencait, jusqu'a arriver en fin de ligne et recommencer pour la ligne d'après, qui recommence donc forcément toujours par la même couleur.
    Avec ma méthode, on déssine les carré un a un, en inversant systématiquement la couleur, fin de ligne ou non.

    Les remarques laissées par les autres personnes sont valable quand même. Surtout concernant la libération des brosses car le GC ne le fera pas, si tu lis la documentation ils disent qu'ils faut impérativement libérer la mémoire. Surtout que celle réservée pour GDI est pas bien grande tu arrivera vite au bout si tu la libère pas.

  5. #5
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 29
    Points : 13
    Points
    13
    Par défaut
    Merci beaucoup, mais il me reste un problème. Je suis maintenant capable d'appliquer les couleurs sans problème, mais je n'arrive pas à les faire alterner. Quelle est la fonction spécifique qui fait de sorte que les couleurs alternent.

    Merci à l'avance encore.

  6. #6
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 194
    Points
    5 194
    Par défaut
    Alors la fonction qui alterne les couleurs s'appellent

    JeSwitchEntreDeuxCouleur(Color1,Color2);


    Ok, désolé, je pouvais pas m'en empecher...

    Cette fonction n'existe pas... il te faut la créer.. Et je pense que ce ne sera
    pas l'algo du siècle en info pour créer une telle fonction !!!

    Désolé... Matin == Taquin

  7. #7
    Membre expérimenté Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Points : 1 732
    Points
    1 732
    Par défaut
    Salut, dans mon code il y a alternage des Brush ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    if (bUseFirstBrush) { UsingBrush = b1; } else { UsingBrush = b2; }
    ...
    Le seul truc c'est que j'ai écrit une ligne un peu vite hier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    bUseFirstBrush != bUseFirstBrush;
    Il faut la remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    bUseFirstBrush = !bUseFirstBrush;
    La premiere version s'interprète comme une condition et non une affectation. Une condition toujours fausse d'ailleur.
    La seconde version affecte à bUseFirstBrush la valeur inverse de bUseFirstBrush. Donc si bUseFirstBrush = false, après il vaut true, et vice-versa

  8. #8
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 29
    Points : 13
    Points
    13
    Par défaut
    J'ai réglé le problème. Merci.

Discussions similaires

  1. dessiner en 3D avec GDI+
    Par jesslegende dans le forum VB.NET
    Réponses: 15
    Dernier message: 20/03/2010, 08h50
  2. Dessiner avec wxWidgets
    Par SuperPat dans le forum wxWidgets
    Réponses: 5
    Dernier message: 24/02/2009, 00h06
  3. Dessiner avec GDI dans un CWindowDC
    Par squale32 dans le forum MFC
    Réponses: 0
    Dernier message: 22/04/2008, 16h00
  4. Réponses: 1
    Dernier message: 26/02/2005, 12h55
  5. Dessiner un repere avec GDI ?
    Par djiwalloo dans le forum MFC
    Réponses: 19
    Dernier message: 12/10/2004, 11h57

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