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 :

Clic formulaire MDI


Sujet :

C#

  1. #1
    Modérateur
    Avatar de toopac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 940
    Par défaut Clic formulaire MDI
    Bonjour,

    Dans un formulaire MDI, j'ai un panel à gauche qui s'affiche et se masque en fonction de mes besoins.

    Je voudrais le cacher quand je clique ailleurs que dans ce dernier.

    Pour cela j'ai pensé détecter les clics dans le formulaire MDI, avec l'événement mouseclick ou mousedown, mais cet événement n'est déclenché uniquement lorsque je clique dans un tabcontrol situé en bas de mon formulaire MDI.

    Y a-t-il un événement du panel qui puisse détecter un clic en dehors de lui même, ou un événement du formulaire MDI qui puisse détecter un clic dans sa zone vide?

    Merci d'avance pour vos réponses

  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
    Par défaut
    tu devrais trouver une réponse : Ici

  3. #3
    Modérateur
    Avatar de toopac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 940
    Par défaut
    donc les MDI parent form ne sont pas supposés de lever les événements 'mouse'.

    Mais y a-t-il un événement du panel qui pourrait résoudre mon problème sans passer par la librairie user32.dll?

  4. #4
    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
    Par défaut
    beh, tu mets un panel "transparent" en fond de ta form MDI, et basta

    Sinon, si tu veux "capturer" la mouse par le panel present, il va te falloir appeler d'autres fonctions de l'API Win32

    Donc, je mettrais un panel de fond qui servira de "capteur" d'evenement souris et ton autre panel...

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

    voici un bout de code qui devrait te convenir

    En gros, j'ai fait une form avec isMdiContainer = true... j'ai mis un bouton pour faire mes tests...

    L'idée est de récupérer les messages de l'application via le AddFilterMEssage() puis ensuite de comparer le Handle du destinataire au Handle de fenetre de la partie "grise" de ta MDI...

    Dans l'exemple que je viens de faire, je recupère cette valeur à l'arrache en cherchant le handle de la fenetre qui se trouve à un endroit donné...

    JE te laisse customiser le truc pour résoudre ton problème. Mais avec ce code, à priori, tu as "tout"

    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
     
    public partial class Form1 : Form
        {
            const int WM_MOUSEDOWN = 0x201;
     
            public Form1()
            {
                InitializeComponent();
            }
     
            [DllImport("user32.dll")]
            static extern IntPtr WindowFromPoint(POINT Point);
     
            [DllImport("user32.dll")]
            static extern bool GetCursorPos(out Point lpPoint);
     
            [DllImport("user32.dll")]
            static extern bool SetWindowText(IntPtr hWnd, string lpString);
     
            Toto t;
     
            private void Form1_Load(object sender, EventArgs e)
            {
                t = new Toto();
     
                Trace.WriteLine("Handle = " + this.Handle.ToString());
                Application.AddMessageFilter(t);
     
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                IntPtr hWnd = WindowFromPoint(new POINT(400,400));
                t.SetWindowRef(hWnd);
            }
        }
     
        [StructLayout(LayoutKind.Sequential)]
        public struct POINT
        {
            public int X;
            public int Y;
     
            public POINT(int x, int y)
            {
                this.X = x;
                this.Y = y;
            }
     
            public static implicit operator System.Drawing.Point(POINT p)
            {
                return new System.Drawing.Point(p.X, p.Y);
            }
     
            public static implicit operator POINT(System.Drawing.Point p)
            {
                return new POINT(p.X, p.Y);
            }
        }
     
        public class Toto : IMessageFilter
        {
            #region IMessageFilter Membres
            const int WM_MOUSEDOWN = 0x201;
            private IntPtr fenetre = IntPtr.Zero;
     
            public void SetWindowRef(IntPtr fenetre)
            {
                this.fenetre = fenetre;
            }
     
            public bool PreFilterMessage(ref Message m)
            {
                Trace.WriteLine(m.HWnd.ToString() + "  -  " + m.Msg.ToString());
                if (m.Msg == WM_MOUSEDOWN)
                {
                    if (m.HWnd == fenetre)
                    {
                        MessageBox.Show("Mouse Down");
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                return false;
            }
     
            #endregion
        }

  6. #6
    Modérateur
    Avatar de toopac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 940
    Par défaut
    Merci pour tes réponses, je n'arrive pas non plus à récupérer les événements souris d'un panel. Et le panel s'affiche devant les fenêtres filles, meme si je le mets en arrière plan et transparent...

    je me suis tourné vers un tabcontrol, avec un seul TabPage, dans lequel j'arrive à récupérer les événements que je veux.
    Mais je n'arrive pas à "cacher" le petit rectangle qui dépasse (ou le boutton, si Apparence=Bouttons).
    Au pire j'aurai aimé l'afficher comme un bouton à droite, mais c'est apparemment impossible. Ou encore que cet onglet fasse toute la largeur de mon tabcontrol, mais je n'arrive pas à faire ça avec la propriété SizeMode...

    Vous avez des idées?

  7. #7
    Modérateur
    Avatar de toopac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 940
    Par défaut
    ha j'avais pas vu ton dernier post. J'étudie ça. Merci bien

  8. #8
    Modérateur
    Avatar de toopac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 940
    Par défaut
    j'avoue que j'ai un peu de mal à comprendre ton code (je suis tout nouveau en c#)
    J'aimerais bien quelques explications si tu as le temps. Merci.

    Quant à cacher les onglets, j'ai trouvé quelque chose, mais je n'ai pas encore pu le tester

  9. #9
    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
    Par défaut
    Mon code est simple :

    Tu ajoutes une classe qui implémente IMEssageFilter. Cette interface définit les méthodes qu'une classe doit implémenter. Ma classe Toto implémente donc cette interface.

    Ensuite, je passe une instance de cette classe à Application.AddMEssageFilter().
    L'application reçoit des messages issus de l'OS. Ensuite, elle les transmets à tous les objets abonnés. Donc, mon instance de Toto va recevoir les messages transmis et ensuite, dans la fonction de traitement du message, je regarde à qui est adressé le message. Sous Windows, les messages sont toujours adressé à une objet qui possède un Handle (je te laisse te renseigner pour comprendre tout celà, je ne suis pas enseignant )... Ensuite, l'idée est simple. Puisqu'une fenetre MDI ne peut recevoir les event, je me suis dit que, cette fenetre étant composé d'autre fenetre (la fenetre contenant le gris), celle ci possèdait un Handle de fenetre. LA fonction WindowFromPoint() va donc me permettre de récupérer ce handle. Ensuite, je n'ai qu'à comparer le destinataire du message à ce handle pour savoir si le message est destiné à la partie "grise". Si c'est le cas, j'affiche ma messagebox...

    Je ne peux pas faire beaucoup plus que cela comme explication.

  10. #10
    Modérateur
    Avatar de toopac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 940
    Par défaut
    Merci pour tes explications, mais en attendant j'ai fais différemment. Le panel se cache quand la souris sort...
    En réalité j'ai trouvé pourquoi je n'arrivais pas à récupérer les événements souris de mon panel, c'est parce que par dessus, j'ai un tableLayoputPanel avec la propriété Dock à fill.
    C'était donc les événements du tableLayoutPanel, pas du panel qu'il fallait récupérer...

    Mais je te remercie encore pour ton aide, et je garde ton code de côté pour plus tard, mais là il faut que j'avance un petit peu quand même!!

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

Discussions similaires

  1. Titre d'un formulaire MDI Parent
    Par hdd dans le forum Windows Forms
    Réponses: 7
    Dernier message: 11/09/2007, 11h02
  2. Réponses: 4
    Dernier message: 28/06/2007, 18h51
  3. Réponses: 9
    Dernier message: 05/05/2007, 18h51
  4. [VB 2005 express] Formulaire MDI
    Par NicoNGRI dans le forum Windows Forms
    Réponses: 2
    Dernier message: 21/06/2006, 14h31
  5. Creation de formulaires MDI
    Par jerzy59 dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 18/04/2006, 14h12

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