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 :

rectangle de selection sur pictureBox


Sujet :

Windows Forms

  1. #1
    Membre habitué Avatar de salihovic
    Inscrit en
    Février 2007
    Messages
    255
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 255
    Points : 135
    Points
    135
    Par défaut rectangle de selection sur pictureBox
    salut
    j'aime dessiner un rectangle de selection sur un PictureBox situé dans un panel
    et j'aime que la selection ne dépasse pas le picture box donc la méthode drowreversibleFrame ne marche pas(sinon avec modification)
    et par la suite je veut que ce rectangle soi persistant jusqu'a le prochain click
    (et bien sure ne disparet pas si une forme vient audessus de celle ci)
    merci pour l'aide
    désolé si je pose la meme question deux fois mais l'autre solution ne marche pas

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 700
    Points : 780
    Points
    780
    Par défaut
    Salut,

    Hum,

    - Je ne vois pas de question(s) (technique(s))...
    - Tu "aimes" et tu "veuX" : ben si tu veux Mais je te ponderais pas un code entier gratos, et je ne ferais pas ton job...
    - Pitié, en plus de l'orthographe, tu massacres même la grammaire.. (j'ai rien compris si tu préfères..)
    - Si c'est la même question, pourquoi un second post?

  3. #3
    Membre habitué Avatar de salihovic
    Inscrit en
    Février 2007
    Messages
    255
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 255
    Points : 135
    Points
    135
    Par défaut
    le second post c'est pour dire que la première solution est insuffisante
    et pour bien éclaircir les choses.
    deuxièmment j'ai dis dans l'ancien post que j'ai réussi a faire la selection(rectangle de selection qui parche très bien)
    mais le problème que la méthode drawreversibleframe utilisé dessine sur l'écran et elle n'est pas délimité par la zone du pic en plus si je passe une autre forme au dessu le rectangle de selection disparait
    voici mon 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
     
    using System;
    using System.ComponentModel;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Text;
    using System.Windows.Forms;
    using System.Drawing;
     
    namespace test
    {
        public partial class panelli : Panel
        {
            public panelli()
            {
                InitializeComponent();
            }
          public  bool go = false;
            private bool _selecting = false;
            private Point _selectionStartPoint = Point.Empty;
            private Point _selectionEndPoint = Point.Empty;
            private Rectangle _selectionRect = Rectangle.Empty;
     
            private const FrameStyle SELECTION_STYLE = FrameStyle.Dashed;// FrameStyle.Thick;
     
            protected override void OnMouseDown(MouseEventArgs e)
            {
                base.OnMouseDown(e);
     
                if (e.Button == MouseButtons.Left)
                {
                    this._selecting = true;
                    this._selectionStartPoint = this.PointToScreen(new Point(e.X, e.Y));
                    this._selectionEndPoint = Point.Empty;
                    this._selectionRect = Rectangle.Empty;
                }
            }
     
            protected override void OnMouseMove(MouseEventArgs e)
            {
                base.OnMouseMove(e);
     
                if (this._selecting && go)
                {
                    // efface le rectangle de sléection précédent
                    ControlPaint.DrawReversibleFrame(this._selectionRect, this.BackColor, SELECTION_STYLE);
     
                    // calcul du nouveau rectangle
                    this._selectionEndPoint = this.PointToScreen(new Point(e.X, e.Y));
                    this._selectionRect = new Rectangle(
                        this._selectionStartPoint.X,
                        this._selectionStartPoint.Y,
                        this._selectionEndPoint.X - this._selectionStartPoint.X,
                        this._selectionEndPoint.Y - this._selectionStartPoint.Y
                        );
     
                    // dessin du nouveau rectangle
                    ControlPaint.DrawReversibleFrame(this._selectionRect, this.BackColor, SELECTION_STYLE);
                }
            }
     
            protected override void OnMouseUp(MouseEventArgs e)
            {
                base.OnMouseUp(e);
     
                if (this._selecting)
                {
                    // efface le rectangle de sélection
                    ControlPaint.DrawReversibleFrame(this._selectionRect, Color.BlueViolet, SELECTION_STYLE);
                }
     
                this._selecting = false;
                go = false;
            }
     
     
     
        }
    }
    l'adresse du post : http://www.developpez.net/forums/sho...32#post2891332
    si qualqun a une réponse merci

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Points : 627
    Points
    627
    Par défaut
    Salut

    ici, tu ne dessines ta selection qu'une seule fois, si la form se refraichit, il ne se dessinera plus. Il faut overrider la methode OnPaint, et si il y a une selection (bool ou test sur la selection contre Rectangle.Empty, comme tu veux), tu redessines cette selection.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 700
    Points : 780
    Points
    780
    Par défaut
    Citation Envoyé par SirJulio Voir le message
    tu redessines cette selection.
    Tu peux aussi mettre en cache l'image peinte avec la sélection, et tu ne redessines que le rectangle nécessaire (+ de mémoire, mais + rapide)

  6. #6
    Membre habitué Avatar de salihovic
    Inscrit en
    Février 2007
    Messages
    255
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 255
    Points : 135
    Points
    135
    Par défaut
    oui je c que pour rendre le rectangle de selecion persistant il faut overrider la méthode onPaint mais mon grand problème c'est quand la selection passe sur des autres controls aussi la selection dépasse le cadre(le pictureBox)
    est ce qu'il y a une manière simple pour éviter ça???
    ou il faut écrire le code par la main???
    c-a-d : il faut faire un override de onPaint oû on écrit g.drawRectangle()
    puis dans les autres méthodes onmouse move et down et up on manipule les positions en limitant la zone(si la souris sorte de la zone de pictureBox on la fait rentrer)
    je pense que c la seule solution mais j'ai cru que par la classe control paint c plus simple il suffit de donner les rectangles de selection et c tt
    mais pour l'autre méthode il faut bien calculer et quand le rectangle s'inverse!!!

    si quelqun peut m'aider par un simple code

  7. #7
    Membre habitué Avatar de salihovic
    Inscrit en
    Février 2007
    Messages
    255
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 255
    Points : 135
    Points
    135
    Par défaut
    j'ai trouvé ce code mais je sait pas il n'a pas marché chez moi
    peut etre j'ai mal écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    protected override void OnPaint(PaintEventArgs e)
    {
       Graphics g = e.Graphics;
       Rectangle inner = selectionRectangle;
       inner.Inflate(-2, -2);
       ControlPaint.DrawSelectionFrame(g, true, selectionRectangle, inner, Color.Black);
    }
    et pour les onmouse down et on mouse move le calcul des position du rect

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Points : 627
    Points
    627
    Par défaut
    Citation Envoyé par salihovic Voir le message
    oui je c que pour rendre le rectangle de selecion persistant il faut overrider la méthode onPaint mais mon grand problème c'est quand la selection passe sur des autres controls aussi la selection dépasse le cadre(le pictureBox)
    est ce qu'il y a une manière simple pour éviter ça???
    ou il faut écrire le code par la main???
    c-a-d : il faut faire un override de onPaint oû on écrit g.drawRectangle()
    puis dans les autres méthodes onmouse move et down et up on manipule les positions en limitant la zone(si la souris sorte de la zone de pictureBox on la fait rentrer)
    je pense que c la seule solution mais j'ai cru que par la classe control paint c plus simple il suffit de donner les rectangles de selection et c tt
    mais pour l'autre méthode il faut bien calculer et quand le rectangle s'inverse!!!

    si quelqun peut m'aider par un simple code
    Bah tu viens de te donner la solution.

    Tu redessines chaque ton rectangle dans le paint (ou toute la partie selectionné, comme propose Chubyone).

    Pour la sortie de control, c'est pas bien compliqué, juste un peu long à ecrire, mais tu as compris le truc (pour note ne bloque pas la souris, rien de plus horripilant qu'une appli qui s'amuse avec ta souris) tu arretes d'aggrandir le rectangle si la souris sort.

    Bref, la solution tu l'as (t'as fait 80% du job). "y plus ka !"

  9. #9
    Membre habitué Avatar de salihovic
    Inscrit en
    Février 2007
    Messages
    255
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 255
    Points : 135
    Points
    135
    Par défaut
    bon j'ai ecrit un petit code mais il contient des erreurs
    j'ai un soucis avec la méthode onpaint car quand je fait l'override le controle que j'ai ecrit tromble
    aussi j'ai pas bien fait pour dessiner le rectangle inversé

    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
     
    public partial class selectionrect : PictureBox
        {
            public selectionrect()
            {
                InitializeComponent();
                //this.SetStyle(ControlStyles.UserPaint |
                //              ControlStyles.AllPaintingInWmPaint |
                //              ControlStyles.OptimizedDoubleBuffer, true);
            }
            public String position = null;
            private Point _poitdepart=Point.Empty;
            private Point _poitarrive=Point.Empty;
            private Rectangle rect=Rectangle.Empty;
            Point inter = Point.Empty;
            private bool selct = false;
            private Pen pen = new Pen(Color.Yellow);
            protected override void OnMouseDown(MouseEventArgs e)
            {
                //base.OnMouseDown(e);
                if (e.Button == MouseButtons.Left)
                {
                    selct = true;
                    _poitdepart = new Point(e.X, e.Y);
                   _poitarrive=Point.Empty;
                     rect=Rectangle.Empty;
                     inter.X = _poitdepart.X;
                     inter.Y = _poitdepart.Y;
                }
            }
            protected override void OnMouseMove(MouseEventArgs e)
            {
                //base.OnMouseMove(e);
                if (selct)
                {
                    _poitarrive = new Point(e.X, e.Y);
                    position = _poitarrive.ToString();
                    // _poitdepart;
                    //voir si le poit d'arrivé est positif sinon inverser
                    //pour que le rectangle soit bien dessiné ;)
                    if (_poitarrive.X<=inter.X || _poitarrive.Y <=inter.Y)
                    {
                        //permuter pour que le rect n'as pas de paramètres négatifs ;)
                        _poitdepart.X = e.X;
                        _poitdepart.Y = e.Y;
                        _poitarrive.X = inter.X;
                        _poitarrive.Y = inter.Y;
                    }
     
                    //maintenat calcul du rectangle ;)
                    rect = new Rectangle(_poitdepart.X, _poitdepart.Y, _poitarrive.X - _poitdepart.X, _poitarrive.Y - _poitdepart.Y);
                }
            }
            protected override void OnMouseUp(MouseEventArgs e)
            {
                //base.OnMouseUp(e);
                //on finit le dessin par désactiver le dessin des rectangles ;)
                selct = false;
                //MessageBox.Show(_poitdepart.ToString()+"\n"+_poitarrive.ToString()+"\n"+rect.ToString());
            }
            protected override void OnPaint(PaintEventArgs pe)
            {
                base.OnPaint(pe);
                //if (selct)
                {
                    //on dessine un rectangle avec les coordonnées du rectangel de selection ;)
                    Graphics g = pe.Graphics;
                    g.DrawRectangle(pen, rect);
                    g.DrawString("position" + position, new Font(FontFamily.GenericSerif, 12), Brushes.Red, new PointF(0, 0));
                    g.DrawString("arrive" + _poitarrive.ToString(), new Font(FontFamily.GenericSerif, 12), Brushes.Red, new PointF(0, 20));
                    g.DrawString("depart" + _poitdepart.ToString(), new Font(FontFamily.GenericSerif, 12), Brushes.Red, new PointF(0, 40));
                    g.DrawString("inter" + inter.ToString(), new Font(FontFamily.GenericSerif, 12), Brushes.Red, new PointF(0, 60));
                    g.DrawString("rectangle" + rect.ToString(), new Font(FontFamily.GenericSerif, 12), Brushes.Red, new PointF(0, 80));
                    this.Invalidate();
                }
            }
        }

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Points : 627
    Points
    627
    Par défaut
    Tromble ? =p

    Bah vi, c'est normal, si tu appelles Invalidate() dans un Paint, ca va boucler puisque ton control est en permanence invalidé et redessiné. Bref, enleves le Invalidate(), tu n'en as pas besoin puisque tu viens de dessiner.

  11. #11
    Membre habitué Avatar de salihovic
    Inscrit en
    Février 2007
    Messages
    255
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 255
    Points : 135
    Points
    135
    Par défaut
    merci SirJulio justement il faut enlever invalidate() de onPaint()
    et la mettre dans onMouseMove()
    j'ai trouvé la solution
    merci encore une foi car ces petits trucs font la différence

  12. #12
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Si c'est résolu ->

    Merci
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  13. #13
    Candidat au Club
    Inscrit en
    Juillet 2010
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 3
    Points : 4
    Points
    4

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

Discussions similaires

  1. Recupération des selections sur une DBGrille multi Selection
    Par Andry dans le forum Bases de données
    Réponses: 1
    Dernier message: 26/11/2004, 11h43
  2. [SELECT sur 16 millions de lignes] délai très grand
    Par localhost dans le forum Requêtes
    Réponses: 6
    Dernier message: 22/11/2004, 17h04
  3. insert-select sur 2 base différente
    Par gskoala dans le forum Paradox
    Réponses: 2
    Dernier message: 16/11/2004, 15h11
  4. select sur un champ de type LONG
    Par ppd dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/09/2004, 18h19
  5. select sur plusieurs table, question sur jointure
    Par Schulman dans le forum Langage SQL
    Réponses: 7
    Dernier message: 03/09/2004, 13h54

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