Rubrik: Forms/Controls | VB-Versionen: VB5, VB6 | 01.08.01 |
Hyperlinks - Marke Eigenbau Dieser Workshop soll Ihnen zeigen, wie sich Hyperlinks in Visual Basic realisieren und erstellen lassen. Hierbei sind alle nachfolgenden Routinen sehr universell gehalten und lassen (fast) keine Wünsche mehr offen. Ab sofort können auch Sie Ihre Projekte und Anwendungen mit modernen Hyperlinks ausstatten! | ||
Autor: Dieter Otter | Bewertung: | Views: 22.283 |
Dieser Workshop soll Ihnen zeigen, wie sich Hyperlinks in Visual Basic realisieren und erstellen lassen. Hierbei sind alle nachfolgenden Routinen sehr universell gehalten und lassen (fast) keine Wünsche mehr offen. Ab sofort können auch Sie Ihre Projekte und Anwendungen mit modernen Hyperlinks ausstatten!
Was sind Hyperlinks?
Leider fehlen bisher in VB die modernen Hyperlink-Steuerelemente, wie sie in Webseiten seit Jahren verwendet werden. Hierbei handelt es sich um einen Text, bei dem eine bestimmte Aktion ausgeführt wird, wenn der Anwender mit der Maus darauf klickt. Um den Hyperlink vom restlichen Text hevorzuheben, wird dieser meist in einer anderen Farbe dargestellt - und oftmals noch zusätzlich mit einem sogenannten Hover-Effekt ausgestattet, d.h. bewegt man die Maus auf den Text, so wird dieser z.B. unterstrichen dargestellt und/oder verändert seine Farbe.
Um einen solchen Hyperlink in VB zu realisieren, wird eigentlich nur eine Textbox benötigt und zwei API-Funktionen, um das MouseIn/MouseOut-Ereignis abzufangen (diese Ereignisse gibt es leider ebenfalls noch nicht in VB). Ein paar weitere API-Funktionen dienen dann dem automatischen Ausführen bestimmter Aktionen, wie z.B. Webbrowser starten und URL aufrufen oder Standard EMail-Client mit vorgegebener Empfängeradresse aufrufen.
Dieser Workshop soll Ihnen zeigen, wie sich Hyperlinks in Visual Basic realisieren und erstellen lassen. Hierbei sind alle nachfolgenden Routinen sehr universell gehalten und lassen (fast) keine Wünsche mehr offen. Ab sofort können auch Sie Ihre Projekte und Anwendungen mit modernen Hyperlinks ausstatten!
Das Modul basHyperlink.bas
Den nachfolgenden Code bitte in ein Modul einfügen und unter basHyperlink.bas speichern.
' ------------------ Beginn Modul ----------------------- ' zunächst die benötigten API-Deklarationen ' zum Realisieren der MouseIn/MouseOut-Ereignisse Private Declare Function SetCapture Lib "user32.dll" ( _ ByVal hWnd As Long) As Long Private Declare Function ReleaseCapture Lib "user32.dll" () As Long ' Fenster-Handle des Desktops (für ShellExecute) Private Declare Function GetDesktopWindow Lib "user32" () As Long Private Declare Function GetSystemDirectory Lib "kernel32" _ Alias "GetSystemDirectoryA" ( _ ByVal lpBuffer As String, _ ByVal nSize As Long) As Long ' Webbrowser/Mail-Client/Anwendung starten Private Declare Function ShellExecute Lib "shell32.dll" _ Alias "ShellExecuteA" ( _ ByVal hWnd As Long, _ ByVal lpOperation As String, ByVal lpFile As String, _ ByVal lpParameters As String, _ ByVal lpDirectory As String, _ ByVal nShowCmd As Long) As Long ' Dokument öffnen Private Const SE_ERR_NOASSOC = 31 Private Const SE_ERR_NOTFOUND = 2 ' Standard-Textfarbe für Hyperlinks Global Const Link_Normal = &HA56B39 ' Blauton Global Const Link_Hover = &HFF& ' Rot ' ID für das "Hand"-Icon in der Resource-Datei Global Const resHand = 1000 ' ------------------------------------------------ ' Setzt den Text und das Ziel (Aktion) des Hyperlinks Public Sub LinkCreate(Link As TextBox, _ ByVal Text As String, ByVal Aktion As String, _ Optional Container As Variant) With Link .Text = Text .Locked = True .Tag = Aktion .TabStop = False .BorderStyle = 0 If Not IsMissing(Container) Then .BackColor = Container.BackColor End If End With End Sub ' Hyperlink "normal" anzeigen Public Sub LinkDisplay(Link As TextBox, _ Optional ByVal ColorNormal As Variant) With Link If IsMissing(ColorNormal) Then ' wenn keine "gesonderte" Textfarbe angegeben wurde, ' Standard-Textfarbe verwenden .ForeColor = Link_Normal Else ' Übergebene Textfarbe verwenden .ForeColor = ColorNormal End If .Font.Underline = False ' Fehlerbehandlung einschalten, falls das Icon ' in der Resource-Datei nicht gefunden wird On Local Error Resume Next .MouseIcon = LoadResPicture(resHand, 1) .MousePointer = 99 On Local Error GoTo 0 End With End Sub ' Hyperlink: MouseIn/MouseOut (Hover-Effekt) ' Siehe Tipp: HoverEffekt von LonelySuicide Public Sub LinkHover(Link As TextBox, X As Single, _ Y As Single, Optional ByVal ColorNormal As Variant, _ Optional ByVal ColorHover As Variant) With Link ' Befindet sich die Maus über dem Control? If X >= 0 And Y >= 0 And X <= .Width And Y <= .Height Then SetCapture .hWnd If IsMissing(ColorHover) Then .ForeColor = Link_Hover Else .ForeColor = ColorHover End If .Font.Underline = True Else ' wenn nicht, Capture lösen ReleaseCapture If IsMissing(ColorNormal) Then .ForeColor = Link_Normal Else .ForeColor = ColorNormal End If .Font.Underline = False End If End With End Sub ' Klick auf Hyperlink ' Ggf. automatisch Webbrowser starten und URL anzeigen ' oder EMail-Client starten ' oder Anwendung starten Public Sub LinkGo(Link As TextBox, _ Optional ByVal ColorNormal As Variant) Dim URL As String ' Fokus auf das nächste Steuerelement setzen Link.Enabled = False Link.Enabled = True ' Hyperlink wieder normal darstellen LinkHover Link, -1, -1, ColorNormal ' Webbrowser starten und URL anzeigen If Left$(Link.Tag, 7) = "http://" Or _ Left$(Link.Tag, 4) = "www." Then URL = Link.Tag If Left$(URL, 7) <> "http://" Then _ URL = "http://" & URL Call ShellExecute(GetDesktopWindow(), "Open", URL, _ "", "", 3) ' EMail-Client starten ElseIf Left$(Link.Tag, 7) = "mailto:" Then Call ShellExecute(GetDesktopWindow(), "Open", _ Link.Tag, "", "", 1) ' Anwendung starten / Dokument öffnen ' Siehe Tipp: "Öffnen mit..."-Dialog bei Bedarf ' von Heinz Prelle ElseIf Left$(Link.Tag, 4) = "App:" Then DocumentOpen Mid$(Link.Tag, 5) End If End Sub ' Dokument öffnen und ggf. autom. den ' "Öffnen mit..." - Dialog anzeigen ' ' Tipp-Autor: Heinz Prelle '===================================================== Private Sub DocumentOpen(sFilename As String) Dim sDirectory As String Dim lRet As Long Dim DeskWin As Long DeskWin = GetDesktopWindow() lRet = ShellExecute(DeskWin, "open", sFilename, _ vbNullString, vbNullString, vbNormalFocus) If lRet = SE_ERR_NOTFOUND Then ' Datei nicht gefunden ElseIf lRet = SE_ERR_NOASSOC Then ' Wenn die Dateierweiterung noch nicht bekannt ist... 'wird der "Öffnen mit..."-Dialog angezeigt. sDirectory = Space(260) lRet = GetSystemDirectory(sDirectory, Len(sDirectory)) sDirectory = Left(sDirectory, lRet) Call ShellExecute(DeskWin, vbNullString, _ "RUNDLL32.EXE", "shell32.dll,OpenAs_RunDLL " & _ sFilename, sDirectory, vbNormalFocus) End If End Sub ' -------------------- Ende Modul -------------------------
Implementierung in eigene Forms
Und so erstellen Sie Ihren eigenen Hyperlink
Plazieren Sie eine Textbox auf die Form und nennen Sie diese txtHyperlink. Weitere Eigenschaften brauchen Sie nicht zu setzen - den Rest erledigen Sie per Code - oder besser gesagt, die Prozeduren im obigen Modul!
Fügen Sie nachfolgenden Code in das Form_Load-Ereignis der Form ein:
Private Sub Form_Load() ' Hyperlink erstellen LinkCreate txtHyperlink, "vb@rchiv", _ "www.vbarchiv.de", Me LinkDisplay txtHyperlink End Sub
Wird die Form geladen, werden über die beiden Prozeduraufrufe LinkCreate und LinkDisplay alle notwendigen Eigenschaften der Textbox gesetzt. Im obigen Beispiel wird dann der Text vb@rchiv angezeigt und beim Klicken auf den "Hyperlink" wird der Standardbrowser gestartet, sowie die URL www.vbarchiv.de aufgerufen. Der letzte Paramater (Me) gibt das Container-Objekt an, also das Objekt, auf welchem sich die Textbox befindet. Das Container-Objekt wird benötigt, um die Hintergrundfarbe der Textbox automatisch an die des Containers anzupassen. Meist wird es sich hierbei um die Form selbst handeln. Haben Sie die TextBox aber z.B. auf ein Picture-Steuerelement plaziert oder in ein Frame-Steuerelement, und dessen Farbe weicht von der Hintergrundfarbe der Form ab, so müssen Sie dann natürlich für den Parameter Container die PictureBox oder das Frame-Control angeben.
Nun werden noch nachfolgende zwei Prozeduraufrufe benötigt:
' Aktion ausführen Private Sub txtHyperlink_Click() LinkGo txtHyperlink End Sub ' MouseIn/MouseOut (Hover-Effekt) Private Sub txtHyperlink_MouseMove(Button As Integer, _ Shift As Integer, X As Single, Y As Single) LinkHover txtHyperlink, X, Y End Sub
Das war's dann auch schon. Sie sehen, in Verbindung mit den universellen Prozeduren aus dem Modul können dann in den einzelnen Formen Hyperlinks ganz leicht realisiert werden.
Anmerkungen zu den Parametern und Möglichkeiten
Je nachdem, welche Aktion beim Klicken auf den Hyperlink ausgeführt werden soll, sollten Sie folgende Werte für den Parameter Aktion für den Prozeduraufruf LinkCreate verwenden:
- http://www....: Beim Klicken auf den Hyperlink wird automatisch der Standardbrowser geöffnet und die im Parameter Aktion angegebene URL geladen (Beispiel: http://www.vbarchiv.net).
- mailto:...: Beim Klicken auf den Hyperlink wird automatisch das Standard EMail-Programm geöffnet und die Empfängeradresse eingetragen (Beispiel: mailto:info@vbarchiv.de).
- App:... Beim Klicken auf den Hyperlink wird automatisch die angegebene Anwendung gestartet bzw. das angegebene Dokument mit der im System verknüpften Anwendung geöffnet (Beispiel: App:c:\eigene dateien\mein dokument.doc).
Die Standard-Farben für die Darstellung des Hyperlinks werden in den im Modul global definierten Konstanten Link_Normal und Link_Hover festgelegt. Die Prozeduren sind aber so universell gehalten, daß es durchaus möglich ist, für spezielle Hyperlinks andere Farben zu wählen. Hierzu müssen Sie bei den Prozeduraufrufen einfach die entsprechenden Farben mit angeben:
' Spezielle Farben verwenden ' normale Anzeige: GELB LinkDisplay txtHyperlink, vbYellow ' MouseIn/MouseOut (Hover-Effekt) ' normale Anzeige: GELB ' Hover (Maus befindet sich auf dem Hyperlink): ROT LinkHover txtHyperlink, x, y, vbYellow, vbRed
Mauszeiger-Symbol
Sie sollten für Ihre Anwendung eine Ressourcen-Datei erstellen, in der Sie das Symbol für den Mauszeiger einbinden, welches dann angezeigt wird, wenn sich die Maus über dem Hyperlink befindet. Hier eignet sich z.B. eine Hand, wie sie auch im WWW verwendet wird. Die Ressourcen-Kennung (ID) legen Sie in der globalen Konstante resHand im Modul fest.
Wenn Sie bisher noch keine Ressourcen-Datei in Ihr Projekt eingebunden haben, können Sie auch die folgende .RES-Datei laden und über den Befehl Projekt - Datei Hinzufügen in Ihrem Projekt verwenden.
Ein kleines Manko gilt es noch abzustellen
Das einzige Manko, was jetzt noch vorhanden ist, ist, daß die Textbox beim Mausklick den Fokus erhält, und somit der senkrechte Eingabecursor sichtbar werden könnte. Dies wird aber in den seltensten Fällen der Fall sein, da durch das Setzen der .Enabled-Eigenschaft auf False und dann gleich wieder auf True der Fokus zum nächsten Steuerelement "wandert" (siehe Prozedur LinkGo). Sollte die Form jedoch keine weiteren "fokusfähigen" Steuerelemente enthalten, würde der Eingabecursor eben doch sichtbar. Wenn dies der Fall ist, sollte Sie eine zusätzliche PictureBox auf die Form plazieren und diese entweder außerhalb des sichtbaren Form-Bereichs verschieben oder aber so klein machen, daß sie nicht weiter stört und hierbei die BorderStyle-Eigenschaft auf 0 - Kein festlegen.
Viel Spaß mit Ihrer neuen Hyperlink-Funktionalität!
Cu
Dieter