LinkLabel 使ったことないけど、結構遊べる!という事に気がつきました。
なんだかんだで 2 時間くらい遊んでしまいました。
Label を継承しているので、Label で出来ることは一通り出来ます。
もちろんニーモニックキーもね。
おまけで、DataGridView の DataGridViewLinkColumn でも遊んでみました。
なんだか似てるような似てないような...。
■参考文献
LinkLabel コントロール (Windows フォーム)
LinkLabel クラス
LinkLabel.Link クラス
■実行画像
無効なリンクにカーソルを合わせたところ
Public Class LinkLabelTest
Private Const SITE_NAME As String = "主婦と .NET と犬の記録"
Private Const SITE_URL As String = "http://naoko.wankuma.com/"
Private Const BLOG_NAME As String = "主婦と .NET と犬のぶろぐ"
Private Const BLOG_URL As String = "http://blogs.wankuma.com/naoko/"
Private Const DISABLE_LINK As String = "無効なリンク"
Private Sub LinkLabelTest_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'' 外観をいじる
With Me.LinkLabel1
.BackColor = SystemColors.Window
.Font = New Font(.Font.FontFamily, _
12.0F, _
.Font.Style, _
.Font.Unit)
' クリックされている最中のリンクを表示するときの色
.ActiveLinkColor = Color.Orange
' 通常のリンクを表示するときに使用する色
.LinkColor = Color.SeaGreen
' 以前にリンク先に移動したことのあるリンクを表示するときに使用する色
.VisitedLinkColor = Color.DarkBlue
' GDI ではなく GDI+ を使うか否か(既定値:False)
.UseCompatibleTextRendering = True
' 先頭 3 文字だけリンクとして表示する
.LinkArea = New LinkArea(0, 3)
' クリックした時の動作を設定する
AddHandler .LinkClicked, AddressOf LinkLabel1_LinkClicked
End With
' LinkBehavior
With Me.ComboBox1
.DropDownStyle = ComboBoxStyle.DropDownList
With .Items
.Add(LinkBehavior.AlwaysUnderline)
.Add(LinkBehavior.HoverUnderline)
.Add(LinkBehavior.NeverUnderline)
.Add(LinkBehavior.SystemDefault)
End With
.SelectedItem = Me.LinkLabel1.LinkBehavior
AddHandler .SelectedIndexChanged, AddressOf LinkBehaviorChange
End With
'' 無効なリンク
With Me.LinkLabel2
.Text = "これは " & DISABLE_LINK & " です。"
' 無効なリンクを表示するときに使用する色
.DisabledLinkColor = Color.Chocolate
.Links.Clear()
' 無効なリンク を追加する
.Links.Add(New LinkLabel.Link(.Text.IndexOf(DISABLE_LINK), _
DISABLE_LINK.Length))
.Links(0).Name = DISABLE_LINK
' Name プロパティに値が入っていれば、名前で Item が取れる
Dim disabledLink As LinkLabel.Link = .Links(DISABLE_LINK)
' 説明文を設定する
disabledLink.Description = "無効なリンクの説明文"
' 無効なリンク にする
disabledLink.Enabled = False
' MouseEnter 時に ステータスバーに文字を表示する
AddHandler .MouseEnter, AddressOf Me.LinkLabel2_MouseEnter
AddHandler .MouseLeave, AddressOf Me.LinkLabel2_MouseLeave
End With
Me.ToolStripStatusLabel1.Text = String.Empty
'' 複数のリンクを設定する
With Me.LinkLabel3
.Text = SITE_NAME & " ですよ。" & ControlChars.NewLine & _
"ぶろぐは " & BLOG_NAME & " ですよ。"
' リンクとして表示される箇所を設定する
.LinkArea = New LinkArea()
' リンクの追加
.Links.Clear()
' 静的サイトの方のリンクを追加する
.Links.Add(New LinkLabel.Link(.Text.IndexOf(SITE_NAME), _
SITE_NAME.Length, _
SITE_URL))
' ぶろぐの方のリンクを追加する
.Links.Add(New LinkLabel.Link(.Text.IndexOf(BLOG_NAME), _
BLOG_NAME.Length, _
BLOG_URL))
' クリックした時の動作を設定する
AddHandler .LinkClicked, AddressOf LinkLabel3_LinkClicked
End With
' おまけ DataGridView の DataGridViewLinkColumn
With Me.DataGridView1
.Columns.Clear()
Dim linkCol As DataGridViewLinkColumn = New DataGridViewLinkColumn()
.Columns.Add(linkCol)
Dim index As Integer = .Rows.Add()
Dim cell As DataGridViewLinkCell = New DataGridViewLinkCell()
cell.LinkColor = Color.Green
cell.Value = "リンクの冒険"
cell.Tag = "http://www.nintendo.co.jp/wii/vc/vc_lb/"
.Rows(index).Cells(0) = cell
.ReadOnly = True
.AllowUserToAddRows = False
' DataGridView 列幅の自動調整
.AutoResizeColumns(System.Windows.Forms.DataGridViewAutoSizeColumnsMode.AllCells)
AddHandler .CellClick, AddressOf DataGridView1_CellClick
End With
End Sub
Private Sub LinkBehaviorChange(ByVal sender As Object, ByVal e As System.EventArgs)
Me.LinkLabel1.LinkBehavior = DirectCast(DirectCast(sender, ComboBox).SelectedItem, LinkBehavior)
End Sub
Private Sub LinkLabel1_LinkClicked(ByVal sender As Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs)
If Windows.Forms.MouseButtons.Left <> e.Button Then Return
' ファイルを開く
System.Diagnostics.Process.Start("D:\わんくま\ふじこの毛について.txt")
Dim lLabel As LinkLabel = DirectCast(sender, LinkLabel)
' 訪問済みにする
lLabel.LinkVisited = True
End Sub
Private Sub LinkLabel3_LinkClicked(ByVal sender As Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs)
If Windows.Forms.MouseButtons.Left <> e.Button Then Return
Dim linkInfo As LinkLabel.Link = e.Link
System.Diagnostics.Process.Start(Convert.ToString(linkInfo.LinkData))
' 訪問済みにする
linkInfo.Visited = True
End Sub
Private Sub LinkLabel2_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs)
Dim lLabel As LinkLabel = DirectCast(sender, LinkLabel)
' ToolStripStatusLabel1 に Description を表示
Me.ToolStripStatusLabel1.Text = lLabel.Links(0).Description
' カーソルを変えてみる
Me.Cursor = Cursors.SizeAll
End Sub
Private Sub LinkLabel2_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs)
Me.ToolStripStatusLabel1.Text = String.Empty
Me.Cursor = Cursors.Default
End Sub
Private Sub DataGridView1_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs)
If e.ColumnIndex < 0 OrElse e.RowIndex < 0 Then Return
Dim dataGridV As DataGridView = DirectCast(sender, DataGridView)
Dim cell As DataGridViewCell = DirectCast(dataGridV(e.ColumnIndex, e.RowIndex), DataGridViewCell)
If TypeOf (cell) Is DataGridViewLinkCell Then
Dim text As String = Convert.ToString(cell.Value)
Dim url As String = Convert.ToString(cell.Tag)
' ブラウザを開く場合
System.Diagnostics.Process.Start(url)
' 画面を開く場合
'Dim f As Form = New Form()
'f.Text = text
'f.ShowDialog(Me)
End If
End Sub
End Class