Rubrik: Controls | VB-Versionen: VB2022 | 23.07.24 |
Ein Windrosen-Control zum Positionieren von Forms oder Controls Die Windrose besteht aus 9 Richtungspfeilen, die sich gewissermaßen an den Himmelsrichtungen orientieren. Das Klicken auf einen Pfeil bewirkt das Positionieren einer Form oder eines Controls auf einer Form. | ||
Autor: Dietrich Herrmann | Bewertung: | Views: 327 |
ohne Homepage | System: Win7, Win8, Win10, Win11 | Beispielprojekt |
Das Windrosen-Control kann man im Projekt einsetzen, wenn man von einer Form aus, auf der sich das Control befindet, eine andere externe Form auf dem Bildschirm variabel positionieren möchte, oder aber (als zweite Möglichkeit) ein Control auf der gleichen Form eben auf dieser positionieren möchte.
Die Windrose kann durch Ändern der Fontgröße in seiner Größe beeinflusst werden.
Als Fonts werden WingDings2 und WingDings3 benötigt. Zum Positionieren sind allerdings noch andere Programmierschritte erforderlich. Zunächst definiert man eine Variabel in der Ausgangsform, die das Positionieren beeinflusst, wenn sie sich ändert. Das zu ermitteln, definiert man eine Variable:
Dim WithEvents pp As New clsVariableChange
Hier sieht man, dass die Klasse clsVariableChange verwendet wird (siehe mein Tipp Ereignis auslösen, wenn Variable sich ändert).
Hier der Code dazu:
' Variable auf Änderung überwachen Public Class clsVariableChange Private mVarValue As String Public Event VariableChanged(ByVal mVarValue As String) Public Property theVariable() As String Get theVariable = mVarValue End Get Set(ByVal value As String) mVarValue = value RaiseEvent VariableChanged(mVarValue) End Set End Property End Class
Wenn sich der Wert der Variable pp ändert, nämlich bei Klick auf einen Pfeil der Windrose, wird im Falle, dass eine externe Form positioniert werden soll, das entsprechende Event pp_VariableChanged aufgerufen.
Hier der entsprechende Code:' Positionieren der Form mittels Windrose und Funktion CalcNewPositionPoint Private Sub pp_VariableChanged(mValue As Object) Handles pp.VariableChanged frmRect = frmDaysShowSmall.RectangleToScreen(frmDaysShowSmall.Bounds) frmDaysShowSmall.Location _ = CalcNewPositionPoint( New Rectangle(screenRect.X, screenRect.Y, screenRect.Width, screenRect.Height), frmRect, pp.theVariable) End Sub
Das löst die Positionierung der externen Form auf dem Bildschirm aus.
Voraussetzung, dass eine Form positioniert wird ist, dass vor Benutzung der Windrose ihre Eigenschaft Windrose.extForm gesetzt wird mit dem Formnamen der externen Form. Wird das nicht gemacht, arbeitet Windrose im Modus 'positionieren eines Controls auf der Ausgangsform'.
Zum eigentlichen Positionieren wird die Funktion CalcNewPositionPoint verwebdet. Hier deren Code:
''' <summary> ''' Positionieren eines Rechtecks auf einem 'Hintergrund'-Rechteck ''' </summary> ''' <param name="theOrigCoords">die Koordinaten des Hintergrundrechtecks</param> ''' <param name="theObjCoords">die Koordinaten des zu positionierenden Rechtecks</param> ''' <param name="theAlignment">die Ausrichtung des zu pos. Rechtecks</param> ''' <returns>die neue Location des zu pos. Rechtecks</returns> Public Function CalcNewPositionPoint(theOrigCoords As Rectangle, theObjCoords As Rectangle, theAlignment As PositionsOfObjects) As Point Dim x As Short = theOrigCoords.X Dim y As Short = theOrigCoords.Y ' Position (Koordinaten) ermitteln With theObjCoords Select Case theAlignment Case PositionsOfObjects.UpperLeftCorner ' oben links x = theOrigCoords.Left y = theOrigCoords.Top Case PositionsOfObjects.UpperRightCorner ' oben rechts x = theOrigCoords.Right - .Width y = theOrigCoords.Top Case PositionsOfObjects.BottomLeftCorner ' unten links x = theOrigCoords.Left y = theOrigCoords.Bottom - .Height Case PositionsOfObjects.BottomRightCorner ' unten rechts x = theOrigCoords.Right - .Width y = theOrigCoords.Bottom - .Height Case PositionsOfObjects.Center ' zentrieren x = theOrigCoords.Left + (theOrigCoords.Width - .Width) / 2 y = theOrigCoords.Top + (theOrigCoords.Height - .Height) / 2 Case PositionsOfObjects.UpperCenterBorder ' zentriert oben x = theOrigCoords.Left + (theOrigCoords.Width - .Width) / 2 y = theOrigCoords.Top Case PositionsOfObjects.RightCenterBorder ' zentriert rechts x = theOrigCoords.Right - .Width y = theOrigCoords.Top + (theOrigCoords.Height - .Height) / 2 Case PositionsOfObjects.BottomCenterBorder ' zentriert unten x = theOrigCoords.Left + (theOrigCoords.Width - .Width) / 2 y = theOrigCoords.Bottom - .Height Case PositionsOfObjects.LeftCenterBorder ' zentriert links x = theOrigCoords.Left y = theOrigCoords.Top + (theOrigCoords.Height - .Height) / 2 End Select ' Rechteck neu positionieren .Location = New Point(x, y) End With Return theObjCoords.Location End Function
mit Enumeration
''' <summary> ''' Aufzählung möglicher Ausrichtungen ''' Form an Form ''' </summary> Public Enum PositionsOfObjects UpperCenterBorder ' zentriert oberer Rand Norden orth RightCenterBorder ' zentriert rechter Rand Osten ast BottomCenterBorder ' zentriert unterer Rand Süden outh LeftCenterBorder ' zentriert linker Rand Westen est Center ' zentriert Zentrum Center UpperLeftCorner ' oben linke Ecke NordWest NorthWest UpperRightCorner ' oben rechte Ecke NordOst NorthEast BottomLeftCorner ' unten linke Ecke SüdWest SouthWest BottomRightCorner ' unten rechte Ecke SüdOst SouthEast End Enum