Bouger une form sans bordure

nitroptik Messages postés 50 Date d'inscription samedi 5 octobre 2002 Statut Membre Dernière intervention 13 mai 2007 - 1 nov. 2005 à 16:39
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 1 nov. 2005 à 19:10
quel serait le MEILLEUR moyen de bouger une form sans bordure mais qui fontionnerait sur tout les windows

je ne souhaite pas utiliser d'api (si possible)

je veux quelque chose de propre et rapide!

merci de vos reponses

12 réponses

Utilisateur anonyme
1 nov. 2005 à 16:55
Bonjour,



Un bout de code:



Dim DX As Integer, DY As Integer

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

DX = X

DY = Y

End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

If Button = 1 Then

Me.Left = Me.Left + (X - DX)

Me.Top = Me.Top + (Y - DY)

End If

End Sub


Kenji
<hr size="2" width="100%">
Merci de cliquer sur "Réponse acceptée" si une réponse vous convient.
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
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


<SMALL> Coloration syntaxique automatique [AFCK]</SMALL>


++
PCPT [AFCK]
0
nitroptik Messages postés 50 Date d'inscription samedi 5 octobre 2002 Statut Membre Dernière intervention 13 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

y a t'il un remede ?
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
1 nov. 2005 à 17:29
oui.
vérifie ton code, les lignes de Kenji n'interviennent en rien avec le curseur
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_MasterHack Messages postés 586 Date d'inscription jeudi 18 septembre 2003 Statut Membre Dernière intervention 13 février 2008 2
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
0
cs_MasterHack Messages postés 586 Date d'inscription jeudi 18 septembre 2003 Statut Membre Dernière intervention 13 février 2008 2
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
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
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]
0
cs_MasterHack Messages postés 586 Date d'inscription jeudi 18 septembre 2003 Statut Membre Dernière intervention 13 février 2008 2
1 nov. 2005 à 18:06
re, humm je crois que c vite dit, ta du looper mon dernier message.


<HR>

Life is short...Learn more
Copy Rights <> Rights to Copy
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
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)
++
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
1 nov. 2005 à 18:09
oui on c'est croisé^^
0
cs_MasterHack Messages postés 586 Date d'inscription jeudi 18 septembre 2003 Statut Membre Dernière intervention 13 février 2008 2
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
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
1 nov. 2005 à 19:10
Salut
Si tu avais un peu cherché sur le site, tu aurais trouvé celle-là

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage. (Socrate)
0
Rejoignez-nous