Déplacement de feuilles sans barre de titre avec un modul

Soyez le premier à donner votre avis sur cette source.

Vue 3 740 fois - Téléchargée 338 fois

Description

Dans une des feuilles :

'Timer1_Timer()
'MoveMe
'End Sub

Source / Exemple :


Type POINTAPI
X As Long
Y As Long
End Type

Public Declare Function GetCursorPos Lib "User32.dll" (lpPoint As POINTAPI) As Long
Public Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer

Private Mv(10) As Long

Sub MoveMe()

Mv(1) = GetFormID 'teste si une feuille de l'application a le pointeur
    If Mv(1) > -1 Then 'fait si une feuille de l'application à le pointeur
    Mv(6) = Mv(1) 'met en mémoire l'ID de la feuille à déplacer
    Forms(Mv(1)).MousePointer = 15 'change le pointeur pour le CrossHair
    Else 'fait si aucune feuille de l'application n'a le pointeur
        If Mv(6) > -1 Then 'une feuille a été déplacée
        Forms(Mv(6)).MousePointer = 0 'on réinitialise la valeur mousepointer a zero
        Mv(6) = -1 'on vide la variable teste qui sert pour l'inialisation pointeur
        End If
    End If

Dim z As POINTAPI
Call GetCursorPos(z) 'position curseur en coordonnées écran
Mv(4) = GetKeyState(1) 'statut bouton gauche de la souris

If Mv(4) > -1 Then 'si pas de bouton souris réinitialise les variables
Mv(0) = 0
Mv(1) = -1
Mv(2) = 0
Mv(3) = 0
End If

If Mv(4) < 0 And Mv(0) = 0 Then 'bouton gauche activé
Mv(0) = 1 'verouille la saisie des valeurs suivantes(instantané)
Mv(1) = GetFormID
If Mv(1) = -1 Then Exit Sub 'sort si aucune feuille application n'a le poiteur
Mv(2) = (Forms(Mv(1)).Left / 15) - z.X 'enregistre les positions relatives feuille / pointeur
Mv(3) = (Forms(Mv(1)).Top / 15) - z.Y '""
End If

If Mv(4) < 0 And Mv(0) = 1 And Mv(1) > -1 Then 'phase de déplacement
Forms(Mv(1)).Move (z.X + Mv(2)) * 15, (z.Y + Mv(3)) * 15 '
End If

End Sub

Function GetFormID() As Long
Dim z As POINTAPI
Call GetCursorPos(z)
u2 = WindowFromPoint(z.X, z.Y) 'u2 est le hWnd de la feuille qui a le pointeur

GetFormID = -1
For n = 0 To Forms.Count - 1
u = Forms(n).hWnd
'on compare le hWnd des feuilles de la collection avec u2 pour trouver l'ID de la feuille pointée (n)
If u = u2 Then
If Forms(n).Visible = False Then GoTo zap
GetFormID = n 'GetFormID renvoie l'ID de la feuille pointée
Exit Function
End If

zap:
Next n
End Function

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Dev_tomandtom
Messages postés
8
Date d'inscription
mercredi 6 décembre 2006
Statut
Membre
Dernière intervention
3 janvier 2007

pour mon code, vs 2005 pro me donne un avertissement,

il faut ecrire If e.Button 1048576 Then au lieu de If e.Button MouseButtons.Left Then

mais je ne sais pas pourquoi ... si ca peut t'aider :)
cs_ying
Messages postés
8
Date d'inscription
samedi 1 mars 2003
Statut
Membre
Dernière intervention
21 octobre 2014

Sans taper de code dans l'événement mouse_move de chaque feuille ?
D'autre part le pointeur indique que la feuille est movable

Dev_tomandtom J'ais voulu tester ton code, mais il manque quelque chose.

Il peut y avoir d'autres intérêts à centraliser le handle et les événements des feuilles ou objets d'une appli

Le "Cette source n'a donc aucun intérêt, dommage" me semble inconstructif

Merci de vos réactions
Dev_tomandtom
Messages postés
8
Date d'inscription
mercredi 6 décembre 2006
Statut
Membre
Dernière intervention
3 janvier 2007

Private Sub lblDragMe_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles lblDragMe.MouseDown
If e.Button = MouseButtons.Left Then
lblDragMe.Capture = False

' Create and send a WM_NCLBUTTONDOWN message.
Const WM_NCLBUTTONDOWN As Integer = &HA1S
Const HTCAPTION As Integer = 2
Dim msg As Message = _
Message.Create(Me.Handle, WM_NCLBUTTONDOWN, _
New IntPtr(HTCAPTION), IntPtr.Zero)
Me.DefWndProc(msg)
End If
End Sub
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
Ce n'est pas une question d'élégance, le message HTCAPTION est l'unique méthode fiable.

Cette source n'a donc aucun intérêt, dommage.
Charles Racaud
Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
28
Salut,

Fait un tour par ici : http://www.codyx.org/snippet_deplacer-forme-sans-barre-titre_23.aspx#68
C'est une méthode bien plus élégante de le faire.
__
Kenji

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.