none
Comment déplacer une form sans bandeau à la souris ? RRS feed

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
    samedi 21 août 2010 10:01
  • 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
    lundi 23 août 2010 07:53
  • 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
    samedi 21 août 2010 18:24

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
    samedi 21 août 2010 10:01
  • 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
    samedi 21 août 2010 18:24
  • 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)
    lundi 23 août 2010 07:46
  • 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
    lundi 23 août 2010 07:53