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 :

GDI - detection click rectangle


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Par défaut GDI - detection click rectangle
    J'ai créé un controle calendrier à l'aide de GDI.
    Ce calendrier est pour le moment quasi similaire au calendrier standard monthcalendar. Chaque jours de mon calendrier correspond à un rectangle. Je souhaiterais savoir quelle est la meilleure facon de faire pour détecter un clic sur tel ou tel jours. Je suppose qu'a un moment ou a un autre je devrais utliser la Rectangle.Contains() mais après je ne sais pas trop comment m'y prendre donc si vous avez des pistes pour éviter de me lancer dans un chemin boueux...merci

    La fonction de dessin de mon calendrier :
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    private void DrawCalendar(DateTime date)
            {
                Graphics g = this.CreateGraphics();
                int lineHeight = (int)this.Height / 9;
                int colWidth = (int)this.Width / 7;
                int xPos = 0, yPos = 0;
                DateTime[] firstWeekOfMonth;
     
                Rectangle rHeader = new Rectangle(xPos, yPos, Width, lineHeight);
     
                Button btnPrevious = new Button();
                Button btnNext = new Button();
     
                btnPrevious.Location = new Point(xPos, yPos);
                btnPrevious.Size = new Size(lineHeight, lineHeight);
                btnPrevious.Text = "<<";
                btnPrevious.Click += new EventHandler(btnPrevious_Click);
                this.Controls.Add(btnPrevious);
     
     
                btnNext.Location = new Point(Width - lineHeight, yPos);
                btnNext.Size = new Size(lineHeight, lineHeight);
                btnNext.Text = ">>";
                btnNext.Click += new EventHandler(btnNext_Click);
                this.Controls.Add(btnNext);
     
                StringFormat sf = new StringFormat();
                sf.Alignment = StringAlignment.Center;
                sf.LineAlignment = StringAlignment.Center;
                g.DrawString(culture.DateTimeFormat.GetMonthName(date.Month).ToString() +  date.ToString(" yyyy"), headerFont, new SolidBrush(headerColor), rHeader, sf);
                yPos += lineHeight;
     
                for (int i = 0; i <= 6; i++)
                {
                    DayOfWeek day = FRIntToDayOfWeek(i);
                    g.DrawRectangle(new Pen(gridBorderColor), xPos, yPos, colWidth, lineHeight);
                    g.DrawString((culture.DateTimeFormat.GetDayName(day)).ToString().Substring(0, 3), dayNumberFont, new SolidBrush(dayNumberColor), new Rectangle(xPos, yPos, colWidth, lineHeight));
                    xPos += colWidth;              
                }
     
                xPos = 0;
                yPos += lineHeight;
     
                firstWeekOfMonth = MFFTools.GetTabDaysOfWeek(MFFTools.GetFirstDayOfMonth(date));
     
                for (int i = 1; i <= 6; i++)
                {
                    for (int j = 0; j <= 6; j++)
                    {
                        g.DrawRectangle(new Pen(gridBorderColor), xPos, yPos, colWidth, lineHeight);
                        g.DrawString(firstWeekOfMonth[j].Day.ToString(), dayNumberFont, new SolidBrush(dayNumberColor), new Rectangle(xPos, yPos, colWidth, lineHeight));
                        xPos += colWidth;
                    }
                    if (xPos + colWidth > Width)
                    {
                        yPos += lineHeight;
                        xPos = 0;
                    }
                    for (int j = 0; j <= firstWeekOfMonth.Length - 1; j++)
                    {
                        firstWeekOfMonth[j] = firstWeekOfMonth[j].AddDays(7);
                    }
                }
                g.DrawString(DateTime.Now.ToString("dd ") + culture.DateTimeFormat.GetMonthName(DateTime.Now.Month) + DateTime.Now.ToString(" yyyy"), footerFont, new SolidBrush(footerColor), new Rectangle(xPos, yPos, Width, lineHeight));        
            }

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 97
    Par défaut
    Ca dépend du style de chacun mais perso j'aurais fait :

    - Créer une classe qui contient un jour de la semaine et un rectangle correspondant à la position
    - Créer une instance de ta classe pour chaque jour de la semaine et les garder dans un tableau (dans mon exemple plus bas : "this.Days")
    - Dans la boucle dans DrawCalendar, renseigner la propriété Rectangle de chacune de tes instances :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    foreach (var day in this.Days)
    {
      day.Position = new Rectangle(xPos, yPos, colWidth, lineHeight);
     
      g.DrawRectangle(new Pen(gridBorderColor), day.Position);
      g.DrawString(day.Name, dayNumberFont, new SolidBrush(dayNumberColor), new Rectangle(xPos, yPos, colWidth, lineHeight));
      xPos += colWidth;              
    }
    - Dans l'évènement click de ton control, parcourir ta liste pour déterminer lequel est positionné sous le curseur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void OnMouseDown(object sender, MouseEventArgs e)
            {
                if (e.Button == MouseButtons.Left)
                {
                    var selectedDay = this.Days.FirstOrDefault(d => d.Position.Contains(e.Location));
     
                    if (selectedDay != null)
                    {
                        // Faire ce que tu veux avec ton jour sélectionné
                    }
                }
            }
    A adapter en fonction de ton style et de tes besoins

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Par défaut
    Merci pour ta réponse KooKiz.

    Ta méthode me parait très intéressante. Le fait de créer un tableau contenant des instances de chaque jours me permettra notamment de conserver d'autres informations liées à chacun de ces jours.

    Pour la première partie concernant la création de chacune de mes instances avec le rectangle correspondant à la position aucun problème. Pour la suite j'ai un peu plus de mal mais c'est du à mes lacunes en ce qui concerne les événements en c#, j'ai encore un peu de mal a savoir quoi mettre ou... Mais bon je vais y arriver !!!

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Par défaut
    C'est bon j'ai réussis.... c'est idiot j'étais bloqué sur l'event OnMouseDown, je ne connaissais pas cet événement du coup j'ai lu a moitié ton message car je bloquais sur un événement Click et forcément impossible de chopper le e.Location... Je suis vraiment une bille, en fait c'était loin d'être compliqué j'aurais pu trouver moi même...

    Merci de ton aide en tout cas et la prochaine fois je lirais attentivement les réponses qu'on me propose plutot que partir bille en tête et galérer...

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

Discussions similaires

  1. API detecte Click souris
    Par avigeilpro dans le forum VB 6 et antérieur
    Réponses: 23
    Dernier message: 05/08/2019, 12h20
  2. Detecter un rectangle dans une image
    Par yasmin11qq dans le forum Images
    Réponses: 9
    Dernier message: 03/07/2014, 19h53
  3. detection de rectangles sous java
    Par mannouly dans le forum 2D
    Réponses: 0
    Dernier message: 10/04/2009, 16h30
  4. detection click QLineEdit
    Par uriotcea dans le forum Qt
    Réponses: 2
    Dernier message: 21/05/2008, 16h03
  5. [TListView] Detection Click droit colonne / Ligne
    Par BATiViR dans le forum Delphi
    Réponses: 5
    Dernier message: 13/06/2007, 08h49

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