Top Index
Yahooは検索方式が変わったせいか、うまくサイト内検索できないなぁ。つーわけでグーグルに変更。
![]() ![]() ![]() |
| 001 | Imports System.Windows.Forms | |
| 002 | Imports System.IO | |
| 003 | ||
| 004 | Public Class FileContextMenuStrip | |
| 005 | Inherits ContextMenuStrip | |
| 006 | ||
| 007 | Public Event ToolStripMenuItemClick(ByVal sender As Object, ByVal e As System.EventArgs) | |
| 008 | ||
| 009 | Private _RootDirectory As String | |
| 010 | Private WithEvents MenuItem As ToolStripMenuItem | |
| 011 | ||
| 012 | Public Sub New() | |
| 013 | Me.MenuItem = New ToolStripMenuItem | |
| 014 | End Sub | |
| 015 | ||
| 016 | '基点となるディレクトリ情報。 | |
| 017 | '"C:\"、"C:\Documents and Settings"のような値を設定する | |
| 018 | Public Property RootDirectory() As String | |
| 019 | Get | |
| 020 | Return _RootDirectory | |
| 021 | End Get | |
| 022 | Set(ByVal value As String) | |
| 023 | _RootDirectory = value | |
| 024 | End Set | |
| 025 | End Property | |
| 026 | ||
| 027 | 'コンテキストメニュー展開前 | |
| 028 | 'RootDirectoryを元にアイテムの初期化処理 | |
| 029 | Private Sub FileContextMenuStrip_Opening(ByVal sender As Object, _ | |
| 030 | ByVal e As System.ComponentModel.CancelEventArgs) Handles Me.Opening | |
| 031 | ||
| 032 | Me.Items.Clear() | |
| 033 | If Me.RootDirectory = "" Then Exit Sub | |
| 034 | ||
| 035 | Me.Cursor = Cursors.WaitCursor | |
| 036 | ||
| 037 | Dim em As IEnumerator = Me.GetItemArray(Me.RootDirectory).GetEnumerator | |
| 038 | Do While em.MoveNext | |
| 039 | Dim s As String = DirectCast(em.Current, String) | |
| 040 | ||
| 041 | Me.MenuItem = Me.CreateMenuItem(s) | |
| 042 | ||
| 043 | Me.Items.Add(Me.MenuItem) | |
| 044 | ||
| 045 | AddHandler MenuItem.MouseHover, AddressOf MenuItem_MouseHover | |
| 046 | AddHandler MenuItem.Click, AddressOf MenuItem_Click | |
| 047 | Loop | |
| 048 | ||
| 049 | Me.Cursor = Cursors.Default | |
| 050 | e.Cancel = False | |
| 051 | End Sub | |
| 052 | ||
| 053 | 'アイテムがフォルダである場合のみ呼び出されるイベント | |
| 054 | 'フォルダ内をスキャンし、ドロップダウンアイテムを検索する | |
| 055 | Private Sub MenuItem_MouseHover(ByVal sender As Object, ByVal e As System.EventArgs) | |
| 056 | ||
| 057 | Dim MItem As ToolStripMenuItem = DirectCast(sender, ToolStripMenuItem) | |
| 058 | If MItem.DropDownItems.Count = 0 Then Exit Sub | |
| 059 | ||
| 060 | Me.Cursor = Cursors.WaitCursor | |
| 061 | ||
| 062 | '初期化 | |
| 063 | MItem.DropDownItems.Clear() | |
| 064 | ||
| 065 | 'アイテム配列を取得し、アイテムとして追加する | |
| 066 | Dim em As IEnumerator = Me.GetItemArray(MItem.Name).GetEnumerator | |
| 067 | Do While em.MoveNext | |
| 068 | Dim s As String = DirectCast(em.Current, String) | |
| 069 | ||
| 070 | Me.MenuItem = Me.CreateMenuItem(s) | |
| 071 | ||
| 072 | MItem.DropDownItems.Add(Me.MenuItem) | |
| 073 | ||
| 074 | AddHandler MenuItem.MouseHover, AddressOf MenuItem_MouseHover | |
| 075 | AddHandler MenuItem.Click, AddressOf MenuItem_Click | |
| 076 | Loop | |
| 077 | ||
| 078 | Me.Cursor = Cursors.Default | |
| 079 | ||
| 080 | Me.Refresh() | |
| 081 | End Sub | |
| 082 | ||
| 083 | 'アイテム情報の配列。 | |
| 084 | 'ここを書き換えれば、任意のショートカット集も作成可能 のはず | |
| 085 | Friend Overridable Function GetItemArray(ByVal Path) As ArrayList | |
| 086 | Dim ary As New ArrayList | |
| 087 | ||
| 088 | Try | |
| 089 | 'ディレクトリ追加 | |
| 090 | Dim em As IEnumerator | |
| 091 | em = Directory.GetDirectories(Path).GetEnumerator | |
| 092 | Do While em.MoveNext | |
| 093 | ary.Add(DirectCast(em.Current, String)) | |
| 094 | Loop | |
| 095 | ||
| 096 | 'ファイル追加 | |
| 097 | em = Directory.GetFiles(Path).GetEnumerator | |
| 098 | Do While em.MoveNext | |
| 099 | ary.Add(DirectCast(em.Current, String)) | |
| 100 | Loop | |
| 101 | Catch ex As Exception | |
| 102 | 'アクセス権限がない場合、トラップしておく | |
| 103 | End Try | |
| 104 | ||
| 105 | Return ary | |
| 106 | End Function | |
| 107 | ||
| 108 | 'ToolStripMenuItemを作成する | |
| 109 | Private Function CreateMenuItem(ByVal Path As String) As ToolStripMenuItem | |
| 110 | Dim MItem As New ToolStripMenuItem | |
| 111 | Dim hIcon As System.IntPtr | |
| 112 | ||
| 113 | If Directory.Exists(Path) Then | |
| 114 | MItem.Text = Me.LastDirectryName(Path) | |
| 115 | MItem.DropDownItems.Add("") 'ダミー | |
| 116 | ElseIf File.Exists(Path) Then | |
| 117 | MItem.Text = IO.Path.GetFileName(Path) | |
| 118 | End If | |
| 119 | MItem.Name = Path | |
| 120 | ||
| 121 | Return MItem | |
| 122 | End Function | |
| 123 | ||
| 124 | 'MenuItemクリックのイベントを発生させ、実ロジックの実装を切り離す | |
| 125 | Private Sub MenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) | |
| 126 | RaiseEvent ToolStripMenuItemClick(sender, e) | |
| 127 | End Sub | |
| 128 | ||
| 129 | Private Function LastDirectryName(ByVal Path As String) As String | |
| 130 | Dim c As Char = IO.Path.DirectorySeparatorChar | |
| 131 | Dim Folders() As String = Split(Path, c) | |
| 132 | Return Folders(UBound(Folders)) | |
| 133 | End Function | |
| 134 | End Class |
@IT 実行ファイルからアプリケーションのアイコンを取得するには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/280getappicon/getappicon.htm