Visual Basic .NET または Visual Basic 2005 でカスタム メニューを作成します。

文書翻訳 文書翻訳
文書番号: 888168 - 対象製品
すべて展開する | すべて折りたたむ

目次

概要

Microsoft Visual Basic .NET の Microsoft Visual Basic 2005 〜 両方ディスカッション カスタム メニューを作成方法についてコード例を示します。

概要

Microsoft Visual Basic .NET でまたは Microsoft Visual Basic 2005 でカスタム メニューを作成する方法について説明します。 プロパティの MainMenu コントロールの項目を追加して、 MainMenu コントロールを継承してカスタム メニューを作成するとします。

MenuItem クラスを拡張します。

MenuItem クラス アイコンを表示する組み込み手段が提供されません。 たとえば、アイコンを表示する設定できる Icon プロパティはありません。 Microsoft .NET Framework クラスから、希望する機能が提供されないと、そのクラスを拡張する独自の機能を提供できます。

MenuItem クラスがオーナー描画メニュー項目を作成することができるように拡張できます。 オーナー描画メニュー項目は、開発者が、画面上での MenuItem クラスの描画を担当ことを示します。

MenuItem クラスを拡張するには、次のクラスの継承構文を使用します。
Public Class MyIconMenu
    Inherits MenuItem
End Class

Font オブジェクトと MenuItem クラスに対するアイコン オブジェクトを宣言します。

MenuItem クラスから継承すると、は、プロパティ、メソッド、およびイベントを継承します。 独自のアイコンを継承している方法の 2 つの動作をオーバーライドして、カスタム クラスの作成できます。 および OnDrawItem メソッドは、 OnMeasureItem メソッドの動作をオーバーライドするとします。 プライベート フィールド、 フォント を保持するカスタム クラス内でも宣言する必要がありますオブジェクト、および アイコン のオブジェクト。 必要とする Font オブジェクトあるので、カスタム クラスにはアイコンのほかにテキストを含めることができます。

開発者、プライベート フィールドを初期化するカスタム クラスを使用する方法が必要な場合は、カスタム クラスのコンストラクターを使用します。 Visual Basic .NET 2003年コンストラクターは 新規作成 と呼ばれる特別なメソッドです。 新規 メソッドは、カスタム クラスがインスタンス化ときに、.NET Framework によって呼び出されます。 Visual Basic .NET 2003年を使用してパラメーターを渡す、コンストラクターをことができます。

Visual Basic .NET 2003年ではメソッドのオーバーロードもサポートしています。 メソッド シグネチャが一意な限り、同じメソッドを多くの場合、定義できます。

コンストラクターとメソッドのオーバーロードを使って、開発者がカスタム クラスのプライベート フィールドを初期化できます。 カスタム クラスのコードようなコード例を次に示します。
Public Class MyIconMenu Inherits MenuItem
       	Private font As Font
        Private icon As Icon

            Sub New(ByVal menuText As String)
                   MyClass.New(menuText, Nothing, Shortcut.None, Nothing)
           	End Sub

            Sub New(ByVal menuText As String, ByVal handler As EventHandler,  ByVal shortcut As Shortcut, ByVal ico As icon)
                MyBase.New(menuText, handler, shortcut)
                Me.icon = ico
                Me.font = New Font("Arial", 8)
                Me.OwnerDraw = True
            End Sub
   End Class
使用した、開発者がある、メニュー項目のアイコンやアイコンなしのメニュー項目のオプションになるよう、コンストラクターのメソッドのオーバーロードを確認します。 アイコンを表示する場合は true 値に、カスタム クラスの OwnerDraw プロパティを設定するもする必要があります。 この手順は、メニューのアイコンは表示されませんこの手順が完了しない場合のために重要となります。

項目をメニューに追加します。

オーバーライドする必要がある 2 つ方法を調べます。 OnMeasureItem メソッドが、メニューが描画されるときに呼び出されます。 OnMeasureItem メソッドを使用して MeasureItemEventArgs コンストラクターの 2 つのプロパティを設定によって、メニューのサイズを指定できます。 設定した MeasureItemEventArgs コンストラクターのプロパティは、 ItemHeight プロパティと ItemWidth プロパティ。 これらの設定は、 OnMeasureItem メソッドにパラメーターとして渡されます。

