し上を行く MenuItem を表示したい,の巻
2003/11/16 新規

メニューにショートカットを割り当てるには、MenuItem.Shortcut プロパティに Shortcut 列挙体の値を設定します。 すると、メニューには MenuItem.Text プロパティで設定した文字列のほかに、ショートカット・キーも一緒に表示されます。
例1

MenuItem menuItem1=new MenuItem();
menuItem1.Text="上書き保存(&S)";
menuItem1.Shortcut=Shortcut.CtrlS;

通常はこの便利な仕組みを利用していれば良いのですが、それでは たとえば「→」(方向キー)といったキーを割り当てるにはどうすれば良いでしょうか?
MenuItem.Shortcut プロパティに設定できるのは Shortcut 列挙体に限られているため、 Shortcut 列挙体に用意されていないキーを割り当てることはできません。 そして方向キーなど、一部の特殊なキーは列挙体の中を探しても見つかりません。

そんな場合、まずはキー入力を From で受け取って処理するようにします。 Form.KeyPreview プロパティを true に設定してキー・イベントを受け取るようにし、 Form.KeyDown イベントにハンドラを設定します。 このときに Form.KeyPress イベントを用いても構いませんが、取得できるキー・コードがイマイチなので KeyDown か KeyUp が良いと思います。

Form.KeyDown イベントのハンドラで「→」キーを処理するまでは、特に問題ない流れです。 「次へ進む」というメニューを作り、「Alt」+「→」が押されたら「次へ進む」メニューと同じ処理を提供すれば立派にショートカットと言えます。
実際の挙動はこれで良いですが、あとに残された問題は外見です。 MenuItem.Shortcut プロパティを設定しているわけではないので、メニューの表示にはショートカットが含まれません。 その見た目の問題を解決するには、「\t」を使用します。 MenuItem.Text プロパティで表記を設定するとき、メニュー名に続けて「\t※ショートカット名」を追記します。
たとえば「次へ進む」メニューの場合だと、このようになります。
例2

MenuItem menuItem2=new MenuItem();
menuItem2.Text="次へ進む(&N)\tAlt+→";
こうすると「\t」以下の文字列が、MenuItem.Shortcut プロパティを設定したときと同じ場所へ表示されるようになります。

 

ちなみに。
この小技とは直接関係ありませんが、コード内に日本語を書く書かないに限らず、C# ソースの漢字コードは UTF-8 にしておくのが良いです。


戻る