C# Programming

Image

メインメニュー

開発環境: Visual Studio 2003 

目的

TextBox, RichTextBox のカットアンドペースト機能をメニューからも使えるようにする。

目次

  1. 目的
  2. 目次
  3. 参考
  4. メインメニューの作り方
  5. メニューにショートカットキーを追加する。
  6. メニュー項目にアクセス キーを追加する。
  7. メニュー項目を無効にする。
  8. メニュー項目を一時的に表示しない。
  9. メニュー項目にチェックマークをつける。
  10. メニュー項目にラジオチェックマークをつける。
  11. メニューにカットアンドペーストを追加する。
  12. メニューアイテムをマージして、新しいメニューを作る。
  13. サンプルコード

参考

(1)Windows.Forms メニュー拡張機能 ( VS.Net のヘルプ )
(2)カットアンドペースト ( VS.NET のヘルプ )

メインメニューの作り方

1. ツールボックスから、メインメニューをWindows.Forms 上にドラッグアンドドロップします。
2. メインメニューが表示されるので、各メニューアイテムをクリックし、メニューの文字列を記入します。
3. 必要に応じて、ショートカットキー、アクセスキーを追加します。

メニューにショートカットキーを追加する。

メニューアイテムのプロパティから設定できます。
メニューアイテムをマウスで右クリックし、プロパティを表示します。(下図)
ここで、Shortcut プロパティのドロップダウンリストを押すと、ダ〜〜ッと選択肢が現れますので、適切なものを選びます。

プログラムでは、
myMnuItem.Shortcut = System.Windows.Forms.Shortcut.CtrlC;

Image

また、ShowShortcut プロパティを True にすると、メニュー上に自動的にショートカットキーが表示されます(下図)。
Image


メニュー項目にアクセス キーを追加する。

アクセスキーとは、メニュで”コピー(C)” というように、アンダーバーCが表示され、このキーを押すことにより、キーボードから選択できるようにするためのものです。
アクセスキーも、メニューアイテムのプロパティから設定できます。
メニューアイテムをマウスで右クリックし、プロパティを表示します。(上図)
ここで、Text プロパティで、&C というように、&と次の1文字がアクセスキーとして設定されます。

メニュー項目を無効にする。

メニューアイテムの Enabled プロパティを False にします(下図)。

プログラムでは、
myMnuItem.Enabled = false;


Image

メニュー項目を一時的に表示しない。

メニューアイテムの Visible プロパティを False にします。

プログラムでは、
myMnuItem.Visible = false;

メニュー項目にチェックマークをつける。

メニューアイテムの Checked プロパティを True にします。
メニューアイテムの RadioChecked プロパティを False にします。

プログラムでは、
myMnuItem.RadioChecked = false;
myMnuItem.Checked = true;

メニュー項目にラジオチェックマークをつける。

メニューアイテムの Checked プロパティを True にします。
メニューアイテムの RadioChecked プロパティを True にします。

プログラムでは、
myMnuItem.RadioChecked = true;
myMnuItem.Checked = true;

メニューにカットアンドペーストを追加する。

TextBox, RichTextBox は、TextBoxBase クラスから継承しています。
TextBoxBase クラスでは、カットアンドペーストのための Cut(), Copy(), Paste(), Undo() が用意されているので、これらをメニューから呼び出すようにしてあげればOKです。
通常は、TextBoxBase クラスから継承して新しいクラスを作ることはせず、TextBox, RichTextBox から継承します。
Cut
                private void menuCut_Click(object sender, System.EventArgs e)
                {
                        if(this.richTextBox1.SelectionLength > 0)
                                this.richTextBox1.Cut();                
                }
Copy
                private void menuCopy_Click(object sender, System.EventArgs e)
                {
                        if(this.richTextBox1.SelectionLength > 0)
                                this.richTextBox1.Copy();       
                }
