У Form2 есть родитель - Form1. Требуется переместить программно, т.е. например нажатием на кнопку Form2 из одной точки на Form1 в другую, т.е. изменить Form2.Top и Form2.Left на новые конкретные, известные заранее значения. Напр из точки Left = 0,Top = 1000 в точку Left = 0,Top = 3000. Если кто сможет - сообщите плз.
' код Form1
Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
Private Sub Form_Initialize()
Dim ret
Form1.Show
Form2.Show
Form2.Left = 0
Form2.Top = 1000
Form2.Height = 500
Form2.Width = 2000
ret = SetParent(Form2.hwnd, Me.hwnd)
End Sub
Private Sub Command1_Click()
Form2.Left = Form2.Left + 3000
End Sub
Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
Private Type POINTAPI
x As Long
y As Long
End Type
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Type WINDOWPLACEMENT
Length As Long
flags As Long
showCmd As Long
ptMinPosition As POINTAPI
ptMaxPosition As POINTAPI
rcNormalPosition As RECT
End Type
Private Declare Function SetWindowPlacement Lib "user32" (ByVal hwnd As Long, lpwndpl As WINDOWPLACEMENT) As Long
Private Sub Form_Initialize()
Dim ret As Long
Form1.Show
ret = SetParent(Form2.hwnd, Me.hwnd)
Form2.Show
MoveWindow Form2.hwnd, 0, 0, 100, 100
End Sub
Private Sub Command1_Click()
MoveWindow Form2.hwnd, 100, 100, 100, 100
End Sub
Private Sub Form_Unload(Cancel As Integer)
Unload Form2
End
End Sub
Private Sub MoveWindow(hwnd As Long, Top As Long, Left As Long, Width As Long, Height As Long)
Dim ret As Long
Dim wp As WINDOWPLACEMENT
Dim p As POINTAPI
Dim r As RECT
wp.Length = Len(wp)
wp.showCmd = 1
p.x = 0: p.y = 0
wp.ptMaxPosition = p
wp.ptMinPosition = p
r.Bottom = Top + Height
r.Left = Left
r.Right = Left + Width
r.Top = Top
wp.rcNormalPosition = r
ret = SetWindowPlacement(hwnd, wp)
End Sub
Серёга, большое спасибо! Все работает! Лед тронулся!
HACKER, я не понял о чем ты: ScaleMode = vbPixel. Единицы измерения пространства вроде бы не существенны в данном случае.
Djon, ты прав, я ошибся, надо было так: из точки
Left = 0,Top = 1000 в точку Left = 3000,Top = 1000 со степом в 10. Серегин вариант решает эту проблему.
Все таки неясно как двигать мышью вдоль X дочерний форм внутри родительского.
'Form2 - дочерний
Dim X1 as Single
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then X1 = X
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then
Call Form1.MoveWindow(Form2.hwnd, 100, X - X1, 100, 100)
End If
End Sub
Не понимаю почему это не работает. Может быть есть у кого какие-нибудь мысли?
Все таки неясно как двигать мышью вдоль X дочерний форм внутри родительского.
'Form2 - дочерний
Dim X1 as Single
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then X1 = X
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then
Call Form1.MoveWindow(Form2.hwnd, 100, X - X1, 100, 100)
End If
End Sub
Не понимаю почему это не работает. Может быть есть у кого какие-нибудь мысли?
HACKER, я не понял о чем ты: ScaleMode = vbPixel. Единицы измерения пространства вроде бы не существенны в данном случае.
Я сам мало что понял, но т.к. код приведённой тобой в самом начале действительно рабочий, при этом ты говориш что форма не двигается, я думал что трабл именно в единицах измерения...
HACKER, привет! Обрати внимание на мой предыдущий пост. Не удается мышью двигать дочерний форм. Я уже подумываю отказаться от этой идеи и сделать полупрозрачной пикче или лабел, т.е. объекты с которыми не возникает проблем с передвиженим их мышкой. Но пикче полупрозрачной сделать пока не удалось, а у лабела есть свойство BackStyle = 0 Transparent, т.е. 100% прозрачность, т.е. без цвета, т.е. дела мои дрянь, т.е. слишком много пустой возьни. Еще осталось попытаться пришить к прозрачности лэйбела цвет полупрозрачный