|
-
May 2nd, 2000, 09:23 AM
#1
Thread Starter
Junior Member
Hello!
how can I made a form tag along with the main form when the user choose to move the main form by dragging the mouse??
Regards!!
-
May 2nd, 2000, 09:34 AM
#2
Hyperactive Member
How 'bout Form2.Left = Form1.Left and Form2.Top = Form1.Top (or an equivalent function thereof)?
bob
-
May 2nd, 2000, 09:44 AM
#3
Thread Starter
Junior Member
Question on Forms
hi Bob!
think that 2 lines only specifies the location of the form upon loading!
what I intend to do is to load up the 2nd form by the side of the first form. When I click on the first form and starts to move it, the 2 forms will move together
Regards!
-
May 2nd, 2000, 10:01 AM
#4
Fanatic Member
I always thought that there was Form_Move event. I guess I was wrong . Anyways here is how I would do it without Form_Move event: add a timer to form1, set interval to 1, then paste this code to timer's timer event:
Code:
Private Sub Timer1_Timer()
Form2.Left = Form1.Left + Form1.Width
Form2.Top = Form1.Top
End Sub
This should do the trick. You may have to change the position of second form, but it is how I would do it.
HTH
-
May 2nd, 2000, 10:34 AM
#5
Thread Starter
Junior Member
hi QWERTY!
Yar! thanks! think this is temporary OK over!
I'm juz wondering is there any other method in doing this??
-
May 2nd, 2000, 08:06 PM
#6
Lively Member
Theres almost always another way to do it, so here's my 2 cents:
(0) Make sure you have Form1 and a module
(1) Subclass Form1
(2) Trap the WM_MOVE message and move forms accordingly.
(3) Don't forget to unsubclass Form1 before it gets unloaded 
I'm going to omit most of the API declarations and constants here cuz they're easily found, so load up API Text Viewer to get the info:
F: CallWindowProc, SetWindowLong, SetProp, GetProp, RemoveProp
C: WM_MOVE, GWL_WNDPROC
Code:
' in Form1's code goes:
Public Function WndProc(ByVal oldWndProc As Long, ByVal hWnd As Long, ByVal msg As Long, ByVal wp As Long, ByVal lp As Long) As Long
If (msg = WM_MOVE) Then
Form2.Top = Me.Bottom
End If
WndProc = CallWindowProc(oldWndProc, hWnd, msg, wp, lp)
End Function
' in the module goes:
Declare Function CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (dest As Any, src As Any, ByVal cbData As Long) As Long
Public Sub SubclassForm1(ByRef frm As Form1)
SetProp frm.hWnd, "SCObjPtr", PtrFromObject(frm.hWnd)
SetProp frm.hWnd, "SCWndProc", SetWindowLong(frm.hWnd, GWL_WNDPROC, AddressOf Form1WndProc)
End Sub
Public Sub UnsubclassForm1(ByRef frm As Form1)
SetWindowLong frm.hWnd, GWL_WNDPROC, GetProp(frm.hWnd, "SCWndProc")
RemoveProp frm.hWnd, "SCWndProc"
RemoveProp frm.hWnd, "SCObjPtr"
End Sub
Private Function Form1WndProc(ByVal hWnd As Long, ByVal msg As Long, ByVal wp As Long, ByVal lp As Long) As Long
Dim frm As Form1, oldWndProc As Long
On Error Resume Next
Set frm = ObjectFromPtr(GetProp(hWnd, "SCObjPtr"))
oldWndProc = GetProp(hWnd, "SCWndProc")
Form1WndProc = frm.WndProc(oldWndProc, hWnd, msg, wp, lp)
End Function
Public Function ObjectFromPtr(ByVal lPtr As Long) As Object
Dim oThis As Object
CopyMemory oThis, lPtr, 4 ' turn the pointer into an illegal, uncounted reference!
Set ObjectFromPtr = oThis ' now, using the same method as before, turn the pointer back into a NULL pointer
CopyMemory oThis, 0&, 4 ' now we're safe
End Function
Public Function PtrFromObject(ByRef oThis As Object) As Long
PtrFromObject = ObjPtr(oThis)
End Function
' VERY IMPORTANT: Do *NOT* forget the 'as long' at the end of Form1WndProc's function line
' ALSO VERY IMPORTANT: If you rename 'Form1' (changing the NAME, not the caption), you have to rename both references to Form1 in this module.
- Steve
Real programmers use COPY CON PROGRAM.EXE
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|