Meilleur auteur de réponses
Comment déplacer une form sans bandeau à la souris ?

Question
-
Bonjour,
Comment je vous prie, déplacer une form sans bandeau à la souris ?
J'ai aussi un autre problème, j'ai beau lui dire (à la form) de démarrer au centre, elle se calle en top,left 0 ?
Voici le code en totalité, juste à déposer dans voyre éditeur.
En vous remerciant, cordialement.
Joseph Attila PUSZTAY
EhJoe Logiciels Romans Ecrire
- Modifié EhJoe samedi 21 août 2010 07:24 1 . lien code
Réponses
-
Bonjour Joseph,
Voici mon code pour rendre mobile un formulaire sans bords ;
Public Class DeplacementDeForm Public Shared Sub RendreMobile(ByVal frm As Form) Dim c As New DeplacementDeForm(frm, frm) End Sub Public Shared Sub RendreMobile(ByVal frm As Form, ByVal control As Control) Dim c As New DeplacementDeForm(frm, control) End Sub #Region "Variables privée" Private m_ClickPoint As Point Private m_Control As Control Private m_Frm As Form #End Region #Region "Création" Public Sub New(ByVal frm As Form, ByVal control As Control) m_Frm = frm m_Control = control AddHandler m_Control.MouseDown, AddressOf _MouseDown AddHandler m_Control.MouseMove, AddressOf _MouseMove End Sub #End Region #Region "Methodes" Private Sub _MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) m_ClickPoint = New Point(e.X, e.Y) End Sub Private Sub _MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) If (e.Button = MouseButtons.Left) Then Dim p As Point = m_Frm.Location m_Frm.Location = New Point( _ p.X - m_ClickPoint.X + e.X, _ p.Y - m_ClickPoint.Y + e.Y) End If End Sub #End Region End Class
Et pour l'utiliser :
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load DeplacementDeForm.RendreMobile(Me) End Sub ' ou Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load DeplacementDeForm.RendreMobile(Me, ControlServantALamanipulation) End Sub
Jérémy Jeanson MCP, MCTS http://blogs.codes-sources.com/JeremyJeanson/ (French or English spoken)- Proposé comme réponse JeremyJeansonMVP samedi 21 août 2010 10:01
- Marqué comme réponse EhJoe samedi 21 août 2010 18:28
-
Re,
Pour répondre à tes questions :
1) Oui on peut mettre des classes dans des classes.. C’est une histoire de goût et d’architecture plus ou moins complexe (on aime ou pas)
2) Tu n’as pas compris quel code ?
3) #region ne sert qu’à faire de la mise en forme de code (c’est pratique pour réduire une portion de code, comme les méthodes le font de base)
4) Private c’est un accesseur (on n’en utilisait peu dans Vb6, mais on pouvait déjà) l’idée est de réduire l’accès à une variable à son minimum. Si une varaible doit être visible dans sa classe mais pas en dehors on utilise private (Dim ne sert normalement que dans les méthodes)
Jérémy Jeanson MCP, MCTS http://blogs.codes-sources.com/JeremyJeanson/ (French or English spoken)- Proposé comme réponse JeremyJeansonMVP lundi 23 août 2010 07:53
- Marqué comme réponse EhJoe lundi 23 août 2010 09:18
-
Salut Jérémy,
Jérémy t'es un génie !
Voici le code in fine, tout marche, y compris le "centerScreen" que j'ai forcé d'une autre façon, à ton code quelques questions, mais déjà voici le code in extenso :
' form 4 ' flash Option Explicit On ' Public Class Form4 '---Début API SetWindowPos Private Declare Function SetWindowPos Lib "User32" _ (ByVal hWnd As Int32, _ ByVal hWndInsertAfter As Int32, _ ByVal X As Long, ByVal Y As Int32, _ ByVal cx As Long, ByVal cy As Int32, _ ByVal wFlags As Long) As Int32 Private Const HWND_TOPMOST = -1 Private Const SWP_NOSIZE = &H1 Private Const SWP_NOMOVE = &H2 Private Const SWP_SHOWWINDOW = &H40 Const Flags = &H2 Or &H1 Or &H40 Or &H10 '---fin API SetWindowsPos ' Dim passe As Long Dim r As Long Sub Form4_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load passe = 1 Timer1.Interval = 30 Timer1.Enabled = True r = SetWindowPos(Me.Handle, -1, 0, 0, 0, 0, Flags) ' toujours visible Me.Left = (My.Computer.Screen.Bounds.Width / 2) - (Me.Width / 2) Me.Top = (My.Computer.Screen.Bounds.Height / 2) - (Me.Height / 2) DeplacementDeForm.RendreMobile(Me) ' appel de la classe End Sub Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Select Case passe Mod 2 Case 0, 2, 4, 6, 8, 10, 12, 14, 15, 18, 20, 22, 24 : Me.BackColor = Color.Black Case 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50 : Me.BackColor = Color.Black Case 1, 3, 5, 7, 9 : Me.BackColor = Color.Red Case 11, 13, 15, 17, 19 : Me.BackColor = Color.Green Case 21, 23, 25, 27, 29 : Me.BackColor = Color.Blue Case 31, 33, 35, 37, 39 : Me.BackColor = Color.Yellow Case 41, 43, 45, 47, 49 : Me.BackColor = Color.White End Select passe = passe + 1 If passe > 50 Then passe = 0 End Sub Sub Form4_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.DoubleClick Me.Close() End Sub Sub Form4_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing r = SetWindowPos(Me.Handle, -2, 0, 0, 0, 0, Flags) ' n'est plus toujours visible Form1.laform(2) = False Form1.laform(3) = False Form1.laform(4) = False End Sub End Class ' form4 Public Class DeplacementDeForm Public Shared Sub RendreMobile(ByVal frm As Form) Dim c As New DeplacementDeForm(frm, frm) End Sub Public Shared Sub RendreMobile(ByVal frm As Form, ByVal control As Control) Dim c As New DeplacementDeForm(frm, control) End Sub #Region "Variables privée" Private m_ClickPoint As Point Private m_Control As Control Private m_Frm As Form #End Region #Region "Création" Public Sub New(ByVal frm As Form, ByVal control As Control) m_Frm = frm m_Control = control AddHandler m_Control.MouseDown, AddressOf _MouseDown AddHandler m_Control.MouseMove, AddressOf _MouseMove End Sub #End Region #Region "Methodes" Sub _MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) m_ClickPoint = New Point(e.X, e.Y) End Sub Sub _MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) If (e.Button = MouseButtons.Left) Then Dim p As Point = m_Frm.Location m_Frm.Location = New Point(p.X - m_ClickPoint.X + e.X, p.Y - m_ClickPoint.Y + e.Y) End If End Sub #End Region End Class ' DeplacementDeForm
Les questions maintenant, bon, déjà je n'ai pas les connaissances nécessaires pour tout comprendre, d'autant que ça va me servir deux fois dans ma vie, nonobstant, voici quelques questions si tu veuxbien y répondre :
-1- La classe, je ne savais pas que l'on pouvait mettre plusieurs classes dans une fomr, voire une application, quelle utilité ça a, à part de servir de super-procédure, n'aurait-on pas pu tout faire dans la même classe ?
-2- Le reste je suis vaguement mais j'ai un mal fou, car je ne sais pas à quoi sert une partie du code, ni comment il s'utilise, pas grave, passons du moment que ça marche, hein...
-3- Je suis aussi intrigué par ce code que je ne connaissais pas :
#Region "Variables privée" Private m_ClickPoint As Point ' ... #End Region
#Region "explication", est-ce une simple façon de présenter ou est-ce quelque chose qui a une fonction spécifique ?
-4- De même pour "Private x as y", est-ce une variable, est-ce que "private" remplace "Dim" ?
Voilà, c'est à peu près tout, je conserve précieusement dans mon pense-bête (la bête c'est moi), ce code que je pourrais resservir en cas de besoin pour bouger une form sans bandeau.
Merci encore mille fois, moi ... quelqu'un qui pond ce genre de code ça m'impressionne !
Très cordialement.
Joseph Attila PUSZTAY
EhJoe Logiciels Romans Ecrire- Marqué comme réponse EhJoe samedi 21 août 2010 18:28
Toutes les réponses
-
Bonjour Joseph,
Voici mon code pour rendre mobile un formulaire sans bords ;
Public Class DeplacementDeForm Public Shared Sub RendreMobile(ByVal frm As Form) Dim c As New DeplacementDeForm(frm, frm) End Sub Public Shared Sub RendreMobile(ByVal frm As Form, ByVal control As Control) Dim c As New DeplacementDeForm(frm, control) End Sub #Region "Variables privée" Private m_ClickPoint As Point Private m_Control As Control Private m_Frm As Form #End Region #Region "Création" Public Sub New(ByVal frm As Form, ByVal control As Control) m_Frm = frm m_Control = control AddHandler m_Control.MouseDown, AddressOf _MouseDown AddHandler m_Control.MouseMove, AddressOf _MouseMove End Sub #End Region #Region "Methodes" Private Sub _MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) m_ClickPoint = New Point(e.X, e.Y) End Sub Private Sub _MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) If (e.Button = MouseButtons.Left) Then Dim p As Point = m_Frm.Location m_Frm.Location = New Point( _ p.X - m_ClickPoint.X + e.X, _ p.Y - m_ClickPoint.Y + e.Y) End If End Sub #End Region End Class
Et pour l'utiliser :
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load DeplacementDeForm.RendreMobile(Me) End Sub ' ou Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load DeplacementDeForm.RendreMobile(Me, ControlServantALamanipulation) End Sub
Jérémy Jeanson MCP, MCTS http://blogs.codes-sources.com/JeremyJeanson/ (French or English spoken)- Proposé comme réponse JeremyJeansonMVP samedi 21 août 2010 10:01
- Marqué comme réponse EhJoe samedi 21 août 2010 18:28
-
Salut Jérémy,
Jérémy t'es un génie !
Voici le code in fine, tout marche, y compris le "centerScreen" que j'ai forcé d'une autre façon, à ton code quelques questions, mais déjà voici le code in extenso :
' form 4 ' flash Option Explicit On ' Public Class Form4 '---Début API SetWindowPos Private Declare Function SetWindowPos Lib "User32" _ (ByVal hWnd As Int32, _ ByVal hWndInsertAfter As Int32, _ ByVal X As Long, ByVal Y As Int32, _ ByVal cx As Long, ByVal cy As Int32, _ ByVal wFlags As Long) As Int32 Private Const HWND_TOPMOST = -1 Private Const SWP_NOSIZE = &H1 Private Const SWP_NOMOVE = &H2 Private Const SWP_SHOWWINDOW = &H40 Const Flags = &H2 Or &H1 Or &H40 Or &H10 '---fin API SetWindowsPos ' Dim passe As Long Dim r As Long Sub Form4_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load passe = 1 Timer1.Interval = 30 Timer1.Enabled = True r = SetWindowPos(Me.Handle, -1, 0, 0, 0, 0, Flags) ' toujours visible Me.Left = (My.Computer.Screen.Bounds.Width / 2) - (Me.Width / 2) Me.Top = (My.Computer.Screen.Bounds.Height / 2) - (Me.Height / 2) DeplacementDeForm.RendreMobile(Me) ' appel de la classe End Sub Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Select Case passe Mod 2 Case 0, 2, 4, 6, 8, 10, 12, 14, 15, 18, 20, 22, 24 : Me.BackColor = Color.Black Case 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50 : Me.BackColor = Color.Black Case 1, 3, 5, 7, 9 : Me.BackColor = Color.Red Case 11, 13, 15, 17, 19 : Me.BackColor = Color.Green Case 21, 23, 25, 27, 29 : Me.BackColor = Color.Blue Case 31, 33, 35, 37, 39 : Me.BackColor = Color.Yellow Case 41, 43, 45, 47, 49 : Me.BackColor = Color.White End Select passe = passe + 1 If passe > 50 Then passe = 0 End Sub Sub Form4_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.DoubleClick Me.Close() End Sub Sub Form4_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing r = SetWindowPos(Me.Handle, -2, 0, 0, 0, 0, Flags) ' n'est plus toujours visible Form1.laform(2) = False Form1.laform(3) = False Form1.laform(4) = False End Sub End Class ' form4 Public Class DeplacementDeForm Public Shared Sub RendreMobile(ByVal frm As Form) Dim c As New DeplacementDeForm(frm, frm) End Sub Public Shared Sub RendreMobile(ByVal frm As Form, ByVal control As Control) Dim c As New DeplacementDeForm(frm, control) End Sub #Region "Variables privée" Private m_ClickPoint As Point Private m_Control As Control Private m_Frm As Form #End Region #Region "Création" Public Sub New(ByVal frm As Form, ByVal control As Control) m_Frm = frm m_Control = control AddHandler m_Control.MouseDown, AddressOf _MouseDown AddHandler m_Control.MouseMove, AddressOf _MouseMove End Sub #End Region #Region "Methodes" Sub _MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) m_ClickPoint = New Point(e.X, e.Y) End Sub Sub _MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) If (e.Button = MouseButtons.Left) Then Dim p As Point = m_Frm.Location m_Frm.Location = New Point(p.X - m_ClickPoint.X + e.X, p.Y - m_ClickPoint.Y + e.Y) End If End Sub #End Region End Class ' DeplacementDeForm
Les questions maintenant, bon, déjà je n'ai pas les connaissances nécessaires pour tout comprendre, d'autant que ça va me servir deux fois dans ma vie, nonobstant, voici quelques questions si tu veuxbien y répondre :
-1- La classe, je ne savais pas que l'on pouvait mettre plusieurs classes dans une fomr, voire une application, quelle utilité ça a, à part de servir de super-procédure, n'aurait-on pas pu tout faire dans la même classe ?
-2- Le reste je suis vaguement mais j'ai un mal fou, car je ne sais pas à quoi sert une partie du code, ni comment il s'utilise, pas grave, passons du moment que ça marche, hein...
-3- Je suis aussi intrigué par ce code que je ne connaissais pas :
#Region "Variables privée" Private m_ClickPoint As Point ' ... #End Region
#Region "explication", est-ce une simple façon de présenter ou est-ce quelque chose qui a une fonction spécifique ?
-4- De même pour "Private x as y", est-ce une variable, est-ce que "private" remplace "Dim" ?
Voilà, c'est à peu près tout, je conserve précieusement dans mon pense-bête (la bête c'est moi), ce code que je pourrais resservir en cas de besoin pour bouger une form sans bandeau.
Merci encore mille fois, moi ... quelqu'un qui pond ce genre de code ça m'impressionne !
Très cordialement.
Joseph Attila PUSZTAY
EhJoe Logiciels Romans Ecrire- Marqué comme réponse EhJoe samedi 21 août 2010 18:28
-
Bonjour Joseph,
Mercii, mais ce n'est pas du génie, juste un bou de code que j'ai avac moi depuis pas mal d'années ;)
Jérémy Jeanson MCP, MCTS http://blogs.codes-sources.com/JeremyJeanson/ (French or English spoken) -
Re,
Pour répondre à tes questions :
1) Oui on peut mettre des classes dans des classes.. C’est une histoire de goût et d’architecture plus ou moins complexe (on aime ou pas)
2) Tu n’as pas compris quel code ?
3) #region ne sert qu’à faire de la mise en forme de code (c’est pratique pour réduire une portion de code, comme les méthodes le font de base)
4) Private c’est un accesseur (on n’en utilisait peu dans Vb6, mais on pouvait déjà) l’idée est de réduire l’accès à une variable à son minimum. Si une varaible doit être visible dans sa classe mais pas en dehors on utilise private (Dim ne sert normalement que dans les méthodes)
Jérémy Jeanson MCP, MCTS http://blogs.codes-sources.com/JeremyJeanson/ (French or English spoken)- Proposé comme réponse JeremyJeansonMVP lundi 23 août 2010 07:53
- Marqué comme réponse EhJoe lundi 23 août 2010 09:18