Paste
                private void menuPaste_Click(object sender, System.EventArgs e)
                {
                        if(Clipboard.GetDataObject().GetDataPresent(DataFormats.Text) == true)
                        {
                                if(this.richTextBox1.SelectionLength > 0)
                                {
                                        this.richTextBox1.SelectionStart = this.richTextBox1.SelectionStart + this.richTextBox1.SelectionLength;
                                }
                                this.ric
hTextBox1.Paste();      
                        }
                }
Undo
                private void menuUndo_Click(object sender, System.EventArgs e)
                {
                        if(this.richTextBox1.CanUndo == true)
                        {
                                this.richTextBox1.Undo();
                                this.richTextBox1.ClearUndo();
                        }

                }

メニューアイテムをマージして、新しいメニューを作る。

すでにあるメニューアイテムをマージして、新しいメニューを作ることができます。
たとえば、メインメニューで作成したメニューのうち、いくつかの項目だけ、コンテキストメニューに表示したい場合があると思います。
そのような場合に便利ですね。

ここでは、編集メニューといろいろなメニューをマージしたものを、コンテキストメニューとして表示しています(下図)。

Image

作り方
1. メインメニューを作る。
2. ツールボックスよりコンテキストメニューをドラッグアンドドロップする。
3. 適当なメニュー(ここでは、Test MergeMenu) を追加して、イベントハンドらを追加する。
4. イベントハンドらに、次のような処理を書く。

                private void menuTestMergeMenu_Click(object sender, System.EventArgs e)
                {
                        // メニューの追加方法を指定
                        mainMenuEdit.MergeType = MenuMerge.Add;
                        mainMenuMisc.MergeType = MenuMerge.MergeItems;
                        // メニューのコピーを作る。
                        MenuItem tempMenuItem = mainMenuMisc.CloneMenu();
                        // 編集メニューをマージする。
                        tempMenuItem.MergeMenu( mainMenuEdit.CloneMenu());
                        // 新しいメニューアイテムのタイトルを決める。
                        tempMenuItem.Text = "マージされたメニュー";

                        // コンテキストメニューに追加する。
                        this.contextMenu1.MenuItems.Add(tempMenuItem);
                }

