Pb Rectangle de sélection et perte du focus

Résolu
cs_fcolo Messages postés 201 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 20 février 2007 - 2 juin 2006 à 09:17
cs_fcolo Messages postés 201 Date d'inscription mercredi 8 février 2006 Statut Membre 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;
        }

6 réponses

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
2 juin 2006 à 10:10
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
3
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
2 juin 2006 à 12:37
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;
3
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
2 juin 2006 à 09:33
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
0
cs_fcolo Messages postés 201 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 20 février 2007 2
2 juin 2006 à 09:43
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();
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_fcolo Messages postés 201 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 20 février 2007 2
2 juin 2006 à 10:44
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
0
cs_fcolo Messages postés 201 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 20 février 2007 2
2 juin 2006 à 13:09
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
0
Rejoignez-nous