アイコンの高さに基づいてメニュー項目の高さを決定することがあります。 これは、こともできません常に適切なあります。 通常、メニュー項目のテキストの高さを超えてはいけません、アイコンの高さ。

メニューの幅を決定するには、メニュー項目に表示される文字列の幅が必要です。 StringFormat オブジェクトを使用してこの情報を取得することができます。 このオブジェクトは、 System.Drawing </a0> 名前空間で参照できます。 メニュー項目の幅を測定するときにまた、アイコン、検討する必要があります。

OnMeasureItem メソッドのコードは、次のコード例のようあります。
Protected Overrides Sub OnMeasureItem(ByVal e As MeasureItemEventArgs)
        MyBase.OnMeasureItem(e)
        Dim sf As StringFormat = New StringFormat()

        sf.HotkeyPrefix = HotkeyPrefix.Show
        sf.SetTabStops(50, New Single() {0})

        e.ItemHeight = Me.icon.Height + 6
        e.ItemWidth = CInt(e.Graphics.MeasureString(AppendShortcut(), _ 
                           Me.font, 1000, sf).Width) + Me.icon.Width + 5
        sf.Dispose()
        sf = Nothing
End Sub

メニューを描画します。

メニューのサイズを指定した後カスタム クラスの OnDrawItem メソッドを使用して、メニューを描画する必要があります。 このメソッドは、 DrawItemEventArgs オブジェクトに渡されます。 使用して、 DrawItemEventArgs オブジェクト、メニューの [アイテムの グラフィック オブジェクトを取得します。 これは、操作により強力な GDI + 機能により、.NET Framework で使用できる、メニューの画面上に直接描画できます。 まず、背景色を描画します。 アイコンを描画します。 最後に、メニュー項目のテキストを描画します。

メニューのコードは、次のコード例のようで可能性があります。
Protected Overrides Sub OnDrawItem(ByVal e As DrawItemEventArgs)
   Dim br As Brush
   Dim sf As StringFormat

   MyBase.OnDrawItem(e)
   e.Graphics.FillRectangle(SystemBrushes.Control, e.Bounds)
   If Not (Me.icon Is Nothing) Then
      e.Graphics.DrawIcon(Me.icon, e.Bounds.Left + 3, e.Bounds.Top + 3)
   End If

   sf = New StringFormat()
   sf.HotkeyPrefix = HotkeyPrefix.Show
   sf.SetTabStops(50, New Single() {0})
   br = New SolidBrush(SystemColors.WindowText)
   e.Graphics.DrawString(AppendShortcut(), Me.font, br, e.Bounds.Left + _ 
                         Me.icon.Width + 10, e.Bounds.Top + 2, sf)
   'Clean up resources.
   br.Dispose()
   br = Nothing
   sf.Dispose()
   sf = Nothing
End Sub

キーボードのショートカット メニュー項目を作成します。

コード例では、 AppendShortcut 関数は、 OnMeasureItem メソッドと、 OnDrawItem メソッドの両方で呼び出されます。 測定してメニュー項目の Text プロパティに基づいて、文字列を描画します。 ただし、これは考慮しませんという事実は、メニュー項目のショートカットをある可能性があります。 メニュー項目がショートカット キーを持って場合、キーボード ショートカットを表示] メニューの [項目の幅を広くしてください。 文字列として、キーボード ショートカットを表す必要があります。 AppendShortcut 関数は、キーボード ショートカットを文字列としてを表し、既存のメニュー項目のテキストに、ショートカット文字列を追加します。

AppendShortcut 関数のコードは、次のコード例のようで可能性があります。
Private Function AppendShortcut() As String
   Dim s As String
   s = Me.Text
   ' Check to see if we have a shortcut.
   ' If so, append it to our existing text.  
   If Me.ShowShortcut And Me.Shortcut <> Shortcut.None Then
      Dim k As Keys = CType(Shortcut, Keys)
      s = s & Convert.ToChar(9) & _ 
             TypeDescriptor.GetConverter(GetType(Keys)).ConvertToString(k)
      End If
   Return s
End Function

メニュー項目を強調表示します。

基本的なアイコン] メニューの [項目を作成した後、メニュー項目を強調表示がオンになっているとする可能性があります。 枠線を描画し、 OnDrawItem メソッドでテキストを選択してください。

コード例

次のコード例は、カスタム クラスの完全なコードです。 このコード例には、メニュー項目を強調表示するコードが含まれます。
' Form1.vb
Public Class Form1
    Inherits System.Windows.Forms.Form

#Region " Windows Form Designer generated code "

    Public Sub New()

        MyBase.New()

        'This call is required by the Windows Form Designer.

        InitializeComponent()

        'Add any initialization after the InitializeComponent() call.

    End Sub

 

    'Form overrides dispose to clean up the component list.

    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)

        If disposing Then

            If Not (components Is Nothing) Then

                components.Dispose()

            End If

        End If

        MyBase.Dispose(disposing)

    End Sub

 

    'Required by the Windows Form Designer.

    Private components As System.ComponentModel.IContainer

 

    'Note The following procedure is required by the Windows Form Designer.

    'It can be modified by using the Windows Form Designer.  

    'Do not modify it by using the code editor.

    Friend WithEvents MainMenu1 As System.Windows.Forms.MainMenu

    Friend WithEvents MenuItem1 As System.Windows.Forms.MenuItem

    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

        Me.MainMenu1 = New System.Windows.Forms.MainMenu

        Me.MenuItem1 = New System.Windows.Forms.MenuItem

    

        Me.MainMenu1.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {Me.MenuItem1})

        Me.MenuItem1.Index = 0

        Me.MenuItem1.Text = ""

       

        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)

        Me.ClientSize = New System.Drawing.Size(292, 273)

        Me.Menu = Me.MainMenu1

        Me.Name = "Form1"

        Me.Text = "Form1"

 

    End Sub

 

