メニューにアイコンを設定

メニューバーに Icon を設定します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. メニューを設定する を参照してメニューを設定して下さい。
  2. ファイル/終了メニューにアイコンを設定します。
    アイコンを描画するには OwnerDraw を true に設定して、メニューの描画関数を自前で作成します。
    MenuItem1_MeasureItem がメニューのサイズを設定するメソッドで、MenuItem1_DrawItem が描画するメソッドです。
        // ファイル/終了メニューを生成
        MenuItem item = menu.MenuItems.Add("ファイル(&F)");
        MenuItem MenuItem1 = new MenuItem("終了(&X)", new EventHandler(this.FileExit), Shortcut.CtrlQ);
        MenuItem1.OwnerDraw = true;
        MenuItem1.MeasureItem += MenuItem1_MeasureItem;
        MenuItem1.DrawItem += MenuItem1_DrawItem;
        item.MenuItems.Add(MenuItem1);
        
  3. MenuItem1_MeasureItem(メジャーアイテム)メソッドでは、メニューアイテムの大きさを計算して設定します。
    アイコンのサイズは 16*16 で計算しています。
    詳細はソースコードを参照して下さい。
  4. MenuItem1_DrawItem では、メニューアイテムを描画します。
    事前にアイコン画像を用意して下さい。
    Icon newIcon = new Icon("c:\\data\\test\\Icons.ico");
    Icons.ico がアイコン画像で、横縦共に16ドットの有り合せのものを使いました。
    詳細はソースコードを参照して下さい。
  5. CLI の環境で実行可能な完成したプログラムです。
    /*********************************************/
    /*★ メニューに Icon を設定する    前田 稔 ★*/
    /*********************************************/
    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    public class MyForm : Form
    {
        Icon newIcon = new Icon("c:\\data\\test\\Icons.ico");
    
        public MyForm()
        {
            Text = "Icon を設定";
    
            // メインメニューを生成
            MainMenu menu = new MainMenu();
    
            // ファイル(終了)メニューを生成
            MenuItem item = menu.MenuItems.Add("ファイル(&F)");
            //item.MenuItems.Add(new MenuItem("終了(&X)", new EventHandler(this.FileExit), Shortcut.CtrlQ));
            MenuItem MenuItem1 = new MenuItem("終了(&X)", new EventHandler(this.FileExit), Shortcut.CtrlQ);
            MenuItem1.OwnerDraw = true;
            MenuItem1.MeasureItem += MenuItem1_MeasureItem;
            MenuItem1.DrawItem += MenuItem1_DrawItem;
            item.MenuItems.Add(MenuItem1);
    
            // ヘルプメニューを生成
            item = menu.MenuItems.Add("ヘルプ(&H)");
            item.MenuItems.Add(new MenuItem("バージョン情報(&A)...", new EventHandler(this.HelpAbout)));
            //MenuItem MenuItem2 = new MenuItem("バージョン情報(&A)...", new EventHandler(this.HelpAbout));
            //item.MenuItems.Add(MenuItem2);
    
            // フォームのメニューとしてセット
            this.Menu = menu;
        }
    
        private void MenuItem1_MeasureItem(object sender, System.Windows.Forms.MeasureItemEventArgs e)
        {
            //メニューアイテムの大きさを計算する
            //高さを"e.ItemHeight"に幅を"e.ItemWidth"に入れる
            MenuItem  mi = (MenuItem) sender;
    
            //メニューに表示する文字列を取得
            string menuText;
            menuText = mi.Text;
            if (mi.ShowShortcut && mi.Shortcut != Shortcut.None)
            {
                //シュートカットを表示するときは、その文字列を追加する
                menuText += " " +
                    System.ComponentModel.TypeDescriptor.GetConverter(
                    typeof(Keys)).ConvertToString((Keys) mi.Shortcut);
            }
            StringFormat sf = new StringFormat();
            //ホットキープリフィックスの表示(&を_にする)
            sf.HotkeyPrefix = System.Drawing.Text.HotkeyPrefix.Show;
            //文字列の幅にアイコンの幅16と余白30を足す
            e.ItemWidth = (int) e.Graphics.MeasureString(menuText,
                SystemInformation.MenuFont, int.MaxValue, sf).Width + 46;
            //リソースを開放
            sf.Dispose();
    
            //高さを決定する(19bitに固定する)
            e.ItemHeight = 19;
        }
    
        private void MenuItem1_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e)
        {
            //メニューアイテムを描く
            MenuItem  mi= (MenuItem) sender;
    
            Brush b;
            if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
            {
                //選択時の背景色
                e.Graphics.FillRectangle(SystemBrushes.Highlight, e.Bounds);
                //文字列のブラシ
                b = new SolidBrush(SystemColors.HighlightText);
            }
            else
            {
                //非選択時の背景色
                e.Graphics.FillRectangle(SystemBrushes.Menu, e.Bounds);
                //文字列のブラシ
                b = new SolidBrush(SystemColors.MenuText);
            }
    
            //アイコンの描画
            e.Graphics.DrawIcon(newIcon, e.Bounds.Left+2, e.Bounds.Top+(e.Bounds.Height-newIcon.Height)/2);
    
            //文字を描画
            StringFormat sf = new StringFormat();
            //ホットキープリフィックスの表示(&を_にする)
            sf.HotkeyPrefix = System.Drawing.Text.HotkeyPrefix.Show;
            //Text部分を描画
            int  top= (e.Bounds.Height - SystemInformation.MenuFont.Height) / 2;
            e.Graphics.DrawString(mi.Text, SystemInformation.MenuFont,
                b, e.Bounds.Left + 22, e.Bounds.Top + top, sf);
            if (mi.ShowShortcut && mi.Shortcut != Shortcut.None)
            {
                //Shortcut部分を描画
                //Shortcut部分の文字列を取得
                string  shortcutText=
                    System.ComponentModel.TypeDescriptor.GetConverter(
                    typeof(Keys)).ConvertToString((Keys) mi.Shortcut);
                //Shortcut部分の幅を取得
                int  shortcutWidth=
                    (int) e.Graphics.MeasureString(shortcutText,
                    SystemInformation.MenuFont, int.MaxValue, sf).Width;
                //Shortcut部分の文字列を描画
                e.Graphics.DrawString(shortcutText, SystemInformation.MenuFont,
                    b, e.Bounds.Right - shortcutWidth - 24,
                    e.Bounds.Top + top, sf);
            }
    
            //リソースを開放
            b.Dispose();
            sf.Dispose();
        }
    
        // ファイル-終了メニューのイベントハンドラ
        private void FileExit(object sender, EventArgs e)
        {   this.Close();
        }
    
        // ヘルプ-バージョン情報メニューのイベントハンドラ
        private void HelpAbout(object sender, EventArgs e)
        {   MessageBox.Show("Menu Event Sample Program  Ver 1.0");
        }
    }
    
    class form01
    {
        public static void Main()
        {
            MyForm mf = new MyForm();
            Application.Run(mf);
        }
    }
    

前田稔(Maeda Minoru)の超初心者のプログラム入門