powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Одновременное перемещение 2-х форм.
9 сообщений из 9, страница 1 из 1
Одновременное перемещение 2-х форм.
    #38081076
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть Form1 и Form2
Их взаимное положение всегда должно быть
Код: vbnet
1.
2.
    Form2.Left = Form1.Left
    Form2.Top =Form1.Top + Form1.Height


Как грамотно отловить изменение положения Form1 (перемещаем Form1, Form2 должна ехать вместе с ней)
...
Рейтинг: 0 / 0
Одновременное перемещение 2-х форм.
    #38081144
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WM_MOVE
...
Рейтинг: 0 / 0
Одновременное перемещение 2-х форм.
    #38082594
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

Я сделал так,
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Public Function NewFormMainWindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, lParam As WINDOWPOS) As Long
  'сама форма Form1 чтобы таскать за ней Form2

  ' Keep the dimensions in bounds.
  If Msg = WM_WINDOWPOSCHANGING Then
    If (lParam.cx <> 0) And (lParam.cy <> 0) Then
      Form2.Left = lParam.x * Screen.TwipsPerPixelX
      Form2.Top = (lParam.y + lParam.cy) * Screen.TwipsPerPixelY
    End If
  ElseIf Msg = WM_WINDOWPOSCHANGED Then
    If (lParam.cx <> 0) And (lParam.cy <> 0) Then
      Form2.Left = lParam.x * Screen.TwipsPerPixelX
      Form2.Top = (lParam.y + lParam.cy) * Screen.TwipsPerPixelY
    End If
  End If

  ' Continue normal processing. VERY IMPORTANT!
  NewFormMainWindowProc = CallWindowProcWP( _
   OldFormMainWindowProc, hwnd, Msg, wParam, _
   lParam)
End Function

Надеялся, что дадут простой вариант без API, но видимо такого нет.
Если не делать WM_WINDOWPOSCHANGED, то наскакивает при попытке сдвинуть Form1 за верхние границы экрана.
И еще если использую WM_WINDOWPOSCHANGED, надо снимать сабклассинг, иначе Form2 не выгрузится и приложение не закроется.
Код: vbnet
1.
2.
3.
4.
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    'снятие сабклассинга
    SetWindowLong Form1.hwnd, GWL_WNDPROC, OldFormMainWindowProc
End Sub
...
Рейтинг: 0 / 0
Одновременное перемещение 2-х форм.
    #38083002
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Надеялся, что дадут простой вариант без API, но видимо такого нет.Ты просил грамотно, а не просто.
...
Рейтинг: 0 / 0
Одновременное перемещение 2-х форм.
    #38083004
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77 И еще если использую WM_WINDOWPOSCHANGED, надо снимать сабклассингСабклассинг нужно снимать всегда.
...
Рейтинг: 0 / 0
Одновременное перемещение 2-х форм.
    #38084134
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyСабклассинг нужно снимать всегда.
Почему?
Если честно, почти никогда этого не делаю.
Какие последствия?
...
Рейтинг: 0 / 0
Одновременное перемещение 2-х форм.
    #38084248
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77AntonariyСабклассинг нужно снимать всегда.
Почему?
Если честно, почти никогда этого не делаю.
Какие последствия?C одним из них ты уже столкнулся. Другое — критические ошибки.
...
Рейтинг: 0 / 0
Одновременное перемещение 2-х форм.
    #38084341
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyДругое — критические ошибки.
За годы "злоупотреблений" я заметил лишь, что сабклассинги (м.б. отсутствие их снятия) приводят иногда к случайным крашам "в среде", и это несильно напрягает. Но обычно это никак не проявляется в "exe".
Я не прав?
...
Рейтинг: 0 / 0
Одновременное перемещение 2-х форм.
    #38084355
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Везло.

Краш происходит потому, что поток, обрабатывающий очередь оконных сообщений, еще не закончил работу, а участок памяти, в котором находилась кастомная процедура, превратился в мусор после выгрузки из памяти модуля с этой процедурой.
Примерно так.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Одновременное перемещение 2-х форм.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]