■ メインメニュー

VB6 でメインメニューを作成するときは メニューエディタというツールを使用していましたが VB.NET では ツールボックスから
MainMenu をフォーム上に配置またはダブルクリックで選択します



以前の VB6 までなら コントロールなどは必ずフォーム上に配置されていましたが VB.NET では MainMenu をはじめ Timer
ToolTip など実体のないものは フォーム下の専用領域に配置されます



メニューに表示する値 (Text プロパティ) は画面から直接入力できるようになりましたが VB6 と同じく & の次の 1文字が下線つき
で表示されたり - にするとメニューの区切りになります
基本的な仕様はそのままですが メニューを作成するときの使い勝手がかなりよくなりました

さらに Windows API を使用しなくても 下図のようなメニューにアイコンを表示することが可能になりました



ちょっと面倒かも知れませんが 以下の作業で実現できます

@ フォームに ImageList を配置します (ここでは デフォルトの名前 ImageList1 にしました)

A ImageList にメニューに表示する 16×16 のサイズの画像を追加します (画像の背景色は透明にしておきます)



B アイコンを表示するメニューアイテムの OunerDraw プロパティを True にします
 今の状態で実行すると アイコン表示したいメニューが表示されなくなると思います
 OunerDraw プロパティを True にすることで そのコントロールを自分で描画することができるようになります

C ソースの記述を行います
 今回は同一メニュー階層のアイコン表示のみであるため ImageList のインデックスと DrawItemEventArgs のインデックスが
 一致するので アイコン描画時の イメージの指定が e.Index で実現できています

'' メニュー項目の高さと幅を設定します
Private Sub mnuOwnerDraw_MeasureItem(ByVal sender As System.Object, _
        ByVal e As System.Windows.Forms.MeasureItemEventArgs) _
        Handles mnuOpen.MeasureItem, mnuSave.MeasureItem

    Dim st_buff As String = DirectCast(sender, MenuItem).Text.Replace("&", "")
    Dim si_len As Integer = e.Graphics.MeasureString(st_buff, DefaultFont).Width

    e.ItemHeight = 18
    e.ItemWidth = 18 + si_len

End Sub

'' メニューを描画します
Private Sub mnuOwnerDraw_DrawItem(ByVal sender As System.Object, _
        ByVal e As System.Windows.Forms.DrawItemEventArgs) _
        Handles mnuOpen.DrawItem, mnuSave.DrawItem

    Dim o_brush As Brush
    Dim o_strfmt As New StringFormat

    '' メニュー項目が選択中の場合
    If (e.State And DrawItemState.Selected) = DrawItemState.Selected Then
        o_brush = New SolidBrush(SystemColors.HighlightText)
        e.Graphics.FillRectangle(New SolidBrush(SystemColors.Highlight), e.Bounds)
    Else
        o_brush = New SolidBrush(SystemColors.MenuText)
        e.Graphics.FillRectangle(New SolidBrush(SystemColors.Menu), e.Bounds)
    End If
    o_strfmt.HotkeyPrefix = System.Drawing.Text.HotkeyPrefix.Show
    e.Graphics.DrawString(DirectCast(sender, MenuItem).Text, DefaultFont, _
        o_brush, e.Bounds.X + 20, e.Bounds.Y + 2, o_strfmt)
    ImageList1.Draw(e.Graphics, e.Bounds.X + 1, e.Bounds.Y + 1, e.Index)
    o_brush.Dispose()
    o_strfmt.Dispose()

End Sub