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 :

Problème pour cliquer sur un rectangle orienté avec matrix


Sujet :

C#

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Problème pour cliquer sur un rectangle orienté avec matrix
    Bonjour je suis actuellement sur mon projet pour ma deuxième année en bts IRIS et j'ai un gros soucis.
    j'effectue une rotation de 45 degré sur un rectangle et j'aimerais que lorsque je clique dessus qu'il se colore en jaune.
    J'ai un soucis que je ne comprend pas: lorsqu'on lance le programme, le rectangle est dessiné bien orienté mais lorsque je clique dessus il ne se colorie pas. Le rectangle en revanche se colorie lorsque je clique a la place que le rectangle occuperais sans avoir subit la rotation il se colorie. J'ai l'impression que "l'image" du rectangle subit la rotation mais pas l'objet en lui-même .
    voici ma méthode de dessin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Point ancrage = new Point(x, y);
    Matrix myMatrix = new Matrix();
    myMatrix.RotateAt(45, ancrage, MatrixOrder.Append);
    g.Transform = myMatrix;
    rect2 = new Rectangle(x,y, dimension, dimension);
    g.DrawRectangle(new Pen(Color.Black), rect2);
    myMatrix.Reset();
    et ma méthode de clic :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     Point point = new Point(e.X, e.Y);           
     Point ancrage = new Point(x, y);
     Matrix myMatrix = new Matrix();
     myMatrix.RotateAt(45, ancrage, MatrixOrder.Append);
     g.Transform = myMatrix;
     if ( rect2.Contains(point) && e.Button == MouseButtons.Left)
     {              
           g.FillRectangle(new SolidBrush(Color.Yellow), rect2);                
           myMatrix.Reset();                       
     }
    J'espère que quelqu'un pourra m'aider, et que vous comprendrez ce que j'ai essayer d'expliquer mais même moi j'ai du mal a me l'expliquer.
    Merci d'avance.

  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 195
    Points
    5 195
    Par défaut
    salut

    il te faut utiliser la classe Region qui permet de définir si un point se trouve dans une surface...

    Ainsi, pour un rectangle definit par position, width, heigth et rotate, tu aurais un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Si Area est ta region, 
     
                GraphicsPath path = new GraphicsPath();
                Matrix mat = new Matrix();
                mat.RotateAt(rotate, position);            
                path.AddRectangle(new RectangleF(position.X, position.Y, width, heigth));
                path.Transform(mat);
                Area = new Region(path);
     
    Après, tu peux faire dans ton click :
     
         if( Area.IsVisible(e.Location)) ==> Ton click est dans ton rectangle...
    Le mieux serait surement de te faire une petite librairie avec des composants graphiques...

    genre : un Drawer qui contiendrait une liste de Shape à dessiner...
    Et ensuite, tes shapes seraient des classes avec une fonction render(Graphics)... et une fonction genre "IsInsideShape"...

    Tu vois le concept ?

    Exemple en pièce jointe...
    Fichiers attachés Fichiers attachés
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci de ta réponse. Par contre je suis désolé mais j'ai oublié de préciser que je suis en windows form .

  4. #4
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour
    Tout depend du besoin...mais un lib graphique permet de factoriser tes differentes sortes de figures(shapes)...
    En tout cas pour dessiner en GDI+,il est recommende d'utiliser le Class GraphicsPath plus performant qui permet de dessiner toutes les primitives(rectangle,line,bezier et image) en plus c'est qu'il permet de faire :
    -des hittest meme sur un bizarroide polygoine que tu auras dessine avec sa methode IsVisible(IsOutlineVisible ...permets de "hittester" meme le contour)...
    -comporte une methode transform qui prend un matrix (son transform est un "transform local" à la figure qui evite de toucher au systeme de coordonnes universel du graphics lie au control...)...

    voici un exemple code :
    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
     
     
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Drawing.Drawing2D;
     
    namespace WinVersalitePath
    {
        public enum Figure
        { 
           none, rect,ellipse
        }
        public partial class Form1 : Form
        {
     
            GraphicsPath pthRect =new GraphicsPath ();
            GraphicsPath pthEllip = new GraphicsPath();
     
     
            public Form1()
            {
                InitializeComponent();
                UpDownRect.Maximum = 180;
                UpDownRect.Minimum = -180;
                UpDownRect.Value=45;
                UpDownEllipse.Maximum = 180;
                UpDownEllipse.Minimum = -180;
                UpDownEllipse.Value = 15;
            }
     
     
            Point ancrage;
            SolidBrush fillNormal = new SolidBrush(Color.Blue);
            SolidBrush fillSelection = new SolidBrush(Color.Magenta );
            Pen penRect = new Pen(Color.Black , 2.0f);
     
            float angleRect;
            float angleEllip; 
     
            private void button1_Click(object sender, EventArgs e)
            {
     
                int w = 100;
                int h = 70;
     
                Rectangle   rect = new Rectangle(50, 80, w, h);
                ancrage = new Point(rect.Left+w/2, rect.Top+h/2);
     
     
                Matrix myMatrixRect = new Matrix();
                myMatrixRect.RotateAt(angleRect, ancrage, MatrixOrder.Append);
     
     
                pthRect.Reset();
                pthRect.AddRectangle(rect);
                pthRect.Transform(myMatrixRect);
     
                rect = new Rectangle(100, 120, w, h);
                ancrage = new Point(rect.Left + w / 2, rect.Top + h / 2);
     
     
                Matrix myMatrixEllip = new Matrix();
                myMatrixEllip.RotateAt(angleEllip, ancrage, MatrixOrder.Append);
     
                pthEllip.Reset();
                pthEllip.AddEllipse(rect);
                pthEllip.Transform(myMatrixEllip);
                this.Invalidate();
     
            }
     
     
     
           Figure  cliquedFigure;
            private void Form1_MouseDown(object sender, MouseEventArgs e)
            {
                Point pointClicked = e.Location;
     
                if ( pthRect.IsVisible(e.Location) )
                {
                        cliquedFigure =Figure.rect  ;
     
                }
                else if (pthEllip.IsVisible(e.Location))
                {
                    cliquedFigure = Figure.ellipse;
     
                }
                else
                {
                    cliquedFigure=Figure.none  ;
                }
     
                this.Invalidate();
     
            }
            private void Form1_Paint(object sender, PaintEventArgs e)
            {
     
                Graphics g = e.Graphics;
     
                switch (cliquedFigure)
                {
                    case Figure.rect :
                        g.FillPath(fillSelection, pthRect);
                        g.FillPath(fillNormal, pthEllip);
                         break; 
                    case Figure.ellipse:
                        g.FillPath(fillSelection, pthEllip );
                        g.FillPath(fillNormal, pthRect);
                         break; 
                    default:
                        g.FillPath(fillNormal, pthRect);
                        g.FillPath(fillNormal, pthEllip);
                        break;
                }
                g.DrawPath(penRect, pthRect );
                g.DrawPath(penRect, pthEllip);
     
            }
     
     
     
            private void UpDownRect_ValueChanged_1(object sender, EventArgs e)
            {
                angleRect = (float)UpDownRect.Value; 
     
            }
     
            private void UpDownEllipse_ValueChanged(object sender, EventArgs e)
            {
                angleEllip = (float)UpDownEllipse.Value; 
            }
     
     
     
        }
    }
    bon code...

  5. #5
    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 195
    Points
    5 195
    Par défaut
    euh, dordel, le code que je t'ai envoyé reprend l'architecture d'une librairie pour ajouter des graphismes à une application.

    Mon exemple est en Winform.

    Donc, mon exemple répond ENTIEREMENT à ta question, ton besoin, ton environnement.

    Prend le temps de le regarder correctement.

    L'exemple est en .Net 4.0 mais en fait, je n'utilise aucune fonctionnalité 4.0, donc, il tournera sans aucun soucis en 2.0.

    A bon entendeur,
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci pour vos deux réponses j'en prend note et je vais appliquer cela dans la semaines, je vous dirais si tout fonctionne correctement .

Discussions similaires

  1. MVVM - Problème pour Autoscroll sur une ListBox avec du databinding
    Par caramel dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 18/11/2011, 14h29
  2. Problème d'espace sur IE menu vertical avec image de fond
    Par dom dom from the dom dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 09/03/2007, 11h30
  3. Réponses: 2
    Dernier message: 30/11/2006, 10h22
  4. Réponses: 2
    Dernier message: 10/07/2006, 11h08
  5. [Struts] Problème pour itérer sur un vecteur
    Par vallica dans le forum Struts 1
    Réponses: 5
    Dernier message: 24/04/2006, 15h45

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