Déplacer un formulaire à partir d'un contrôle ??? [Résolu]

Signaler
Messages postés
165
Date d'inscription
jeudi 3 novembre 2005
Statut
Membre
Dernière intervention
1 février 2013
-
Messages postés
165
Date d'inscription
jeudi 3 novembre 2005
Statut
Membre
Dernière intervention
1 février 2013
-
Bonjour,

Quelqu'un pourrait il me dire comment faire pour déplacer un formulaire à partir d'un contrôle ?

En faite j'ai un panel et je voudrais déplacer mon fomulaire à partir de celui ci, sur l'évènement MouseDown.

Merci à tous

9 réponses

Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
34
Tu as écrit un peu vite Seb , les valeurs de retour c'est à m.Result qu'il faut les attribuées. Pas sûr non plus que que la fenêtre recoit WM_NCHITTEST quand on passe au dessus du contrôle faudrait overrider la fonction WndProc du Panel pour ça.


EmacLi, tu as un exemple sur Codyx :



http://www.codyx.org/snippet_deplacer-forme-sans-barre-titre_23.aspx


Autre exemple pour déplacer ta forme avec le Panel :


public partial class Form1 : Form
{
    private Panel panel = null;
    private Point position = Point.Empty;


    public Form1( )
    {
        InitializeComponent( );


        panel = new Panel( );
        panel.BackColor = Color.Azure;
        panel.MouseDown += delegate( object sd, MouseEventArgs e )
        {
            if ( e.Button == MouseButtons.Left )
                position = e.Location;
        };
        panel.MouseMove += delegate( object sd, MouseEventArgs e )
        {
            if ( e.Button == MouseButtons.Left )
            {
                int x = this.Left + ( e.X - position.X );
                int y = this.Top + ( e.Y - position.Y );
                this.Bounds = new Rectangle( x, y, this.Width, this.Height );
            }
        };


        this.Controls.Add( panel );
    }
}
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
34
C'est une méthode anomyme..

.NET 1.1

this.Click += new EventHandler( Form1_Click );




void Form1_Click( object sender, EventArgs e )
{
   MessageBox.Show( "Hello" );
}





.NET 2.0

this.Click += Form1_Click;



void Form1_Click( object sender, EventArgs e )
{
 
}

ou

this.Click += delegate( object sd, EventArgs e )
{
    MessageBox.Show( "Hello" );
};




et ( sans paramètre )



this.Click += delegate { MessageBox.Show( "Hello" ); };
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
33
genre un formulaire sans barre de titre :)

il faut utiliser le message WM_NCHITTEST...

ex:

private override WndProc(ref Message m) {
    if (m.Msg == 0x0084) {   // WM_NCHITTEST
       if (this.myPanel.Bounds.Contains(MousePosition)) {
          return 0x2; // HTCAPTION
        } else {
          return 0x1; // HTCLIENT
        }
    }
}

Pour plus d'infos : http://msdn.microsoft.com/library/.../wm_nchittest.asp

Sébastien FERRAND (
blog)
Consultant Indépendant
[Microsoft MVP Visual C#]
Messages postés
165
Date d'inscription
jeudi 3 novembre 2005
Statut
Membre
Dernière intervention
1 février 2013
1
Merci pour la piste mais c'est pas encore tout à fait ca.

Que siginfie au juste WM_NCHITTEST ?

Parceque ton code ne rentre jamais dans le premier if().

Merci.
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
33
il faut mettre ca dans le formulaire...

WM_NCHITTEST :
    -> WM : Windows Message
    -> NC : Non Client
    -> HITTEST : teste de "hit"

en gros, c'est le message qui demande à la fenetre si le curseur se trouve dans une zone cliente ou non de la fenêtre...

j'ai d'ailleur fait une bourde dans mon code...

private override WndProc(ref Message m) {
    if (m.Msg == 0x0084) {   // WM_NCHITTEST
       if (this.myPanel.Bounds.Contains(MousePosition)) {
          return 0x2; // HTCAPTION
        } else {
          return 0x1; // HTCLIENT
        }
    } else {
       base.WndProc(ref m);
    }
}

Sébastien FERRAND (
blog)
Consultant Indépendant
[Microsoft MVP Visual C#]
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
33
hum... ooops...

Sébastien FERRAND (
blog)
Consultant Indépendant
[Microsoft MVP Visual C#]
Messages postés
165
Date d'inscription
jeudi 3 novembre 2005
Statut
Membre
Dernière intervention
1 février 2013
1
Merci Lutinore, je viens d'opter pour ta solution.

En effet, la méthode WndProc appartient au formulaire et non au contrôle, elle n'est donc pas appelée lors du clic sur le panel.

Merci à tous pour votre aide !
Messages postés
165
Date d'inscription
jeudi 3 novembre 2005
Statut
Membre
Dernière intervention
1 février 2013
1
Dit Lutinore,


Peut tu m'expliquer ce que tu fait avec tes déléguées ?


Tu rajoute un délégué à l'évenement MouseMouve ? Ce n'est pas plutôt l'évenement qui doit être ajouté au délégué ?


Merci d'avance.
Messages postés
165
Date d'inscription
jeudi 3 novembre 2005
Statut
Membre
Dernière intervention
1 février 2013
1
Merci pour cette précision