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