Der CommandButton ist ein häufig benötigtes Control. Viele Einstellmöglichkeiten bietet uns der Standard-Button aber nicht gerade: weder Flatlook, noch Hovereffekt - geschweige denn runde Buttons. Wie man einen solchen Button aber dennoch erstellen kann, zeigt Ihnen nachfolgender Tipp. Anstelle des Standard-Buttons nehmen wir eine TextBox mit folgenden Eigenschaften:
Wird die Maus über die TextBox bewegt, soll der Hintergrund dunkelgrau werden und die Schriftfarbe selbst weiß. Beim Klicken auf den "Button" wird die gesamte TextBox dann noch ein klein wenig verrückt (nach unten und nach rechts), so dass das Niederdrücken der Schaltfläche auch optisch sichtbar wird. Beim Loslassen der Maus wird der Button dann wieder an der usprünglichen Position dargestellt. Einzig was störend wirkt ist der Textcursor, der autom. erscheint, sobald die Schaltfläche den Fokus bekommt. Das lässt sich aber abstellen, indem wir zusätzlich eine PictureBox auf die Form setzen und den Fokus dann auf die PictureBox "umleiten". Die PictureBox selbst wird im Form_Load Event außerhalb des sichtbaren Formulars geschoben. Soviel zur Theorie, jetzt zur Praxis. Erstellen Sie ein neues Projekt und plazieren auf die Form eine TextBox namens MyButton. Setzen Sie Index = 0, um ein Steuerelementfeld für MyButton zu erstellen. Markieren Sie die TextBox (MyButton(0)) und drücken Strg+C. Kopieren Sie über Strg+V jetzt soviele TextBoxen auf die Form, wie Sie Schaltflächen benötigen. Ziehen Sie jetzt noch ein PictureBox-Control auf die Form (Picture1). Alles andere wird jetzt per Code erledigt. Option Explicit ' zunächst die benötigten API-Deklarationen Private Declare Function CreateRoundRectRgn Lib "gdi32" ( _ ByVal X1 As Long, _ ByVal Y1 As Long, _ ByVal X2 As Long, _ ByVal Y2 As Long, _ ByVal X3 As Long, _ ByVal Y3 As Long) As Long Private Declare Function SetWindowRgn Lib "user32" ( _ ByVal hWnd As Long, _ ByVal hRgn As Long, _ ByVal bRedraw As Boolean) As Long Private Declare Function SetCapture Lib "user32" ( _ ByVal hWnd As Long) As Long Private Declare Function ReleaseCapture Lib "user32" () As Long ' Schaltflächen-Farben Private Const lBackcolor_Normal As Long = &HE0E0E0 Private Const lBackColor_Hover As Long = &H808080 Private Const lForeColor_Normal As Long = &H0 Private Const lForeColor_Hover As Long = &HFFFFFF Private Sub Form_Load() Dim i As Integer Dim X As Integer Dim Y As Integer Dim n As Long ' alle "Buttons" durchlaufen For i = 0 To MyButton.UBound With MyButton(i) ' Hintergrundfarbe der Form anpassen .BackColor = Me.BackColor ' Kein Border! .BorderStyle = 0 .Appearance = 0 .Height = 255 ' Text mittig .Alignment = 2 ' Hinter-/Vordergrundfarbe .BackColor = lBackcolor_Normal .ForeColor = lForeColor_Normal ' Originalposition .Tag = .Top ' Normaler Mauszeiger (kein I) .MousePointer = 1 ' Ecken abrunden X = .Width / Screen.TwipsPerPixelX Y = .Height / Screen.TwipsPerPixelY n = 10 SetWindowRgn .hWnd, _ CreateRoundRectRgn(0, 0, X, Y, n, n), True End With Next i ' zusätzliche PictureBox außerhalb der Form ' verschieben With Picture1 .Move -100, -100, 15, 15 End With End Sub Wir realisieren den Hover-Effekt... (siehe auch Workshop "Hyperlinks - Marke Eigenbau") Private Sub MyButton_MouseDown(Index As Integer, _ Button As Integer, Shift As Integer, _ X As Single, Y As Single) ' Button verschieben With MyButton(Index) .Move .Left + 15, .Top + 15 End With End Sub Private Sub MyButton_MouseUp(Index As Integer, _ Button As Integer, Shift As Integer, _ X As Single, Y As Single) ' Originalposition wiederherstellen With MyButton(Index) .Move .Left - 15, .Top - 15 End With End Sub Private Sub MyButton_MouseMove(Index As Integer, _ Button As Integer, Shift As Integer, _ X As Single, Y As Single) ' Hover-Effekt realisieren With MyButton(Index) If X >= 0 And Y >= 0 And X <= .Width And Y <= .Height Then ' Maus befindet sich über der "Schaltfläche" SetCapture .hWnd If Button And .Tag = .Top Then .Move .Left + 15, .Top + 15 End If .ForeColor = lForeColor_Hover .BackColor = lBackColor_Hover Else ' Maus außerhalb ReleaseCapture If Button And .Top <> .Tag Then .Move .Left - 15, .Top - 15 End If .ForeColor = lForeColor_Normal .BackColor = lBackcolor_Normal End If End With End Sub Private Sub MyButton_GotFocus(Index As Integer) ' Bekommt die TextBox (ähmm... unsere Schaltfläche) ' den Fokus, wird dieser an die nicht sichtbare PictureBox ' umgeleitet, da sonst der I-Cursor zu sehen ist Picture1.SetFocus End Sub Eine Eigenart gibt es jetzt noch zu beachten. Durch das Umleiten der Mausereignisse an die jeweilige "Schaltfläche" (SetCapture) wird das Click-Event doppelt ausgelöst. Dieses Problem kann jedoch umgegangen werden, indem man nicht das Click-Event verwendet, sondern das MouseUp-Event. Private Sub MyButton_MouseUp(Index As Integer, _ Button As Integer, Shift As Integer, _ X As Single, Y As Single) With MyButton(Index) ' Originalposition wiederherstellen .Move .Left - 15, .Top - 15 ' Originalfarben .BackColor = lBackcolor_Normal .ForeColor = lForeColor_Normal End With ' Klick-Event MsgBox "Klick auf " + MyButton(Index).Text End Sub Dieser Tipp wurde bereits 27.599 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
vb@rchiv CD Vol.6 Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! Online-Update-Funktion Entwickler-Vollversionen u.v.m. Tipp des Monats April 2024 Skyfloy Chart von Microsoft und dazu noch gratis Tutorial für Microsoft Chart Controls für Microsoft .NET Framework 3.5 Neu! sevDTA 3.0 Pro SEPA mit Kontonummernprüfung Erstellen von SEPA-Dateien mit integriertem BIC-Verzeichnis und Konto- nummern-Prüfverfahren, so dass ungültige Bankdaten bereits im Vorfeld ermittelt werden können. |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |