|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Visual Basic Intrinsic Control
Routines ShellExecute: Simulate a Hyperlink with a Label Control |
||
Posted: | Friday February 18, 2000 | |
Updated: | Monday December 26, 2011 | |
Applies to: | VB4-32, VB5, VB6 | |
Developed with: | VB6, Windows NT4 | |
OS restrictions: | None | |
Author: | Matt Sargent, VBnet - Randy Birch | |
Related: |
Determining
the Name of the Executable Associated with a Specific File ShellExecute: ShellExecute Madness CreateProcess: Start Separate Instances of the Default Browser ShellExecute: Send Large Emails in Outlook Express |
|
Prerequisites |
None. |
|
By
using a standard Label control, along side a picturebox and a couple of APIs, it is an easy step to simulate a typical hyperlink within a
form. Typically this feature might be used to provide email or support via your application's About dialog.
The code here is based on a newsgroup post by Matt Sargent. The key to this method's success in placement of the label inside a picturebox. In Matt's technique, because the VB label control does not expose a hwnd, Matt used a picturebox, sized to the label, to detect the rodent's cursor position in relation to the label it contained. When the API detected that the rodent had moved off link label, a timer, started when the link became 'active', reset the label's default properties. This mechanism gives the visual clue that the label will react as a HTML hyperlink would. In addition, code in the label's MouseDown and MouseUp events further toggle the hyperlink colour indicating the link was pressed. The second illustration shows the layout positioning of the label within the picturebox. The only important positions are the initial left and top properties of the picturebox. Given these anchors, both the label and picturebox are resized in code to fit the link.
|
BAS Module Code |
None. |
|
Form Code |
On a new form, add a timer (Timer1), and a textbox (Text1).
Add a picturebox (Picture1) and set its BorderStyle to None. The illustration above shows the initial size of the pixbox (gold) ... its final
size is established in code.
Once the pixbox has been set up, draw into it a label control (Label1). Set the label's AutoSize to True, its MousePointer property to 99 - Custom, and set its MouseIcon property to the finger cursor in this zip. Change the three colour constants as desired in the general Declarations, and with these initial steps complete, add the following to the form: |
|
Option Explicit '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Copyright ©1996-2011 VBnet/Randy Birch, All Rights Reserved. ' Some pages may also contain other copyrights by the author. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Distribution: You can freely use this code in your own ' applications, but you may not reproduce ' or publish this code on any web site, ' online service, or distribute as source ' on any media without express permission. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Private Const clrLinkActive = vbBlue Private Const clrLinkHot = vbRed Private Const clrLinkInactive = vbBlack Private Const SW_SHOWNORMAL As Long = 1 Private Const SW_SHOWMAXIMIZED As Long = 3 Private Const SW_SHOWDEFAULT As Long = 10 Private Type POINTAPI x As Long y As Long End Type Private Declare Function GetCursorPos Lib "user32" _ (lpPoint As POINTAPI) As Long Private Declare Function ScreenToClient Lib "user32" _ (ByVal hwnd As Long, _ lpPoint As POINTAPI) As Long Private Declare Function GetDesktopWindow Lib "user32" () As Long Private Declare Function ShellExecute Lib "shell32" _ 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 Private Sub Form_Load() Text1.Text = "http://vbnet.mvps.org/" 'position the label within the pixbox 'and resize the pixbox to the label size With Label1 .Move 0, 0 .ForeColor = clrLinkInactive Picture1.Move Picture1.Left, _ Picture1.Top, _ .Width, .Height End With End Sub Private Sub Text1_Change() 'reflect changes to the textbox Label1.Caption = Text1.Text 'because the label is set to AutoSize, 'the effective area of the picturebox 'needs to be changed as well Picture1.Move Picture1.Left, _ Picture1.Top, _ Label1.Width, _ Label1.Height End Sub Private Sub Text1_GotFocus() Dim pos As String 'if the textbox has the URL double 'slashes, select only the text after 'them for editing convenience pos = InStr(Text1.Text, "//") If pos Then With Text1 .SelStart = pos + 1 .SelLength = Len(.Text) End With End If End Sub Private Sub Timer1_Timer() Dim pt As POINTAPI Dim x As Long Dim y As Long 'determine if the cursor is still over 'the pixbox containing the link label With Picture1 GetCursorPos pt ScreenToClient .hwnd, pt x = pt.x * Screen.TwipsPerPixelX y = pt.y * Screen.TwipsPerPixelY If (x < 0) Or (x > .Width) Or _ (y < 0) Or (y > .Height) Then 'the cursor has moved outside, so 'reset the label appearance Label1.ForeColor = clrLinkInactive Label1.Font.Underline = False 'and disable the timer Timer1.Enabled = False End If End With End Sub Private Sub Label1_Click() Dim sURL As String 'open the URL using the default browser sURL = Label1.Caption Call RunShellExecute("open", sURL, 0&, 0&, SW_SHOWNORMAL) End Sub Private Sub Label1_MouseDown(Button As Integer, _ Shift As Integer, _ x As Single, y As Single) 'when the label is clicked, change 'the colour to indicate it is hot With Label1 If .ForeColor = clrLinkActive Then .ForeColor = clrLinkHot .Refresh End If End With End Sub Private Sub Label1_MouseUp(Button As Integer, _ Shift As Integer, _ x As Single, y As Single) 'mouse released, so restore the label 'to clrLinkActive With Label1 If .ForeColor = clrLinkHot Then .ForeColor = clrLinkActive .Refresh End If End With End Sub Private Sub Label1_MouseMove(Button As Integer, _ Shift As Integer, _ x As Single, y As Single) 'if not already highlighted, set the 'label colour and start the timer to 'poll for the mouse cursor position With Label1 If .ForeColor = clrLinkInactive Then .ForeColor = clrLinkActive .Font.Underline = True Timer1.Interval = 100 Timer1.Enabled = True End If End With End Sub Private Sub RunShellExecute(sTopic As String, sFile As Variant, _ sParams As Variant, sDirectory As Variant, _ nShowCmd As Long) 'execute the passed operation, passing 'the desktop as the window to receive 'any error messages Call ShellExecute(GetDesktopWindow(), _ sTopic, _ sFile, _ sParams, _ sDirectory, _ nShowCmd) End Sub |
Comments |
This method is easily extended to send email as well, again using ShellExecute with the "mailto:" topic. |
|
|
|
|||||
|
|||||
|
|||||
Copyright ©1996-2011 VBnet and Randy Birch. All Rights Reserved. |