RSS
StartseiteKnowledge LibraryTop 10Impressum

Griffige Ecken

Formulare mit zusätzlicher Griff-Ecke ausstatten

Wenn Sie das StatusBar Steuerelement aus den Common Controls unten auf Ihrem Formular ausrichten, erhält dies automatisch eine Griff-Ecke zur Größenänderung. Diese Griff-Ecke können Sie auch ohne Common Controls haben.

Wenn Sie in Ihren Formularen das Statusleisten Steuerelement aus den Windows Common Controls einsetzen, haben Sie automatisch in der unteren linken Ecke eine kleine schraffierte Fläche über die das Formular zusätzlich in seiner Größe verändert werden kann. Setzt natürlich voraus, dass diese am unteren Rand ausgerichtet ist. Aber Sie müssen nicht immer gleich die Common Controls einbinden, um an diese Griff-Ecken zu gelangen, Sie können auch das hier vorgestellte UserControl verwenden.

Die Größenänderung des Form setzt man durch die API Funktion SendMessage, der Nachricht WM_NCLBUTTONDOWN und der Konstanten HTBOTTOMRIGHT in "wParam" in Gang:

Private Sub UserControl_MouseDown(Button As Integer, Shift As Integer, _
                                  X As Single, Y As Single)
  If Button = vbLeftButton Then
    ReleaseCapture
    SendMessage Parent.hwnd, WM_NCLBUTTONDOWN, HTBOTTOMRIGHT, ByVal 0&
  End If
End Sub

Die passende Grafik liefert die API Funktion LoadImage. Übergibt man Null als Instanzenhandle, lädt diese Funktion eine Ressource aus dem Systemfundus. Die Grafik der Griff-Ecke verbirgt sich hinter der Konstante OBM_SIZE und hat automatisch die passende Größe, die von der Größe der Scrollleisten abhängt und das passende Farbschema. Mithilfe der Funktion HandleToPicture wird diese Grafik direkt über die Picture-Eigenschaft dem UserControl zugewiesen. Diese Methode liefert auch gleich die passenden Maße, um das UserControl in seiner Größe anzupassen:

Private Sub pLoadGripper()
  Dim hBitmap As Long
  
  hBitmap = LoadImage(0, OBM_SIZE, IMAGE_BITMAP, 0, 0, 0)
  Set Picture = HandleToPicture(hBitmap, vbPicTypeBitmap)
  
  Width = ScaleX(Picture.Width, vbHimetric, vbTwips)
  Height = ScaleY(Picture.Height, vbHimetric, vbTwips)
End Sub

Private Sub UserControl_Initialize()
  pLoadGripper
End Sub

Da der Benutzer während der Laufzeit des Programms die Einstellungen des Anzeigeschemas ändern kann, wird zusätzlich im Paint-Ereignis des UserControl die Grafik erneut dem UserControl zugewiesen. Da die Zuweisung der Grafik sofort wieder das Paint Ereignis auslöst, wird der vollständige Ablauf durch die Variable bolAtWork gesteuert und nur beim ersten Aufruf gewährt:

Private Sub UserControl_Paint()
  Static bolAtWork As Boolean
  
  If (bolAtWork) Then
    Exit Sub
  Else
    bolAtWork = True
  End If
  
  pLoadGripper
  pAlignGripper
  
  bolAtWork = False
End Sub

Zum Schluss muss das UserControl noch entsprechend unten rechts ausgerichtet werden. Dazu muss auf das Resize-Ereignis des Formulars reagiert werden:

Private WithEvents mParent As Form

Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
  If (Ambient.UserMode) And TypeOf UserControl.Parent Is Form Then
    Set mParent = Parent
  End If
End Sub

Private Sub mParent_Resize()
  pAlignGripper
End Sub

Private Sub pAlignGripper()
  If (Ambient.UserMode) Then
    If Parent.WindowState = vbNormal Then
      With Extender
        .Visible = True
        .Top = Parent.ScaleHeight - .Height
        .Left = Parent.ScaleWidth - .Width
      End With
    Else
      Extender.Visible = False
    End If
  End If
End Sub

Das zum Download angebotene Gripper-Control verfügt über Eigenschaften, die eine weitere Anpassung des Control erlauben. Über die AutoAlign- Eigenschaft, kann die automatische Ausrichtung des Control abgeschaltet werden. Dies ist vor allem dann sinnvoll, wenn die Griff-Ecke in einem untergeordeneten Container, wie zum Beispiel einer PictureBox, untergebracht wird. Die HideMaximized- Eigenschaft legt fest, ob die Griff-Ecke ausgeblendet wird, wenn das Formular maximiert wurde. Setzt man diese auf False, bleibt das Control sichtbar, wird aber gesperrt, was sich in der Darstellung durch ein einfaches graues Kästchen äussert. Somit kann die Griff-Ecke als Lückenfüller zwischen zwei Scrollleisten (horizontal/vertikal) genutzt werden. Die Sperrung des Control, kann auch über die Enabled- Eigenschaft erfolgen.

Die Deklarationen und den vollständigen Code entnehmen Sie dem Beispielprojekt.