#End Region

 

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        'Loading the MyIconMenu onto the first menu in MainMenu1.

        Dim ico As Icon = New Icon("c:\GSA.ico")

        Dim fm As MyIconMenu = New MyIconMenu("Testing", Nothing, Shortcut.None, ico)

        MainMenu1.MenuItems(0).MenuItems.Add(fm)

    End Sub

 

End Class




' MyIconMenu.vb

Imports System

Imports System.ComponentModel

Imports System.Drawing

Imports System.Drawing.Drawing2D

Imports System.Drawing.Text

Imports System.Windows.Forms

 

Public Class MyIconMenu

    Inherits MenuItem

 

    Private font As font

    Private icon As icon

 

    'Set properties for border highlighting.

    Private borderWidth As Integer = 1

    Private borderColor As Color = Color.DarkBlue

 

 

    Sub New(ByVal menuText As String, ByVal handler As EventHandler, _

            ByVal shortcut As Shortcut, ByVal ico As icon)

 

        MyBase.New(menuText, handler, shortcut)

        Me.icon = ico

        Me.font = New Font("Arial", 8)

        Me.OwnerDraw = True

 

    End Sub

 

    Public Overloads Sub Dispose()

 

        Me.font.Dispose()

        Me.font = Nothing

        Me.icon.Dispose()

        Me.icon = Nothing

        MyBase.Dispose()

 

    End Sub

 

    Protected Overrides Sub OnMeasureItem(ByVal e As MeasureItemEventArgs)

 

        MyBase.OnMeasureItem(e)

        Dim sf As StringFormat = New StringFormat

 

        sf.HotkeyPrefix = HotkeyPrefix.Show

        sf.SetTabStops(50, New Single() {0})

 

        e.ItemHeight = Me.icon.Height + 6

        e.ItemWidth = CInt(e.Graphics.MeasureString(AppendShortcut(), _

                           Me.font, 1000, sf).Width) + Me.icon.Width + 5

 

        sf.Dispose()

        sf = Nothing

 

    End Sub

 

    Protected Overrides Sub OnDrawItem(ByVal e As DrawItemEventArgs)

 

        Dim br As Brush

        Dim sf As StringFormat

 

        MyBase.OnDrawItem(e)

 

        If CBool(e.State And DrawItemState.Selected) Then

            'Draw a border to highlight the menu.

            e.Graphics.FillRectangle(SystemBrushes.HighlightText, _

                                     e.Bounds)

 

            ControlPaint.DrawBorder(e.Graphics, e.Bounds, _

                                    Me.borderColor, Me.borderWidth, _

                                    ButtonBorderStyle.Solid, _

                                    Me.borderColor, Me.borderWidth, _

                                    ButtonBorderStyle.Solid, _

                                    Me.borderColor, Me.borderWidth, _

                                    ButtonBorderStyle.Solid, _

                                    Me.borderColor, Me.borderWidth, _

                                    ButtonBorderStyle.Solid)

 

        Else

            e.Graphics.FillRectangle(SystemBrushes.Control, e.Bounds)

        End If

 

        If Not (Me.icon Is Nothing) Then

            e.Graphics.DrawIcon(Me.icon, e.Bounds.Left + 3, _

                                e.Bounds.Top + 3)

        End If

 

        sf = New StringFormat

        sf.HotkeyPrefix = HotkeyPrefix.Show

        sf.SetTabStops(50, New Single() {0})

        br = New SolidBrush(SystemColors.WindowText)

        e.Graphics.DrawString(AppendShortcut(), Me.font, br, _

                              e.Bounds.Left + Me.icon.Width + 10, _

                              e.Bounds.Top + 2, sf)

 

        'Clean up resources.

        br.Dispose()

        br = Nothing

        sf.Dispose()

        sf = Nothing

 

    End Sub

 

    Private Function AppendShortcut() As String

 

        Dim s As String

        s = Me.Text

 

        ' Check to see if we have a shortcut.

        ' If so, append it to our existing text.  

        If Me.ShowShortcut And Me.Shortcut <> Shortcut.None Then

            ' Use TypeDescriptor to get a string representation of a

            ' Shortcut class.

             Dim k As Keys = CType(Shortcut, Keys)

 

            s = s & Convert.ToChar(9) & _

            TypeDescriptor.GetConverter(GetType(Keys)).ConvertToString(k)

        End If

        Return s

    End Function

 

