ID Number: Q79884
1.00
WINDOWS
Summary:
Visual Basic does not support the actual movement of controls between
forms. Attempting to change the parent/child relationship of a
control from one form to another can result in unpredictable behavior.
However, by creating a control array of the same control type on each
form, and by creating a subroutine or function in a Visual Basic
module, you can simulate the movement of a control from one form to
another. An example of how to do this is further below.
This information applies to Microsoft Visual Basic programming system
version 1.0 for Windows.
More Information:
This example uses the Windows API functions GetFocus and GetParent to
determine the origin of the control dropped onto a form. For more
information on GetFocus and GetParent, query separately on the
following words:
GetFocus
GetParent
The following steps demonstrate how to simulate the movement of
controls between two forms. Note that you can improve this example by
Loading and Unloading the controls as they are needed.
1. Start Visual Basic, or from the File menu, choose New Project
(ALT, F, N) if Visual Basic is already running. Form1 will be
created by default.
2. From the File menu, choose New Form (ALT, F, F). Form2 will be
created.
3. From the File menu, choose New Module (ALT, F, M). Module1 will be
created.
4. Create the following controls for both Form1 and Form2:
Control CtlName Property Setting
------- ---------- ---------------------------
Command button Command1() Index = 0
Command button Command2 Caption = "Enable Drag"
5. Add the following code to the global module:
'Windows API function declarations
Declare Function GetFocus Lib "USER" () As Integer
Declare Function GetParent Lib "USER" (ByVal hWnd As Integer) As Integer
6. Add the following code to the General Declarations section of
Form1:
Dim EnableDrag As Integer
7. Add the following code to the Form_Load event procedure of Form1:
Sub Form_Load ()
'Move the form to the left half of the screen
Move 0, Top, Screen.Width \ 2
Form2.Show
EnableDrag = 0
Command1(0).Top = 0
Command1(0).Left = 100
For i% = 1 To 4 ' Load Control Array
Load Command1(i%)
Command1(i%).Left = Command1(i% - 1).Left
Command1(i%).Top = Command1(i% - 1).Top + Command1(i% - 1).Height
Next i%
For i% = 0 To 4 ' Define Control Properties
Command1(i%).Caption = "Button" + Str$(i%)
Command1(i%).Visible = -1
Next i%
End Sub
8. Add the following code to the Command1_Click event procedure of
Form1:
Sub Command1_Click (Index As Integer)
Button_Clicked Command1(Index) ' Call Routine in Module1.bas
End Sub
9. Add the following code to the Command2_Click event procedure of
Form1:
Sub Command2_Click ()
If EnableDrag = 0 Then ' Toggle DragMode
EnableDrag = 1
Command2.Caption = "Disable Drag"
Else
EnableDrag = 0
Command2.Caption = "Enable Drag"
End If
For i% = 0 To 4 ' Set DragMode for Controls
Command1(i%).DragMode = EnableDrag
Next i%
End Sub
10. Add the following code to the Form_DragDrop event procedure of
Form1:
Sub Form_DragDrop (Source As Control, X As Single, Y As Single)
Source.SetFocus ' Get Parent of Source Control
CtrlHnd% = GetFocus()
Parent% = GetParent(CtrlHnd%)
If Parent% <> Form1.hWnd Then ' If Parent is other Form
Index% = Source.Index
Command1(Index%).Caption = Source.Caption
Command1(Index%).Left = Source.Left
Command1(Index%).Top = Source.Top
Command1(Index%).Width = Source.Width
Command1(Index%).Height = Source.Height
Command1(Index%).Visible = -1
Source.Visible = 0
End If
End Sub
11. Add the following code to the General Declarations section of
Form2:
Dim EnableDrag As Integer
12. Add the following code to the Form_Load event procedure of Form2:
Sub Form_Load ()
'Move the form to the right half of the screen
Move Screen.Width \ 2, Top, Screen.Width \ 2
EnableDrag = 0
Command1(0).Visible = 0
For i% = 1 To 4 ' Load Control Array
Load Command1(i%)
Command1(i%).Top = Command1(i% - 1).Top + Command1(i% - 1).Height
Command1(i%).Visible = 0
Next i%
End Sub
13. Add the following code to the Command1_Click event procedure of
Form2:
Sub Command1_Click (Index As Integer)
Button_Clicked Command1(Index)
End Sub
14. Add the following code to the Command2_Click event procedure of
Form2:
Sub Command2_Click ()
If EnableDrag = 0 Then
EnableDrag = 1
Command2.Caption = "Disable Drag"
Else
EnableDrag = 0
Command2.Caption = "Enable Drag"
End If
For i% = 0 To 4
Command1(i%).DragMode = EnableDrag
Next i%
End Sub
15. Add the following code to the Form_DragDrop event procedure of
Form2:
Sub Form_DragDrop (Source As Control, X As Single, Y As Single)
Source.SetFocus ' Determine Parent of Source
CtrlHnd% = GetFocus()
Parent% = GetParent(CtrlHnd%)
If Parent% <> Form2.hWnd Then
Index% = Source.Index
Command1(Index%).Caption = Source.Caption
Command1(Index%).Left = Source.Left
Command1(Index%).Top = Source.Top
Command1(Index%).Width = Source.Width
Command1(Index%).Height = Source.Height
Command1(Index%).Visible = -1
Source.Visible = 0
End If
End Sub
16. Add the following code to Module1:
Sub Button_Clicked (Source As Control) ' Generic Click routine
MsgBox "Button" + Str$(Source.Index) + " Clicked!!!"
End Sub
17. From the Run menu, choose Start (ALT, R, S) to run the program.
To drag controls from one form to the other, choose the Enable Drag
button. Once this button has been activated on a form, you can drag
any of the command buttons from one form to the other. The drag mode
can be disabled by choosing the Disable Drag button. When drag mode
has been disabled, clicking on any of the command buttons on the form
will cause a message box to be displayed.
Reference(s):
"Programming Windows: the Microsoft Guide to Writing Applications for
Windows 3," Charles Petzold, Microsoft Press, 1990
"Microsoft Windows Software Development Kit Reference Volume 1,"
version 3.0.
WINSDK.HLP file shipped with Microsoft Windows 3.0 Software
Development Kit
Additional reference words: 1.00