2014-12-08 3 views
1

Кто-нибудь знает, как переместить форму в следующее окно справа (или циклически перемещаться, если текущий монитор является последним) и максимизировать его? Я играю и написал какой-то код (самообучение, поэтому, пожалуйста, будьте добрыми), который перемещает форму, если она находится в «нормальном» окне окна, но я застрял на максимизирующей части. Я бы подумал, что WindowState = Maximized будет делать это, но установка того, что в форме приводит к тому, что функция перемещения не отвечает.VB.NET - Переместить форму на следующий монитор и максимизировать

Ниже приведен код, у меня до сих пор:

Module Monitor 

    Public totalMonitors As Integer = System.Windows.Forms.Screen.AllScreens.Count 

    Private xPositionForMonitors As New Dictionary(Of Integer, Integer) 
    Private yPositionForMonitors As New Dictionary(Of Integer, Integer) 
    Private currentMonitorIndex As Integer 
    Private newMonitorIndex As Integer 

    Public Sub buildMonitorArray() 

     For m As Integer = 0 To (totalMonitors - 1) 
      xPositionForMonitors.Add(m, System.Windows.Forms.Screen.AllScreens(m).WorkingArea.Location.X) 
      yPositionForMonitors.Add(m, System.Windows.Forms.Screen.AllScreens(m).WorkingArea.Location.Y) 
     Next 

    End Sub 

    Public Sub moveToNextMonitor(targWindow As Form) 

     identifyCurrentMonitor(targWindow) 
     targWindow.SetDesktopLocation(xPositionForMonitors(newMonitorIndex) + 1, 0) 

    End Sub 

    Private Sub identifyCurrentMonitor(targWindow As Form) 

     For c As Integer = 0 To (totalMonitors - 1) 
      If targWindow.Location.X + 10 > xPositionForMonitors(c) Then 
       currentMonitorIndex = c 
      End If 
     Next 

     newMonitorIndex = currentMonitorIndex + 1 
     If newMonitorIndex = totalMonitors Then newMonitorIndex = 0 

    End Sub 

End Module 

В настоящее время я звоню функцию buildMonitorArray по форме нагрузки, а затем с помощью moveToNextMonitor (Me) на форме.

+0

Вы установили WindowState в FormWindowState.Maximized после moveToNextMonitor? – Steve

+0

В Windows 7/8 это просто ключ Windows + клавиша Shift + стрелка вправо, чтобы перейти к монитору справа, а клавиша Windows + стрелка вверх - увеличить. –

ответ

1

Вам необходимо установить WindowState в Normal, прежде чем переместить его, а затем вернуть его в исходное состояние после его перемещения. Я преобразовал ваш код в класс, так что вам не нужно беспокоиться о вызове метода buildMonitorArray перед перемещением любых форм. Чтобы вызвать ваш метод, вам нужно будет вызвать Monitor.moveToNextMonitor, так как теперь это класс. Если вы все еще предпочитаете использовать модуль, вы можете просто перенести изменения кода в свой модуль, и он все равно будет работать одинаково.

Public Class Monitor 

Shared Sub New() 
    buildMonitorArray() 
End Sub 

Public Shared totalMonitors As Integer = System.Windows.Forms.Screen.AllScreens.Count 

Private Shared xPositionForMonitors As New Dictionary(Of Integer, Integer) 
Private Shared yPositionForMonitors As New Dictionary(Of Integer, Integer) 

Public Shared Sub buildMonitorArray() 
    For m As Integer = 0 To (totalMonitors - 1) 
     xPositionForMonitors.Add(m, System.Windows.Forms.Screen.AllScreens(m).WorkingArea.Location.X) 
     yPositionForMonitors.Add(m, System.Windows.Forms.Screen.AllScreens(m).WorkingArea.Location.Y) 
    Next 
End Sub 

Public Shared Sub moveToNextMonitor(targWindow As Form) 
    Dim newMonitorIndex As Integer = identifyCurrentMonitor(targWindow) 
    Dim originalState = targWindow.WindowState 
    Try 
     If originalState <> FormWindowState.Normal Then 
      targWindow.WindowState = FormWindowState.Normal 
     End If 
     targWindow.SetDesktopLocation(xPositionForMonitors(newMonitorIndex) + 1, 0) 
    Finally 
     targWindow.WindowState = originalState 
    End Try 
End Sub 

Private Shared Function identifyCurrentMonitor(targWindow As Form) As Integer 
    Dim currentMonitorIndex As Integer 
    Dim newMonitorIndex As Integer 
    For c As Integer = 0 To (totalMonitors - 1) 
     If targWindow.Location.X + 10 > xPositionForMonitors(c) Then 
      currentMonitorIndex = c 
     End If 
    Next 

    newMonitorIndex = currentMonitorIndex + 1 
    If newMonitorIndex = totalMonitors Then newMonitorIndex = 0 
    Return newMonitorIndex 
End Function 

End Class 
+0

Большое спасибо user3308241 :) Работает блестяще. Я как бы понял идею класса после того, как посмотрел на код, но, как я уже сказал, самоучка. Где было бы лучшее место, чтобы начать изучать этот ООП? –

+0

Этот класс на самом деле не очень хороший пример ООП, потому что все разделяется. Я тоже самоучка, и я начал с книги Visual Basic.net для чайников. С тех пор я прочитал много других книг по программированию и сделал отличную карьеру в разработке программного обеспечения. В настоящее время вы можете узнать практически все через Интернет. Если вы заинтересованы в профессиональном развитии программного обеспечения, я бы рекомендовал изучить C#, потому что он более широко используется, чем vb.net. Удачи вам. – user3308241

Смежные вопросы