End Class
メモ Visual Basic 2005 でコードを変更する必要があります。 既定で Visual Basic は、Windows フォーム プロジェクトを作成すると、プロジェクトの 2 つのファイルを作成します。 フォーム Form1 という名前は、場合、フォームを表す 2 つのファイル、Form1.vb と Form1.Designer.vb の名前です。 Form1.vb ファイルにコードを記述するとします。 Windows フォーム デザイナーは、Form1.Designer.vb ファイルにコードを記述します。 Windows フォーム デザイナーでは、部分的なキーワードを使用して Form1 の実装を別々 のファイルに分割をします。 この現象、デザイナーで生成されたコードがコードに散在していてできなくなります。

Visual Basic 2005 の新しい言語拡張機能の詳細については、ご覧次マイクロソフト開発者向けネットワーク (MSDN) 下さい。
http://msdn2.microsoft.com/en-us/library/ms379584(vs.80).aspx
部分クラスと、Windows フォーム デザイナーの詳細についてには次 MSDN Web サイトを参照してください。
http://msdn2.microsoft.com/en-us/library/ms171843.aspx

プロパティ

文書番号: 888168 - 最終更新日: 2007年5月11日 - リビジョン: 2.5
この資料は以下の製品について記述したものです。
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
キーワード:?
kbhowto kbhowtomaster kbmacroexample kbprogramming kbexpertiseinter kbvs2005applies kbvs2005swept kbmt KB888168 KbMtja
機械翻訳の免責
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:888168
Microsoft Knowledge Base の免責: Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com