Перемещение формы с FormBorderStyle.None

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Alexandrius
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 55
Зарегистрирован: 01.11.2009 (Вс) 14:09
Откуда: Украина

Перемещение формы с FormBorderStyle.None

Сообщение Alexandrius » 25.11.2009 (Ср) 19:24

Мне нужно перемещать Форму без заголовка окна "ухватив" её за находящийся на ней PictureBox. Делаю это так (VB 2008):
Код: Выделить всё
Private lastPoint As System.Drawing.Point
Private Sub PictTop_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictTop.MouseMove
        If e.Button = Windows.Forms.MouseButtons.Left Then
            Me.Left = Me.Left + Control.MousePosition.X - lastPoint.X
            Me.Top = Me.Top + Control.MousePosition.Y - lastPoint.Y
        End If
        lastPoint = Control.MousePosition
    End Sub
Код работает, но коряво. Если потягать форму по экрану, то указатель мыши постепенно съезжает с PictureBox. Подскажите, пожалуйста, как это исправить.
Visual Basic 2008

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Перемещение формы с FormBorderStyle.None

Сообщение Joo » 25.11.2009 (Ср) 20:14

Правельнее слать сообщение окну, но иногда можно так:

Код: Выделить всё
    Private _CurPos As Point

   Private Sub Form_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
        If e.Button = Windows.Forms.MouseButtons.Left Then _CurPos = e.Location
    End Sub

    Private Sub FormClock_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
        If e.Button = Windows.Forms.MouseButtons.Left Then
            Me.Location += e.Location - _CurPos
        End If
    End Sub


Но повторюсь, если не требуется чтобы при перетаскивании окна оно обязательно отображалось, вне зависимости от настроек параметров системы, то нужно слать оконное сообщение.
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

Alexandrius
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 55
Зарегистрирован: 01.11.2009 (Вс) 14:09
Откуда: Украина

Re: Перемещение формы с FormBorderStyle.None

Сообщение Alexandrius » 25.11.2009 (Ср) 20:29

Большое спасибо, Joo. Помогло.
Visual Basic 2008

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Перемещение формы с FormBorderStyle.None

Сообщение viter.alex » 25.11.2009 (Ср) 21:13

А можно так. Обрабатывать не мышь, а оконную процедуру.
Код: Выделить всё
   Private Const WM_NCHITTEST As Integer = &H84
   Private Const HTCAPTION As Integer = &H2
  ''' <summary>Сабклассинг оконной процедуры</summary>
   Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
      Select Case m.Msg
         Case WM_NCHITTEST
            m.Result = IntPtr.op_Explicit(HTCAPTION)
            Return
      End Select
      MyBase.WndProc(m)
   End Sub
Лучше день потерять — потом за пять минут долететь!

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Перемещение формы с FormBorderStyle.None

Сообщение Joo » 26.11.2009 (Чт) 10:00

viter.alex писал(а):А можно так. Обрабатывать не мышь, а оконную процедуру.
Код: Выделить всё
   Private Const WM_NCHITTEST As Integer = &H84
   Private Const HTCAPTION As Integer = &H2
  ''' <summary>Сабклассинг оконной процедуры</summary>
   Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
      Select Case m.Msg
         Case WM_NCHITTEST
            m.Result = IntPtr.op_Explicit(HTCAPTION)
            Return
      End Select
      MyBase.WndProc(m)
   End Sub


Угу, но если не включено "Отображать форму при перетаскивании" то будет видно только контур.
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Перемещение формы с FormBorderStyle.None

Сообщение viter.alex » 26.11.2009 (Чт) 17:16

А с чего ты взял, что содержимое формы должно отображаться при перетаскивании?
Лучше день потерять — потом за пять минут долететь!

netdemon
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 179
Зарегистрирован: 04.09.2007 (Вт) 15:51

Re: Перемещение формы с FormBorderStyle.None

Сообщение netdemon » 26.11.2009 (Чт) 20:20

Только лучше наверное использовать не FormBorderStyle.None, FixedToolBox например. только отключить ControlBox и свойство Text="". :D
Лишь разум потерянный бесповоротно мною. Наполнить может сердце мне тоской.
Нельзя обнять необъятное и впихнуть невпихуемое.

Alexandrius
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 55
Зарегистрирован: 01.11.2009 (Вс) 14:09
Откуда: Украина

Re: Перемещение формы с FormBorderStyle.None

Сообщение Alexandrius » 26.11.2009 (Чт) 23:53

viter.alex писал(а):...Обрабатывать не мышь, а оконную процедуру...
А разве таким методом получиться тягать за PictureBox? По-моему только за саму форму...
Visual Basic 2008

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Перемещение формы с FormBorderStyle.None

Сообщение Joo » 28.11.2009 (Сб) 5:48

viter.alex писал(а):А с чего ты взял, что содержимое формы должно отображаться при перетаскивании?

Ну дык я же не утверждаю. что автору так надо, я просто разъяснил разницу.

Alexandrius писал(а):А разве таким методом получиться тягать за PictureBox? По-моему только за саму форму...

Ага, получится.
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Перемещение формы с FormBorderStyle.None

Сообщение viter.alex » 09.08.2010 (Пн) 1:54

Не сочтите наглостью, но нашёлся ещё один способ перемещения формы. Его отличие от предыдущего, предложенного мной, в том, что сохраняется реакция на клик
Код: Выделить всё
  Private Const WM_NCLBUTTONDOWN = &HA1
  Private Const HTCAPTION = &H2
  Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
    If e.Button = Windows.Forms.MouseButtons.Left Then
      Try
        sender.Capture = False
        Dim msg As Message = _
            Message.Create(sender.Handle, WM_NCLBUTTONDOWN, _
                New IntPtr(HTCAPTION), IntPtr.Zero)
        Me.DefWndProc(msg)
      Catch ex As Exception

      End Try
    End If
  End Sub

Этим же кодом можно перемещать любой другой элемент управления, имеющий hwnd, во время выполнения программы.
Лучше день потерять — потом за пять минут долететь!


Вернуться в Visual Basic .NET

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17

    TopList