バージョン 6.3.3
 —  プログラミングガイド  —

ニーモニックキーおよびアクセスキーの定義

このドキュメントでは、次のトピックについて説明します。


はじめに

キーボードコマンドを提供するには、以下の 2 つの方法があります。

Top of page

ニーモニックキーの定義

ニーモニックキーは、希望する文字の前に "&" を付けたものをダイアログエレメントの STRING 属性に指定することによって定義します。 ランタイム時にこの文字が下線付きで示されます。 例えば、STRING 属性値 "E&xplanation" は、ランタイム時に以下のように表示されます。

Explanation

テキスト定数コントロールまたはグループフレームコントロールにニーモニックキーを定義した場合、ランタイム時にニーモニックキーが押されると、コントロールシーケンスの次のダイアログエレメントがフォーカスを得ます。 例えば、テキスト定数コントロールの次のダイアログエレメントが入力フィールドコントロールの場合、テキスト定数コントロールのニーモニックキーが押されると入力フィールドコントロールがフォーカスが移動します。 ランタイム時にこの入力フィールドコントロールを使用不可にする場合は、対応するテキスト定数コントロールも使用不可にする必要があります。

ニーモニックキーは、グループフレームコントロールメニュー項目プッシュボタンコントロールラジオボタンコントロールテキスト定数コントロールトグルボタンコントロールツールバー項目の各タイプのダイアログエレメントの STRING 属性に定義できます。 

STRING 属性に "&&" と指定すると、ランタイム時に "&" も表示できます。 例えば、"A&&B" は "A&B" と表示されます。

注意:
最新の Windows バージョン(Windows 2000 など)のデフォルトでは、Alt キーが押されるまでニーモニック文字に下線が付けられません。 ただし、この新しい動作は、常にニーモニック文字に下線が付けられるようにユーザーによって変更できます。 例えば、英語版の Windows 2000 では、[Start]、[Control Panel]、[Display]、[Effects][Hide Keyboard navigation indicators until I use the Alt key]オプションをオフにすることによって、これを実現できます。

Top of page

アクセスキーの定義

アクセスキーは、F6Ctrl + 1 のように、ダイアログエレメントに対するキーまたはキーの組み合せを ACCELERATOR 属性に設定することによって定義します。 エンドユーザーがアクセスキーを押すと、ダイアログエレメントに対するダブルクリックイベントか、ダブルクリックイベントがない場合はクリックイベントが発生します。 対応するイベントが抑制されているか、またはダイアログエレメントが使用不可の場合は、アクセスキーは動作しません。

Alt + EscCtrl + EscAlt + Tab、および Ctrl + Alt + Del などの標準システムアクセラレータをアクセスキーとして定義できますが、これらはダイアログエレメントのクリックイベントまたはダブルクリックイベントを起動するのではなく、 関連付けられたシステム機能を起動します。 MDI アプリケーションで使用される標準 MDI アクセラレータ(Ctrl + F4Ctrl + F6 など)、およびアクティブなサーバー(例:現在フォーカスがある ActiveX コントロール)に属するアクセラレータについても同様です。

ユーザー定義アクセスキーは、デスクトップ項目に関連付けられた同じユーザー定義ショートカットキーを書き換えることに注意してください。

同一のアクセスキーを複数のダイアログエレメントに関連付けると、クリックイベントまたはダブルクリックイベントが起動されるダイアログエレメントは定義されません。

SAME-AS 属性によって別のダイアログエレメントを参照するダイアログエレメントは、参照されるオブジェクトのアクセラレータを継承します。 例えば、メニュー項目が 1 つのシグナルを参照し、そのシグナルのアクセラレータが Ctrl + Alt + X である場合、メニュー項目の ACCELERATOR 属性をクエリした場合も Ctrl + Alt + X が返されます。 ただし、アクセラレータを押すと、参照されるダイアログエレメント(この例では、シグナル)のクリックイベントだけが起動されます。

Alt + X 形式("X" は 1 つのアルファベット文字)のアクセラレータは、キーボードニーモニックとして予約されているため、使用しないでください。

Top of page

アクセスキーのメニューへの表示

メニュー項目のアクセラレータを表示するためには、メニューテキストにまずタブ(h'09')文字を追加して、次にアクセラレータ用のテキストを追加する必要があります。 ダイアログエディタのメニューエディタには文字列定義にタブ文字を入力する方法がないため、このエディタではスタティックに定義できません。 ただし、ダイアログのすべてのメニュー項目で繰り返し実行される共通コードを使用して、アクセラレータをダイナミックに追加できます。 これを説明する、ダイアログの AFTER-OPEN イベントから簡単に呼び出すことのできる外部サブルーチンを以下に示します。

DEFINE DATA
PARAMETER
  1 #DLG$WINDOW  HANDLE OF WINDOW
LOCAL
  1 #CONTROL     HANDLE OF GUI
  1 #COMMAND     HANDLE OF GUI
LOCAL USING NGULKEY1
END-DEFINE
*
DEFINE SUBROUTINE APPEND-ACCELERATORS
#CONTROL := #DLG$WINDOW.FIRST-CHILD
REPEAT UNTIL #CONTROL = NULL-HANDLE
  IF #CONTROL.TYPE = SUBMENU OR #CONTROL.TYPE = CONTEXTMENU
    #COMMAND := #CONTROL.FIRST-CHILD
    REPEAT UNTIL #COMMAND = NULL-HANDLE
      IF #COMMAND.ACCELERATOR <> ' ' 
       COMPRESS #COMMAND.STRING H'09' #COMMAND.ACCELERATOR INTO
         #COMMAND.STRING LEAVING NO SPACE
      END-IF
      #COMMAND := #COMMAND.SUCCESSOR
    END-REPEAT
  END-IF
 #CONTROL := #CONTROL.SUCCESSOR
END-REPEAT
END-SUBROUTINE
END

このダイナミック手法は、結果的にアクセラレータを 2 回(つまり、メニュー項目の ACCELERATOR 属性と STRING 属性に対して)定義しなくてもよいという利点があります。

使用言語が英語でない場合は、メニュー項目文字列に追加する前に ACCELERATOR 属性値の翻訳が必要となる場合があります。

Top of page