
GM писал(а):А сабклассить окно не пробывал
GSerg писал(а):Ему не следить, ему генерить...
dim n as integer
private sub commnad1_click()
n = 10
me.left = me.left + n
me.top = me.top - n
end sub
Всмысле, при перемещении формы сгенерировать событие...GSerg писал(а):Ему не следить, ему генерить...
Vovik писал(а):(только беза таймеров)
Private oldTop As Long
Private oldLeft As Long
Private ExitP As Boolean
Private Sub Form_Load()
Me.Show
EventRaiser
End Sub
Private Sub EventRaiser()
oldTop = Me.Top
oldLeft = Me.Left
ExitP = False
Do While Not ExitP
If oldTop <> Me.Top Or oldLeft <> Me.Left Then
MsgBox "Вы передвинули форму!"
End If
oldTop = Me.Top
oldLeft = Me.Left
DoEvents
Loop
End Sub
Private Sub Form_Unload(Cancel As Integer)
ExitP = True
End Sub
Но все равноAmed писал(а):А что, принцип-то тот же, как и с таймером
Хотелось бы увидеть пример кода! Как же ты будешь опрашивать, не вызывая функцию ни в цикле, ни в таймере?Eugenio писал(а):При всем уважении, так и не понял, чем не подходит отслеживание WM_MOVE - извещение о том, что форму передвинули, получаешь немедленно, таймер не нужен.
Amed писал(а):... Eugenio, приведёшь пример?..
'код формы MyForm
Public OldWndProc as Long
Private Sub HookWindow()
Dim hWnd As Long
hWnd = Me.hWnd
OldWndProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WndProc) ' ниже будет код процедуры WndProc
End Sub
Private Sub Form_Load()
HookWindow
End Sub
'некоторые сообщения windows
Public Const WM_NCLBUTTONDBLCLK = &HA3&
Public Const WM_NCLBUTTONDOWN = &HA1&
Public Const WM_MOVING = &H216&
Public Const WM_MOVE = &H3&
Public Const GWL_WNDPROC= -4&
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Function WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim Wnd As MyForm, OldWndProc as Long
Select Case Msg
Case WM_NCLBUTTONDBLCLK
'что-то делаем
Case WM_MOVING
'что-то делаем
Case WM_MOVE
'что-то делаем
Case Else
End Select
' как-то находим по hWnd и вызываем стандартную процедуру (а можем и не вызывать)
For Each Wnd In Forms
If Wnd.hWnd = hWnd Then
OldWndProc = Wnd.OldWndProc
Exit For
End If
Next Wnd
WndProc = CallWindowProc(OldWndProc, hWnd, Msg, wParam, lParam)
End Function
Сейчас этот форум просматривают: Google-бот и гости: 7