How to Move Controls Between Forms in VB

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