サンプルコード

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace Command
{
        /// <summary>
        /// Form1 の概要の説明です。
        /// </summary>
        public class Form1 : System.Windows.Forms.Form
        {
                private System.Windows.Forms.RichTextBox richTextBox1;
                private System.Windows.Forms.MainMenu mainMenu1;
                private System.Windows.Forms.MenuItem mainMenuEdit;
                private System.Windows.Forms.MenuItem menuCut;
                private System.Windows.Forms.MenuItem menuCopy;
                private System.Windows.Forms.MenuItem menuPaste;
                private System.Windows.Forms.MenuItem menuUndo;
                private System.Windows.Forms.MenuItem menuItem6;
                private System.Windows.Forms.MenuItem mainMenuMisc;
                private System.Windows.Forms.MenuItem menuItemDefault;
                private System.Windows.Forms.MenuItem menuCheck;
                private System.Windows.Forms.MenuItem menuRadioCheck;
                private System.Windows.Forms.MenuItem menuEnabled;
                private System.Windows.Forms.MenuItem menuItemNormal;
                private System.Windows.Forms.MenuItem menuTestMergeMenu;
                private System.Windows.Forms.ContextMenu contextMenu1;
                /// <summary>
                /// 必要なデザイナ変数です。
                /// </summary>
                private System.ComponentModel.Container components = null;

                public Form1()
                {
                        //
                        // Windows フォーム デザイナ サポートに必要です。
                        //
                        InitializeComponent();

                        //
                        // TODO: InitializeComponent 呼び出しの後に、コンストラクタ コードを追加してください。
                        //
                }

                /// <summary>
                /// 使用されているリソースに後処理を実行します。
                /// </summary>
                protected override void Dispose( bool disposing )
                {
                        if( disposing )
                        {
                                if (components != null) 
                                {
                                        components.Dispose();
                                }
                        }
                        base.Dispose( disposing );
                }

                #region Windows Form Designer generated code
                /// <summary>
                /// デザイナ サポートに必要なメソッドです。このメソッドの内容を
                /// コード エディタで変更しないでください。
                /// </summary>
                private void InitializeComponent()
                {
                        this.richTextBox1 = new System.Windows.Forms.RichTextBox();
                        this.mainMenu1 = new System.Windows.Forms.MainMenu();
                        this.mainMenuEdit = new System.Windows.Forms.MenuItem();
                        this.menuCut = new System.Windows.Forms.MenuItem();
                        this.menuCopy = new System.Windows.Forms.MenuItem();
                        this.menuPaste = new System.Windows.Forms.MenuItem();
                        this.menuUndo = new System.Windows.Forms.MenuItem();
                        this.mainMenuMisc = new System.Windows.Forms.MenuItem();
                        this.menuItemDefault = new System.Windows.Forms.MenuItem();
                        this.menuCheck = new System.Windows.Forms.MenuItem();
                        this.menuRadioCheck = new System.Windows.Forms.MenuItem();
                        this.menuEnabled = new System.Windows.Forms.MenuItem();
                        this.menuItemNormal = new System.Windows.Forms.MenuItem();
                        this.menuItem6 = new System.Windows.Forms.MenuItem();
                        this.menuTestMergeMenu = new System.Windows.Forms.MenuItem();
                        this.contextMenu1 = new System.Windows.Forms.ContextMenu();
                        this.SuspendLayout();
                        // 
                        // richTextBox1
                        // 
                        this.richTextBox1.ContextMenu = this.contextMenu1;
                        this.richTextBox1.Dock = System.Windows.Forms.DockStyle.Fill;
                        this.richTextBox1.Name = "richTextBox1";
                        this.richTextBox1.Size = new System.Drawing.Size(292, 266);
                        this.richTextBox1.TabIndex = 0;
                        this.richTextBox1.Text = "richTextBox1";
                        // 
                        // mainMenu1
                        // 
                        this.mainMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
                        	this.mainMenuEdit, this.mainMenuMisc});
                        // 
                        // mainMenuEdit
                        // 
                        this.mainMenuEdit.Index = 0;
                        this.mainMenuEdit.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
                        	this.menuCut, this.menuCopy, this.menuPaste, this.menuUndo});
                        this.mainMenuEdit.Text = "編集(&E)";
                        // 
                        // menuCut
                        // 
                        this.menuCut.Index = 0;
                        this.menuCut.Shortcut = System.Windows.Forms.Shortcut.CtrlX;
                        this.menuCut.Text = "切り取り(&T)";
                        this.menuCut.Click += new System.EventHandler(this.menuCut_Click);
                        // 
                        // menuCopy
                        // 
                        this.menuCopy.Index = 1;
                        this.menuCopy.Shortcut = System.Windows.Forms.Shortcut.CtrlC;
                        this.menuCopy.Text = "コピー(&C)";
                        this.menuCopy.Click += new System.EventHandler(this.menuCopy_Click);
                        // 
                        // menuPaste
                        // 
                        this.menuPaste.Index = 2;
                        this.menuPaste.Shortcut = System.Windows.Forms.Shortcut.CtrlV;
                        this.menuPaste.Text = "貼り付け(&P)";
                        this.menuPaste.Click += new System.EventHandler(this.menuPaste_Click);
                        // 
                        // menuUndo
                        // 
                        this.menuUndo.Index = 3;
                        this.menuUndo.Shortcut = System.Windows.Forms.Shortcut.CtrlZ;
                        this.menuUndo.Text = "元へ戻す(&U)";
                        this.menuUndo.Click += new System.EventHandler(this.menuUndo_Click);
                        // 
                        // mainMenuMisc
                        // 
                        this.mainMenuMisc.Index = 1;
                        this.mainMenuMisc.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
                             this.menuItemDefault, this.menuCheck, this.menuRadioCheck, 
                             this.menuItem6, this.menuEnabled,this.menuItemNormal,this.menuTestMergeMenu});
                        this.mainMenuMisc.Text = "いろいろなメニュー";
                        // 
                        // menuItemDefault
                        // 
                        this.menuItemDefault.DefaultItem = true;
                        this.menuItemDefault.Index = 0;
                        this.menuItemDefault.Text = "デフォルトメニュー";
                        // 
                        // menuCheck
                        // 
                        this.menuCheck.Checked = true;
                        this.menuCheck.Index = 1;
                        this.menuCheck.Text = "チェック";
                        // 
                        // menuRadioCheck
                        // 
                        this.menuRadioCheck.Checked = true;
                        this.menuRadioCheck.Index = 2;
                        this.menuRadioCheck.MergeType = System.Windows.Forms.MenuMerge.Replace;
                        this.menuRadioCheck.RadioCheck = true;
                        this.menuRadioCheck.Text = "ラジオチェック";
                        // 
                        // menuEnabled
                        // 
                        this.menuEnabled.Enabled = false;
                        this.menuEnabled.Index = 4;
                        this.menuEnabled.Text = "無効";
                        // 
                        // menuItemNormal
                        // 
                        this.menuItemNormal.Index = 5;
                        this.menuItemNormal.Text = "通常のメニューアイテム";
                        // 
                        // menuItem6
                        // 
                        this.menuItem6.Index = 3;
                        this.menuItem6.Text = "-";
                        // 
                        // menuTestMergeMenu
                        // 
                        this.menuTestMergeMenu.Index = 6;
                        this.menuTestMergeMenu.Text = "Test MergeMenu";
                        this.menuTestMergeMenu.Click += 
                        	new System.EventHandler(this.menuTestMergeMenu_Click);
                        // 
                        // Form1
                        // 
                        this.AutoScaleBaseSize = new System.Drawing.Size(5, 12);
                        this.ClientSize = new System.Drawing.Size(292, 266);
                        this.Controls.AddRange(new System.Windows.Forms.Control[] {
                                  this.richTextBox1});
                        this.Menu = this.mainMenu1;
                        this.Name = "Form1";
                        this.Text = "Form1";
                        this.ResumeLayout(false);

                }
                #endregion

                /// <summary>
                /// アプリケーションのメイン エントリ ポイントです。
                /// </summary>
                [STAThread]
                static void Main() 
                {
                        Application.Run(new Form1());
                }

                private void menuCut_Click(object sender, System.EventArgs e)
                {
                        if(this.richTextBox1.SelectionLength > 0)
                                this.richTextBox1.Cut();                
                }

                private void menuCopy_Click(object sender, System.EventArgs e)
                {
                        if(this.richTextBox1.SelectionLength > 0)
                                this.richTextBox1.Copy();       
                }

                private void menuPaste_Click(object sender, System.EventArgs e)
                {
                        if(Clipboard.GetDataObject().GetDataPresent(DataFormats.Text) == true)
                        {
                                if(this.richTextBox1.SelectionLength > 0)
                                {
                                        this.richTextBox1.SelectionStart = 
                                        this.richTextBox1.SelectionStart + this.richTextBox1.SelectionLength;
                                }
                                this.richTextBox1.Paste();      
                        }
                }

                private void menuUndo_Click(object sender, System.EventArgs e)
                {
                        if(this.richTextBox1.CanUndo == true)
                        {
                                this.richTextBox1.Undo();
                                this.richTextBox1.ClearUndo();
                        }

                }

                private void menuTestMergeMenu_Click(object sender, System.EventArgs e)
                {
                        // メニューの追加方法を指定
                        mainMenuEdit.MergeType = MenuMerge.Add;
                        mainMenuMisc.MergeType = MenuMerge.MergeItems;
                        // メニューのコピーを作る。
                        MenuItem tempMenuItem = mainMenuMisc.CloneMenu();
                        // 編集メニューをマージする。
                        tempMenuItem.MergeMenu( mainMenuEdit.CloneMenu());
                        // 新しいメニューアイテムのタイトルを決める。
                        tempMenuItem.Text = "マージされたメニュー";

                        // コンテキストメニューに追加する。
                        this.contextMenu1.MenuItems.Add(tempMenuItem);
                }
        }               
}