Pb Rectangle de sélection et perte du focus [Résolu]

Messages postés
201
Date d'inscription
mercredi 8 février 2006
Dernière intervention
20 février 2007
- - Dernière réponse : cs_fcolo
Messages postés
201
Date d'inscription
mercredi 8 février 2006
Dernière intervention
20 février 2007
- 2 juin 2006 à 13:09
Bonjour,
j'ai une application dans laquelle j'affiche plusieur panel les uns à coté des autres.
J'ai implémenté le fait que, lors d'un clic sur un panel, il prend le focus et une rectangle de sélection s'affiche autour de lui.
J'enlève ce rectangle lorsque le panel perd le focus.
J'ai surclasser la classe Panel en MyPanel en y ajoutant des variables dont
public bool selected = false;
spécifiant si le panel est selectionné ou non (je l'ai ajouté ensuite pour essayé de regler mon probleme mais ca n'a rien fait).
Tout fonctionne bien mais lorsque je clique sur un panel (le rectangle de selections s'affiche) et que je maximise ma form, ca perd les pédales et le rectangle reste affiché donc ensuite ca fait l'inverse, le panel est toujours "selectionné" (rectangle affiché) sauf lorsque je clique dessus.

Existe-t-il un autre moyen d'afficher un rectangle de sélection?
Connaissez vous un moyen pour résoudre mon problème?

Merci

f.colo

//Clic sur le panel
         void p_Click(object sender, EventArgs e)
        {
            MyPanel p = (MyPanel)sender;
            if (!p.Focused)
            {
                p.Focus();
                p.Select();
            }           
        }

//prise du focus du panel
        void p_GotFocus(object sender, EventArgs e)
        {
            MyPanel p = (MyPanel)sender;
            if (p.selected)
                return;
            this.comboBox4.SelectedIndex = p.numeroPanel - 1;
            this._selectionRect = new Rectangle(
                      p.PointToScreen(new Point(0, 0)).X,
                      p.PointToScreen(new Point(0, 0)).Y,
                      p.Width,
                      p.Height);

            ControlPaint.DrawReversibleFrame(this._selectionRect, p.BackColor, SELECTION_STYLE);
            p.selected = true;
        }

//perte du focus par le panel
void p_LostFocus(object sender, EventArgs e)
        {
            MyPanel p = (MyPanel)sender;
            if (!p.selected)
                return;
            this._selectionRect = new Rectangle(
                      p.PointToScreen(new Point(0, 0)).X,
                      p.PointToScreen(new Point(0, 0)).Y,
                      p.Width,
                      p.Height);

            ControlPaint.DrawReversibleFrame(this._selectionRect, p.BackColor, SELECTION_STYLE);
            p.selected = false;
        }
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
58
3
Merci
J'ai crée une form, j'ai mis un panel dessus :

private
void Form1_Load(
object sender,
EventArgs e)
{
  
this.panel1.GotFocus +=
new
EventHandler(
this.panel1_GotFocus);
  
this.panel1.LostFocus +=
new
EventHandler(
this.panel1_LostFocus);
}

private
void panel1_LostFocus(
object sender,
EventArgs e)
{
   focus =
false;
}

private
void panel1_GotFocus(
object sender,
EventArgs e)
{
   focus =
true;
}

private
void panel1_Paint(
object sender,
PaintEventArgs e)
{
  
if (focus)
   {
     
Panel panel = sender
as
Panel;
      e.Graphics.DrawRectangle(
Pens.Red, 0, 0, panel.Width - 2, panel.Height - 2);
   }
}

private
void panel1_SizeChanged(
object sender,
EventArgs e)
{
   (sender
as
Panel).Invalidate();

}

Mais bon, je me demande si c'est pas mieux de dériver d'un Panel et d'implémenter la fonction dedans.
Ca fait moins bricolage...

<hr size="2" /> VC# forever
=13319

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 89 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Bidou
Messages postés
3248
Date d'inscription
lundi 25 avril 2005
Dernière intervention
27 octobre 2012
36
3
Merci
Salut,

Pour supprimer DrawReversibleFrame il faut la redessiner aux même coordonnées.
 
Pour dessiner en pointillé :

Pen p = new Pen( Color.Black );
p.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 89 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Lutinore
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
58
0
Merci
Salut,
Je ne sais pas si c'est la meilleure solution, mais je dois dire que j'aurais dessiné dans le OnPaint et juste mis 
   p.selected = false; ou
   p.selected = true;

Dans les events Got/Lost Focus...

<hr size="2" /> VC# forever
=13319
Commenter la réponse de cs_Bidou
Messages postés
201
Date d'inscription
mercredi 8 février 2006
Dernière intervention
20 février 2007
1
0
Merci
Je suis désolé mais j'ai pas tres bien compris.
Voila ce que j'ai fait apres ta réponse (mais ca ne fonctionne pas).

Dans MyPanel:
protected override void OnPaint(PaintEventArgs e)
        {
            if (selected)
            {
                this._selectionRect = new Rectangle(
                      this.PointToScreen(new Point(0, 0)).X,
                      this.PointToScreen(new Point(0, 0)).Y,
                      this.Width,
                      this.Height);
                ControlPaint.DrawReversibleFrame(this._selectionRect, this.BackColor, SELECTION_STYLE);
            }
            base.OnPaint(e);
        }

Dans le lost et getfocus:
            p.selected = false ou true;
            p.Update();
Commenter la réponse de cs_fcolo
Messages postés
201
Date d'inscription
mercredi 8 février 2006
Dernière intervention
20 février 2007
1
0
Merci
Ok, ca fonctionne merci :), juste que le rectangle en bas et en gauche sont a l'extérieur.
Me reste plus qu'a savoir dessiner en pointiler :).

    public class MyPanel : System.Windows.Forms.Panel
    {
        public bool focus = false;
        public MyPanel(int num) : base()
        {
            this.Paint += new PaintEventHandler(MyPanel_Paint);
            this.GotFocus += new EventHandler(MyPanel_GotFocus);
            this.LostFocus += new EventHandler(MyPanel_LostFocus);
            this.SizeChanged += new EventHandler(MyPanel_SizeChanged);
        }

        void MyPanel_Paint(object sender, PaintEventArgs e)
        {
            if (focus)
            {
                Panel panel = sender as Panel;
                e.Graphics.DrawRectangle(Pens.Red, 0, 0, panel.Width - 2, panel.Height - 2);
            }
        }

        void MyPanel_SizeChanged(object sender, EventArgs e)
        {
            (sender as Panel).Invalidate();
        }

        void MyPanel_LostFocus(object sender, EventArgs e)
        {
            focus = false;
            (sender as Panel).Invalidate();
        }

        void MyPanel_GotFocus(object sender, EventArgs e)
        {
            focus = true;
            (sender as Panel).Invalidate();
        }
    }

f.colo
Commenter la réponse de cs_fcolo
Messages postés
201
Date d'inscription
mercredi 8 février 2006
Dernière intervention
20 février 2007
1
0
Merci
Merci, j'avais trouvé pour les pointillé :)
Pour supprimer le rectangle de sélection, j'avais trouvé également mais le soucis etait que je ne l'appelé pas au bon moment. Il n'y a pas de perte de focus lorsqu'on rezize la form principale et il disparaissait, ca mettait le bordel sur la form ensuite.
La solution que m'a proposé Bidou fonctionne aussi bien (même mieux ;) ).

Merci

f.colo
Commenter la réponse de cs_fcolo

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.