PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 1 nov. 2005 à 17:03
salut,
la manière la plus simple à mon goût est l'utilisation des API (ex FORM 1)
sinon, voir ex FORM 2, similaire (mais différente) à celle de Kenji
' ------
' FORM 1
' ------
'
Private Declare Function SendMessage Lib "User32" Alias "SendMessageA" _
(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
'
Private Declare Sub ReleaseCapture Lib "User32" ()
'
Const WM_NCLBUTTONDOWN = &HA1
Const HTCAPTION = 2
'
'
'
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then
Call ReleaseCapture
Call SendMessage(Me.hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
End If
End Sub
' ------
' FORM 2
' ------
'
Option Explicit
'
Dim Moving As Boolean, XOrig As Single, YOrig As Single
'
'
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then
Moving = True
XOrig = X
YOrig = Y
End If
End Sub
'
'
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Moving Then
Me.Move Me.Left - XOrig + X, Me.Top - YOrig + Y
End If
End Sub
'
'
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
Moving = False
End Sub
nitroptik
Messages postés50Date d'inscriptionsamedi 5 octobre 2002StatutMembreDernière intervention13 mai 2007 1 nov. 2005 à 17:25
j'aime bien le code de kenji mais quand je click sur ma form le curseur de la souris se positione sur le coin gauche en haut et cela créer un effet que jaime pas
cs_MasterHack
Messages postés586Date d'inscriptionjeudi 18 septembre 2003StatutMembreDernière intervention13 février 20082 1 nov. 2005 à 17:44
salut ^^
bon je trouve que le meilleur est dit, mais cependant il existe une autre methode aussi efficace. ça constste a faire un subclassing sur la form pour intercepter les messages et specifiquement celui qui nous imports WM_NCHITTEST.
allez bonne continuation.
<HR>
Life is short...Learn more
Copy Rights <> Rights to Copy
cs_MasterHack
Messages postés586Date d'inscriptionjeudi 18 septembre 2003StatutMembreDernière intervention13 février 20082 1 nov. 2005 à 18:03
voici un exemple
-Une form
A mettre ds un module .bas
Public Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Const GWL_WNDPROC = -4
Dim hand As Long, awp As Long
Private Const WM_NCHITTEST As Long = &H84
Private Const HTCAPTION As Long = 2
Private Const HTCLIENT As Long = 1
Function Proc(ByVal H As Long, ByVal msg As Long, ByVal wp As Long, ByVal lp As Long) As Long
Proc = CallWindowProc(awp, H, msg, wp, lp)
Select Case msg
'interception du message WM_NCHITTEST
Case WM_NCHITTEST
'Ici place au menssenge (lol), on vas dir a windows qu'on a cliquer sur la barre du titre .. o_O, c moche ça mdr
If Proc = HTCLIENT Then
Proc = HTCAPTION
End If
End Select
End Function
Sub SubClass()
awp = SetWindowLong(Form1.hwnd, GWL_WNDPROC, AddressOf Proc)
End Sub
Sub UnSubClass()
SetWindowLong Form1.hwnd, GWL_WNDPROC, awp
End Sub
A mettre ds la fom : Private Sub Form_Load()
SubClass
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
UnSubClass
End Sub
TChusss
<HR>
Life is short...Learn more
Copy Rights <> Rights to Copy
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 1 nov. 2005 à 18:03
re,
désolé MasterHack, mais la requête est inverse.
sans parler du fait que Nitroptik voudrait éviter les API, le Subclassing permettrait de récupérer un évènement lors du déplacement, or la question est de déplacer ;)
PCPT [AFCK]
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 1 nov. 2005 à 18:09
autant pour moi...
beaucoup de lignes, et crach fréquent si bouton STOP en IDE, pour le même résultat, mais c'est en effet une possibilité.
autre problème, sous cette forme, ne peut être appelé que sur une Form pour tout le projet.
(et sinon, mon précédent post -> je confondais WM_NCHITTEST avec WM_MOVING)
++
cs_MasterHack
Messages postés586Date d'inscriptionjeudi 18 septembre 2003StatutMembreDernière intervention13 février 20082 1 nov. 2005 à 18:22
tout a fait le contraire, on peut l'appliquer sur autant de fenetres qu'existe ds un projet. il suffit modifier le sub
sub Subclass(han
Dim hand As Long
Sub SubClass(Handle As Long)
hand = Handle
awp = SetWindowLong(Handle, GWL_WNDPROC, AddressOf Proc)
End Sub
et mettre ce code ds le load de chque form du projet ^^ , aller manger-time. bye
<HR>
Life is short...Learn more
Copy Rights <> Rights to Copy