Form_FormMove

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Form_FormMove

Сообщение Vovik » 01.02.2005 (Вт) 8:27

Можно ли как-нть сгенерировать данное событие? (только беза таймеров) :oops:

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 01.02.2005 (Вт) 8:38

А сабклассить окно не пробывал :?:
الفيجوال بيسك الرابح

_Мика_
Гуру
Гуру
 
Сообщения: 1459
Зарегистрирован: 24.10.2003 (Пт) 15:05
Откуда: г. Москва, м.Речной вокзал

Сообщение _Мика_ » 01.02.2005 (Вт) 9:22

А че там делать? Берешь таймер и внем проверяешь Top и Left
-Папа, а правда, что форумы делают людей дибилами?
-гы гы гы, сынок, лол!

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 01.02.2005 (Вт) 9:38

GM писал(а):А сабклассить окно не пробывал :?:

Вот те, собсна, твой сабж, Vovik. Отслеживаем событие WM_MOVE
Есть ли у меня вопрос? У меня всегда есть вопрос

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 01.02.2005 (Вт) 9:42

Ему не следить, ему генерить...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 01.02.2005 (Вт) 9:45

GSerg писал(а):Ему не следить, ему генерить...

Ой.
Ну, это даже проще.
Есть ли у меня вопрос? У меня всегда есть вопрос

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 01.02.2005 (Вт) 10:51

Самый просто способ
Код: Выделить всё
dim n as integer
private sub commnad1_click()
n = 10
me.left = me.left + n
me.top = me.top - n
end sub

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 01.02.2005 (Вт) 14:23

GSerg писал(а):Ему не следить, ему генерить...
Всмысле, при перемещении формы сгенерировать событие... :roll:

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Re: Form_FormMove

Сообщение Ramzes » 01.02.2005 (Вт) 14:38

Vovik писал(а):(только беза таймеров) :oops:


А чем тебя таймер не устраивает?

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 01.02.2005 (Вт) 15:10

сделай свой эвент и генери его в коде Form_Move

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 01.02.2005 (Вт) 18:22

А как насчет SendMessage Me.hwnd, WM_MOVE, и чего-то там в LPARAM И WPARAM

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 01.02.2005 (Вт) 18:28

Что то я не понял как ты это хочешь сделать, можна пример?

_Мика_
Гуру
Гуру
 
Сообщения: 1459
Зарегистрирован: 24.10.2003 (Пт) 15:05
Откуда: г. Москва, м.Речной вокзал

Сообщение _Мика_ » 01.02.2005 (Вт) 19:53

Вот пример
Вложения
MoveFormEvent.rar
(1.14 Кб) Скачиваний: 26
-Папа, а правда, что форумы делают людей дибилами?
-гы гы гы, сынок, лол!

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 01.02.2005 (Вт) 19:57

Дело в том что нужно без таймера, с таймером я и сам могу

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 01.02.2005 (Вт) 20:05

Какие проблемы?

Код: Выделить всё
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

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 01.02.2005 (Вт) 20:11

Вот сразу бы так :D

Amed спасибо, я хоть и не начинал тему, но интересно было до бешанства

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 01.02.2005 (Вт) 20:14

А что, принцип-то тот же, как и с таймером ;)

_Мика_
Гуру
Гуру
 
Сообщения: 1459
Зарегистрирован: 24.10.2003 (Пт) 15:05
Откуда: г. Москва, м.Речной вокзал

Сообщение _Мика_ » 01.02.2005 (Вт) 21:13

Amed писал(а):А что, принцип-то тот же, как и с таймером ;)
Но все равно
-Папа, а правда, что форумы делают людей дибилами?
-гы гы гы, сынок, лол!

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 01.02.2005 (Вт) 21:52

Принцип тот-же но таймера нет :!:

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 01.02.2005 (Вт) 22:28

да уж... Предётся наверно использовать таймер, меньше нагружать будет.... У меня еще в цикле вычисления офигенные валят, а тут еще и это опрашивать.... Может вообще форму заллочить? :roll:

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 01.02.2005 (Вт) 22:34

При всем уважении, так и не понял, чем не подходит отслеживание WM_MOVE - извещение о том, что форму передвинули, получаешь немедленно, таймер не нужен.
Есть ли у меня вопрос? У меня всегда есть вопрос

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 01.02.2005 (Вт) 22:50

Eugenio писал(а):При всем уважении, так и не понял, чем не подходит отслеживание WM_MOVE - извещение о том, что форму передвинули, получаешь немедленно, таймер не нужен.
Хотелось бы увидеть пример кода! Как же ты будешь опрашивать, не вызывая функцию ни в цикле, ни в таймере? :roll:
Последний раз редактировалось Vovik 02.02.2005 (Ср) 10:40, всего редактировалось 1 раз.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 01.02.2005 (Вт) 22:52

Сабклассинг... Хук на WM_MOVE.

Eugenio, приведёшь пример? ;)
Я сейчас тоже поищу и переделаю пример сабклассинга...

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 02.02.2005 (Ср) 8:46

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

Для отслеживания фактов перемещения формы тебе нужно ловить WM_MOVE, как и говорили
Есть ли у меня вопрос? У меня всегда есть вопрос


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 13

    TopList  
cron