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


Как грамотно отловить изменение положения Form1 (перемещаем Form1, Form2 должна ехать вместе с ней)
...
Рейтинг: 0 / 0
16.12.2012, 19:50
    #38081144
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одновременное перемещение 2-х форм.
WM_MOVE
...
Рейтинг: 0 / 0
17.12.2012, 20:46
    #38082594
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одновременное перемещение 2-х форм.
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
18.12.2012, 09:48
    #38083002
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одновременное перемещение 2-х форм.
Дмитрий77Надеялся, что дадут простой вариант без API, но видимо такого нет.Ты просил грамотно, а не просто.
...
Рейтинг: 0 / 0
18.12.2012, 09:49
    #38083004
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одновременное перемещение 2-х форм.
Дмитрий77 И еще если использую WM_WINDOWPOSCHANGED, надо снимать сабклассингСабклассинг нужно снимать всегда.
...
Рейтинг: 0 / 0
18.12.2012, 19:59
    #38084134
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одновременное перемещение 2-х форм.
AntonariyСабклассинг нужно снимать всегда.
Почему?
Если честно, почти никогда этого не делаю.
Какие последствия?
...
Рейтинг: 0 / 0
18.12.2012, 22:13
    #38084248
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одновременное перемещение 2-х форм.
Дмитрий77AntonariyСабклассинг нужно снимать всегда.
Почему?
Если честно, почти никогда этого не делаю.
Какие последствия?C одним из них ты уже столкнулся. Другое — критические ошибки.
...
Рейтинг: 0 / 0
19.12.2012, 00:14
    #38084341
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одновременное перемещение 2-х форм.
AntonariyДругое — критические ошибки.
За годы "злоупотреблений" я заметил лишь, что сабклассинги (м.б. отсутствие их снятия) приводят иногда к случайным крашам "в среде", и это несильно напрягает. Но обычно это никак не проявляется в "exe".
Я не прав?
...
Рейтинг: 0 / 0
19.12.2012, 00:31
    #38084355
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одновременное перемещение 2-х форм.
Везло.

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


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