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 :

Générer une grille de largeur inconnue et longueur inconnue + evenement sur les cellules.


Sujet :

C#

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 10
    Par défaut Générer une grille de largeur inconnue et longueur inconnue + evenement sur les cellules.
    Bonjour.

    Je souhaite développer pour une amie, un programme qui génére une grille.
    Sur chaque cellules de la grille, elle pourra changer la couleur de la cellule ou ajouter un symbole dessus. ( c'est une façon de créer des "cartes" codées pour tisser avec des motifs )

    Nom : Sans titre.png
Affichages : 680
Taille : 481,3 Ko


    Je débute en C# et souhaiterais le faire avec ce langage pour apprendre. ( je viens du monde LAMP ).

    J'ai pensé à créer l'objet PICTUREBOX dynamiquement pour générer ma grille ... mais j'ai peur que cela sois une solution un peu trop bourine ?

    Il y a bien sûre les outils de dessins .... mais ensuite vient la question du : comment délimiter mes cases, et savoir que : si je clique ici .... le programme mettra bien la couleur dans cette case. ( en PICTUREBOX ça me semble simple ).

    Qu'en pensez vous ?

    Je créé une classe "case" ? et j'utilise les délégués et events pour savoir si je clique sur mon objet Case ? ou bien tout simplement PICTURE BOX peut faire le job ? QUID des performances ?

  2. #2
    Membre chevronné Avatar de pascalCH
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Juillet 2006
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 188
    Par défaut
    bonjour,
    en partant d'un simple "Panel" pour faire une "Case" ça ne devrait pas être très compliqué, tu met directement la gestion des événements dans la Case et pas dans la Form, en plus tu pourras ajouter du drag'n drop, menu popup, changer les couleurs, les bordures, le texte.

    depuis la forme, une fois obtenu la taille de la grille, une boucle double créée les cases et les ajoutes dans un autre Panel conteneur

  3. #3
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Pascal > J'ai pas très bien compris l'idée...

    Tu veux créer autant de contrôles à l'écran qu'il y a de cases ??? Ça me semble particulièrement lourd (!!!). En effet, 20 colonnes x 20 lignes, on arrive déjà à 400 contrôles ! De quoi faire planter n'importe quelle machine à mon avis.

    Pour moi, l'idée d'un contrôle (picturebox ou autre), avec un "ondraw" surchargé pour utiliser un Graphics me semble bien plus propre (GDI+).

    Un List<List<Case>> pour gérer la partie "logique" des cases, et un rendu dans le Graphics.

    Pour le positionnement des click/drag&drop, aucun souci on sait retrouver ça sans aucun problème avec les mouseevents.

    PS : L'avantage, c'est que le Graphics pourra alors être utilisé pour créer un Image et l'exporter sous forme d'image (JPEG, PNG, BMP, etc) aussi bien que pour imprimer (en vectoriel s'il vous plaît).

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 10
    Par défaut
    Merci pour vos réponse, oui pour les composants panel , ça me semble lourd.

    DOnc avec un ondraw, si je dessine un carré, peu importe là où je clique dans le carré, il est capable de savoir que l'action s'apliquera pour toute cette "zone" ?

  5. #5
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    On peut utiliser un TableLayoutPanel en adaptant les event MouseClick et CellPaint.
    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
    Point selectedCell = new Point();
    private void tableLayoutPanel1_MouseClick(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
           selectedCell = new Point(e.X / (tableLayoutPanel1.Width / tableLayoutPanel1.ColumnCount), e.Y / (tableLayoutPanel1.Height / tableLayoutPanel1.RowCount));
           tableLayoutPanel1.Invalidate() ; // redraw
        }
    }
     
    void tableLayoutPanel1_CellPaint(object sender, TableLayoutCellPaintEventArgs e)
    {
      if (e.Row == selectedCell.Y || e.Column == SelecteCell.X)
      {
        Graphics g = e.Graphics;
        Rectangle r = e.CellBounds;
        g.FillRectangle(Brushes.Blue, r);
      }
    }

  6. #6
    Membre chevronné Avatar de pascalCH
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Juillet 2006
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 188
    Par défaut
    Citation Envoyé par Einheijar Voir le message
    Merci pour vos réponse, oui pour les composants panel , ça me semble lourd.

    DOnc avec un ondraw, si je dessine un carré, peu importe là où je clique dans le carré, il est capable de savoir que l'action s'apliquera pour toute cette "zone" ?
    Dans le cas ou tu dessine avec un OnDraw, les clics seront reçus sur le PictureBox (ou le Panel ) donc le Sender reçu sera toujours le controle global.
    il te faut gérer les événements plus finement :
    - le MouseDown pour capturer le spot (x/y) de la souris et connaitre le bouton de souris
    - le Click pour gérer lévenement
    - le MouseUp pour relacher le spot précédent

    le risque est d'avoir beaucoup de clignotement, sauf à gérer les "cases" a rafraichir, c'est pourquoi, une collection de panel est une bonne solution, pas si gourmande que ça, j'ai fait une grille de mot croisés avec des Panel, jusqu'à 500 x 500 sans broncher sur mon asus rog. (il faut juste verrouiller le panneau pendant la construction initiale)

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 10
    Par défaut
    Citation Envoyé par Graffito Voir le message
    On peut utiliser un TableLayoutPanel en adaptant les event MouseClick et CellPaint.
    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
    Point selectedCell = new Point();
    private void tableLayoutPanel1_MouseClick(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
           selectedCell = new Point(e.X / (tableLayoutPanel1.Width / tableLayoutPanel1.ColumnCount), e.Y / (tableLayoutPanel1.Height / tableLayoutPanel1.RowCount));
           tableLayoutPanel1.Invalidate() ; // redraw
        }
    }
     
    void tableLayoutPanel1_CellPaint(object sender, TableLayoutCellPaintEventArgs e)
    {
      if (e.Row == selectedCell.Y || e.Column == SelecteCell.X)
      {
        Graphics g = e.Graphics;
        Rectangle r = e.CellBounds;
        g.FillRectangle(Brushes.Blue, r);
      }
    }

    J'ai testé ta méthode ça marche bien !
    par contre je comprends pas la formule mathématique de :
    selectedCell = new Point(e.X / (tableLayoutPanel1.Width / tableLayoutPanel1.ColumnCount), e.Y / (tableLayoutPanel1.Height / tableLayoutPanel1.RowCount));


    Deplus y a un concepte qui m'échappe :

    tu fais un selectedCell = new point().

    puis dans la méthode, tu utilises l'objet créé et tu créés dedans un nouvel objet ??

  8. #8
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 196
    Par défaut
    un datagridview ?


    et 400 controles ca ne fait pas planter un programme
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. Générer une grille aléatoire pour sudoku en c
    Par lady_nine dans le forum C
    Réponses: 8
    Dernier message: 26/04/2014, 11h47
  2. [PDF] Probleme de longueur sur les cellules Date FR dans PDF
    Par C3DRIC49 dans le forum Bibliothèques et frameworks
    Réponses: 21
    Dernier message: 02/06/2009, 00h11
  3. [XL-2007] formule sur les cellules d'une colonne
    Par yanistelo dans le forum Excel
    Réponses: 6
    Dernier message: 28/05/2009, 19h52
  4. Evenement sur les barres de défilement d'une ScrollBox
    Par Nico118 dans le forum C++Builder
    Réponses: 2
    Dernier message: 06/05/2004, 14h56

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