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

cs_fcolo 201 Messages postés mercredi 8 février 2006Date d'inscription 20 février 2007 Dernière intervention - 2 juin 2006 à 09:17 - Dernière réponse : cs_fcolo 201 Messages postés mercredi 8 février 2006Date d'inscription 20 février 2007 Dernière intervention
- 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
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 2 juin 2006 à 10:10
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

Merci cs_Bidou 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de cs_Bidou
Meilleure réponse
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 2 juin 2006 à 12:37
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;

Merci Lutinore 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de Lutinore
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 2 juin 2006 à 09:33
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
cs_fcolo 201 Messages postés mercredi 8 février 2006Date d'inscription 20 février 2007 Dernière intervention - 2 juin 2006 à 09:43
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
cs_fcolo 201 Messages postés mercredi 8 février 2006Date d'inscription 20 février 2007 Dernière intervention - 2 juin 2006 à 10:44
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
cs_fcolo 201 Messages postés mercredi 8 février 2006Date d'inscription 20 février 2007 Dernière intervention - 2 juin 2006 à 13:09
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.