vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
sevDataGrid - Gönnen Sie Ihrem SQL-Kommando diesen krönenden Abschluß!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik:    |   VB-Versionen: VB2008, VB201009.06.13
Standard-Bildschirm für die Anwendung festlegen (Multiscreen-System)

Es wird eine Funktion vorgestellt, die beim Einsatz in einer beliebigen Form die Anzeige auf einem vom Benutzer festgelegten Bildschirm eines Multiscreen-Systems erlaubt.

Autor:  Dietrich HerrmannBewertung:     [ Jetzt bewerten ]Views:  1.710 
ohne HomepageSystem:  WinXP, Win7, Win8, Win10, Win11 Beispielprojekt 

Windows zeigt die Fenster der eigenen Application in einem Multiscreen-System nicht immer auf dem Bildschirm an, auf dem man es gern hätte. Oftmals liegt es daran, auf welchem Display man die Verknüpfung gelegt hat. Da wird eventuell die MDI-Form auf diesem Bildschirm geöffnet, aber Unterfenster eventuell auf dem Primaryscreen. Um diese Effekt zu vermeiden, kann man den Nutzer festlegen lassen, auf welchem Bildschirm alle Fenster der Anwendung angezeigt werden sollen. Damit das dann funktioniert, hat man ein wenig Programmierarbeit zur Vorbereitung. Die folgende Funktion kann dafür verwendet werden.

Die Funktion locationSettingMultiscreen setze ich immer in Public Sub New() jeder Form meines Projekts ein. Voraussetzung dafür ist, dass am Beginn der Application entweder durch Wahl anhand einer Combobox oder eventuell durch einen Commandozeilenparameter o.ä. der gewünschte Bildschirm festgelegt werden kann. Diese Festlegung wird praktischerweise in einer Public-Variablen der Application gespeichert; möglicherweise auch in die Settings gespeichert.

Dann kann die Funktion im New() aufgerufen werden. Hier erst mal der Code:

Module Module1
  ''' <summary>
  ''' 	Screen-Festlegung für eine Form bei Multiscreen-System
  ''' </summary>
  ''' <param name="theForm">die Form</param>
  ''' <param name="scrStr">der Screen-String für den ausgewählten Bildschirm</param>
  ''' <param name="formPos">die alte festgelegte FormStartPosition</param>
  ''' <param name="formLoc">eine spezielle Position der Form, wenn gewünscht</param>
  Public Sub locationSettingMultiscreen(ByVal theForm As Form, ByVal scrStr As String, _
    ByVal formPos As FormStartPosition, ByVal formLoc As Point)
 
    Dim scp() As String, isx As Short
 
    If scrStr = "" Then Exit Sub
    If scrStr.Length = 1 Then
      isx = Val(scrStr) - 1
    Else
      scp = Split(scrStr, ";")
      isx = Val(scp(1).Replace("DISPLAY", "")) - 1   ' der Index des Displays
    End If
 
    Dim standardPoint As Point = New Point(100, 100) ' eine Standard-Location
 
    With theForm
      Dim ws As FormWindowState = .WindowState  ' speichern Original-Windowstate
 
      ' diese Einstellungen muss die Form haben, um auf einem bestimmten 
      ' Bildschirm lokalisiert zu werden
      .WindowState = FormWindowState.Normal
      .StartPosition = FormStartPosition.Manual
 
      ' neue Position der Form anhand der voreingestellten FormStartPosition
      ' und der Bildschirmgröße neu berechnen
      Select Case formPos
        Case FormStartPosition.CenterScreen
          .Location = _
            New Point(Screen.AllScreens(isx).Bounds.X + _
            (Screen.AllScreens(isx).Bounds.Width - .Width) \ 2, _
            (Screen.AllScreens(isx).Bounds.Y + _
            (Screen.AllScreens(isx).Bounds.Height - .Height) \ 2))
 
        Case FormStartPosition.WindowsDefaultLocation
          .Location = _
            New Point(Screen.AllScreens(isx).Bounds.X + standardPoint.X, _
            Screen.AllScreens(isx).Bounds.Y + standardPoint.Y)
 
          ' Case FormStartPosition.CenterParent
          ' Case FormStartPosition.Manual
          ' Case FormStartPosition.WindowsDefaultBounds
      End Select
 
      ' es ist spezielle Location für die Form angegeben
      If Not formLoc.Equals(New Point(0, 0)) Then
        If formLoc.X < 0 Then ' Form horizontal zentriert
          .Location = _
            New Point(Screen.AllScreens(isx).Bounds.X + _
            (Screen.AllScreens(isx).Bounds.Width - .Width) \ 2, _
            Screen.AllScreens(isx).Bounds.Y + formLoc.Y)
        Else
          .Location = _
            New Point(Screen.AllScreens(isx).Bounds.X + _
            formLoc.X, Screen.AllScreens(isx).Bounds.Y + formLoc.Y)
        End If
      End If
 
      ' zurückstellen auf Original-WindowState
      If Not .WindowState.Equals(ws) Then .WindowState = ws
    End With
  End Sub
End Module
  • Erster Parameter die Angabe der Form (im New() sinnvollerweise Me).
     
  • Zweiter Parameter entscheidet über den "Standardbildschirm". Ich habe hier zwei Möglichkeiten des Parameterstrings vorgesehen. Einerseits der 1-basieret Index des Bildschirms, also bspw. "2" und andererseits der String aus der Auswahl einer Combox kommend, wie es im Tipp  Ermitteln der Zuordnung von Displayname zu Monitorname gezeigt wird.
     
  • Dritter Parameter enthält die für die Form festgelegte FormStartPosition.
     
  • Vierter Parameter kann spezielle Lokalisierung der Form enthalten, bspw. eine Verschiebung von der CenterScreen Position. Falls keine Position gewünscht einfach Nothing übergeben.

Eine Besonderheit in der Funktion ist vielleicht, die Zwischenspeicherung des FormWindowState. Das ist notwendig, wenn dieser nämlich Maximized ist, kann die Form nicht programmatisch postioniert werden, der WindowState muss so zu sagen zwischenzeitlich mal kurz auf Normal eingestellt werden.

Aufruf:

locationSettingMultiscreen(Me, screenDefineStr, FormStartPosition.CenterScreen, Nothing)

mit

screenDefineStr = "2"