共通デスクトップ環境 アプリケーション・ビルダ・ユーザーズ・ガイド

第 5 章 区画、メニュー、およびメッセージの作成と編集

アプリケーション・ビルダのオブジェクトのほとんどが、ウィンドウ、区画、またはコントロール・パレットからドラッグされます。そうでないいくつかのオブジェクト (階層化された区画、区画ウィンドウ、メニュー、およびメッセージ) は、作成されたオブジェクトです。この章では、これらのオブジェクトの作成、使用、および編集方法について説明します。

区画エンティティの作成と編集

アプリケーション・ビルダの主ウィンドウの区画パレットには、コントロール区画、テキスト区画、描画領域区画、および端末区画という 4 種類の区画オブジェクトがあります。さらに、作成される区画エンティティには、子区画、階層化された区画、および区画ウィンドウの 3 種類があります。

子区画

子区画は、コントロール区画にドロップされてコントロール区画の「子」となるテキスト区画、端末区画、または描画領域区画です。たとえば、アプリケーション・ビルダでは、[ラベル属性エディタ] の [ラベル] フィールドが、コントロール区画の子であるテキスト区画です。

子区画を作成するには

  1. テキスト区画、描画領域区画、または端末区画をインタフェースのコントロール区画上にドロップします。

    メッセージ・ダイアログ・ボックスが表示され、ドロップした区画をコントロール区画の子または階層化された区画として作成するかどうかを選択します。

    子区画または階層化された区画を作成しない場合は、[取消し] をクリックします。

  2. [子] をクリックします。

    区画は、コントロール・オブジェクトのように、ドロップ場所に作成されます。区画は、コントロール区画上のコントロール・オブジェクトの兄弟になります。区画を選択して、他のコントロール・オブジェクトのようにコントロール区画上を移動できます。

階層化された区画

階層化された区画は、2 つ以上の区画が「重なり合ったもの」です。たとえば、アプリケーション・ビルダでは、各インタフェース・オブジェクトの属性を表示するのに使用する [属性エディタ] が、階層化された区画の 1 つになります。

階層化された区画を作成するには

  1. 区画をインタフェースの別の区画にドロップします。

    メッセージ・ダイアログ・ボックスが表示されるので、オプションの階層化された区画を作成するかどうか選択します。

    テキスト区画、描画領域区画、または端末区画をコントロール区画上にドロップした場合は、オプションのオブジェクトをコントロール区画の子として作成するかどうかも選択します。

    子区画または階層化された区画を作成しない場合は、[取消し] をクリックします。

  2. [階層化] をクリックします。

    区画は、ドロップされた区画の一番上に階層化された区画として作成されます。元の区画と同じサイズなので、元の区画は完全に隠れてしまいます。何層にも階層化された区画の 1 つをサイズ変更すると、すべての区画がサイズ変更されます。何層にも階層化された区画の表示方法については、「階層化された区画を表示するには」を参照してください。

    インタフェースの完成後、通常は階層化された区画の任意の区画の [サイズ・ポリシー] を [内容の調整] (デフォルト値は [固定] で、インタフェースが完成するまではデフォルト値のままにしておいてください) に変更します。各区画のサイズが異なっている場合があります。


注 -

階層化された区画を元に戻す直接の方法はありませんが、階層の 1 つを選択し、アプリケーション・ビルダの主ウィンドウの [編集] メニュー、またはポップアップ・メニュー (インタフェースまたは [モジュール・ブラウザ] で、マウス・ボタン 3 を押すと表示される) の 1 つから、[カット] を選択することによって実行できます。

カットした階層を保存する場合は、空のウィンドウを選択し、[編集] メニューから [ペースト] を選択します。階層がなくなるまで、カット&ペーストを繰り返します (これは、ブラウザでのもっとも簡単な方法です)。階層を保存しない場合は、[カット] の代わりに [削除] を選択します。


階層化された区画を表示するには

階層化された区画のうち、表示されるのは 1 つだけです。他の階層化された区画を表示するには、次のようにします。

  1. インタフェースまたは [モジュール・ブラウザ] で、表示されている階層化された区画を選択します。


    注 -

    階層化された区画をブラウザで選択した場合、選択した区画をインタフェース内の区画のスタックの一番上にポップすることはしません。


  2. 主ウィンドウの [表示] メニュー、またはインタフェースのポップアップ・メニュー (マウス・ボタン 3 を押すと表示される) から、[次の層] を選択します。

    現在の区画のすぐ下の階層が表示されます。他の階層を表示するには、この手順を繰り返します。

区画ウィンドウ

区画ウィンドウは、1 つの仮想ウィンドウ内で 2 つ以上の区画 (コントロール、テキスト、描画領域、端末区画のいずれかの組み合わせ) が組み合わされたものです。これらの複数の区画は重なり合っていて、移動可能なサッシで区切られています。区画ウィンドウが一定の長さを維持している限り、個々の区画は、サッシの移動に合わせて小さくなったり大きくなったりします。

Graphic

区画ウィンドウのサイズと位置の初期値は、その区画の位置とサイズによって決定されます。区画ウィンドウの左マージンは、一番左にある区画の左端によって決定されます。区画ウィンドウの幅は、一番幅のある区画の幅によって決定されます。

[区画ウィンドウ] 属性エディタの [区画の高さ] で、区画の高さの最大値および最小値を設定できます。詳細は、付録 B 「属性エディタ」を参照してください。

一度区画ウィンドウを作成すると、サッシ上でマウス・ボタン 1 および 2 を押して上下に移動することにより、区画のサイズを変更できます。

区画ウィンドウを作成するには

  1. 区画パレットから区画をドラッグし、メイン・ウィンドウまたはカスタム・ダイアログ上にドロップします。

    区画ウィンドウを親ウィンドウの上に接続する場合は、区画を親ウィンドウの左上隅にドロップします。区画は、左および上マージンがオフセット 0 のウィンドウに接続されます。

  2. 必要であれば、区画のサイズを変更します。

    区画ウィンドウをその親ウィンドウの両端に接続する場合は、ウィンドウの右端を越えるまで区画の右端をドラッグします。区画は、この端にも接続されます。

  3. 1 つ以上の追加区画をメイン・ウィンドウまたはダイアログにドラッグし、ウィンドウの空いている部分にドロップします。

  4. 区画ウィンドウの一部分にするすべての区画を選択します。

    区画を 1 つ選択するにはマウス・ボタン 1、追加区画を選択するにはマウス・ボタン 2 を使用します。

  5. [レイアウト] メニューから、またはインタフェースや [モジュール・ブラウザ] のポップアップ・メニュー (マウス・ボタン 3 を押すと表示される) から [区画ウィンドウを作成] を選択します。

    区画ウィンドウが作成されます。


注 -

区画の 1 つがその親の右端 (East) に接続され、1 つ以上のその他の区画が親の右端に接続されていない場合、右端に接続されていない区画の右端が、右端に接続されます。メッセージ・ダイアログ・ボックスが表示され、区画ウィンドウの子の East アタッチメントが異なっていて、その一番右の区画のアタッチメントで設定したことを知らせます。アタッチメント・エディタで、右アタッチメントを調整できます。[了解] をクリックします。


区画ウィンドウに区画を追加するには

  1. 区画を区画ウィンドウ上にドロップします。

    メッセージ・ダイアログ・ボックスが表示されるので、オプションの新規区画をコントロール区画の子として取り込むか (テキスト区画、表示領域区画、または端末区画をコントロール上にドロップした場合)、階層化された区画として作成するか、または区画ウィンドウに追加するかを選択してください。

  2. [区画] をクリックして、区画を区画ウィンドウに追加します。

    区画ウィンドウの一番下に、新規区画が追加されます。

区画ウィンドウを元に戻すには

  1. 区画ウィンドウを選択します。

    区画ウィンドウの縁をクリックして、ウィンドウを選択します。必ず、区画ではなく区画ウィンドウを選択してください。区画ウィンドウを選択した場合、区画ウィンドウの周りに濃いボックスが描画されます。

    あるいは、[モジュール・ブラウザ] を開いて、区画ウィンドウを選択します。これは、区画ウィンドウを選択する最も簡単で確かな方法です。

  2. [レイアウト] メニューから、またはインタフェースや [モジュール・ブラウザ] のポップアップ・メニュー (マウス・ボタン 3 を押すと表示される) から [区画ウィンドウを元に戻す] を選択します。

    区画ウィンドウを構成していた区画が、再び別の区画に戻ります。

メニューの作成と編集

メニューは、意味のあるラベルの付いた項目のリストです。各項目は、メニューが表示され、項目が選択された時に実行される機能に接続されます。この節では、メニューを作成および編集する方法、メニューをオブジェクトに接続する方法、メニュー項目をプログラムとしての機能に接続する方法について説明します。

メニューは、メニュー・ボタン、メニューバー項目、リスト、および 4 種類の区画に接続できます。メニューはオプション・メニューに自動的に接続されるので、メニューを接続する必要はありません。

メニュー属性エディタ

メニュー属性エディタは、メニューの作成に使用します。メニューは、属性エディタで編集される多くのオブジェクトとは異なり、作成されたオブジェクトであり、オブジェクト・パレットからは使用できません。

次に、メニュー・オブジェクトに特有の属性だけを示します。[オブジェクト型]、[オブジェクト]、[オブジェクト名]、および [カラー] の詳細は、「属性エディタ: 一般属性」を参照してください。[項目]、[ラベル]、および [項目の状態 (アクティブ) ] の詳細は、「属性エディタ: 共通属性」を参照してください。

新規メニューの追加

新規メニューをメニューのリストに追加します。

編集

メニュー・オブジェクトのリストの中から選択した項目に対して編集機能 ([カット]、[コピー]、[ペースト]、[削除]) を実行します。[カット] と [コピー] は、[ペースト] に備えて、選択した項目をバッファに置きます。[削除] は項目を削除しますが、バッファに置きません。

ティアオフ

ティアオフを使用可能にするかしないかを指定します。ティアオフを使用可能にした場合、選択したメニューは「表示可能」になります。すなわち、ティアオフ・インジケータ (ドットのある行) をクリックした場合、明示的に閉じるまでメニューは表示されたままです。

項目のラベルのタイプ

[項目] リストに選択した項目のラベルのタイプ ([文字列]、[グラフィック]、または [セパレータ]) を指定します。[グラフィック] を選択すると、[ラベル] が [グラフィック・ファイル名] になります。[セパレータ] を選択すると、[ラベル] または [グラフィック・ファイル名] がアクティブでなくなり、[線の形状] がアクティブになります。[セパレータ] メニュー項目は、アプリケーション・ビルダの主ウィンドウの [エディタ] メニューに表示されるようなメニューの仕切りを作成するために使用されます。

項目のニーモニック

メニューが表示された時の項目を選択するためのキーボード・ショートカットとして使用する、選択された項目の 1 文字を指定します。指定した文字には下線が付きます。メニューが表示されている時にニーモニック文字を押すと、その項目が選択されます。ニーモニックとして使用した文字は大文字と小文字が区別され、1 つのメニュー内で 1 度だけしかニーモニックとして使用できないので注意してください。

アクセラレータ

選択した項目の選択用のキーボード・ショートカットを指定します。アクセラレータは、接頭辞 (Ctrl、Alt、Meta、または Shift) 、<Key>、および文字 (大文字または小文字) で構成されます。たとえば、Control-x をアクセラレータにするには、次のように入力してください。

Ctrl<Key>x

テスト・モードまたはコンパイル済みアプリケーションでメニューを表示すると、メニュー項目ラベルの右に Ctrl+x が取り込まれます。メニューのあるウィンドウをフォーカスして、[Control] キーを押しながら x を入力すると、メニュー項目に指定したアクションが実行されます。

[Shift] キーと他のキーを組み合わせて、コンパウンド接頭辞を形成することもできます。Shift Control-x をアクセラレータにするには、次のように入力してください。

Shift Ctrl<Key>x

線の形状

選択したセパレータ項目の線の形状のタイプを指定します。これは、[項目のラベルのタイプ] が [セパレータ] の時だけアクティブです。選択肢は、[なし]、[内側エッチング]、[外側エッチング]、[内側エッチング・ダッシュ]、[外側エッチング・ダッシュ]、[一本線]、[二本線]、[一本の破線]、および [二本の破線]です。選択した線の形状のセパレータは、グラフィックまたはテキスト・ラベルの代わりに、メニューに表示されます。

項目のサブメニュー

[項目] リスト中の選択された項目のサブメニューを接続、接続解除、作成、または編集するためのメニュー・ボタンとテキスト・フィールドです。サブメニューが、選択した項目に接続されると、サブメニュー名が、テキスト・フィールドに表示されます。セパレータ項目タイプには無効です。

メニューを作成するには

次の手順では、ユーザがメニューを作成し、2 つの別の手順としてインタフェース・オブジェクトに接続することを想定しています。これらの手順を組み合わせるには、「メニューを作成および接続するには」を参照してください。


注 -

メニューは、モジュール内でのみ使用可能です。作成したメニューが、メニューを接続するオブジェクトと同じモジュールにあることを確認してください。メニューは現在のモジュールに作成されますが、そのモジュールは、インタフェースで選択されるものによって決定されます。アプリケーション・ビルダの主ウィンドウのオブジェクト情報領域内の [編集モジュール] フィールドが、現在のモジュールを示します。


  1. アプリケーション・ビルダの主ウィンドウの [エディタ] メニューから [メニュー]を選択して、メニュー属性エディタを表示します。

    あるいは、属性エディタを表示して、オブジェクト型に対しては [メニュー] を選択します。

    主ウィンドウの [エディタ] メニューから [メニュー] を選択することは、[オブジェクト型] が [メニュー] の場合に属性エディタで [ティアオフ] ボタンをクリックすることと同じです。

    エディタの詳細は、「メニュー属性エディタ」を参照してください。

    現在のプロジェクトにメニューが存在しない場合、[メニュー・オブジェクト] リストは空であり、[新規メニューの追加] と [編集] ボタンだけがアクティブになります。

    現在のプロジェクトにメニューが存在する場合、メニューは [メニュー・オブジェクト] リストにリストされます。リスト中のメニューの 1 つが選択されると、メニューの属性が、編集されるために表示されます。

  2. [新規メニューの追加] をクリックします。

    デフォルトのオブジェクト名 (「menu」、「menu2」となりますが、最後に付く数字は現在のモジュールに存在するメニューの数に依存します) を持ち、[項目] リストに 2 つの項目 (「項目 1」および 「項目 2」) を持ったメニューが作成されます。メニューは、[メニュー・オブジェクト] リストの終わりに追加されます。

    この時、メニュー名の前に現在のモジュール名が付きます。メニューは、[オブジェクト名]、[ティアオフ]、[項目]、[項目のラベルのタイプ]、[ラベル]、および [項目の状態] のデフォルト値を持っています。

    多数のメニューが必要な場合は、[新規メニューの追加] を適切な回数分クリックして、すべてのメニューを同時に作成できます。この時、メニュー項目に接続されるサブメニューとして使用するメニューも作成できます。

  3. 「メニューを編集するには」の説明に従って、メニューを編集します。

    メニューの編集は、メニュー作成直後でも、後から行うこともできます。

メニューを作成および編集した後は通常、メニューをインタフェース・オブジェクトに接続し、メニュー項目と特定のアクションの間の接続を作成してメニュー機能を作成できます。その方法については、「既存メニューをオブジェクトに接続するには」、および 「アクションへのメニュー項目の接続」を参照してください。サブメニューをメニュー項目に接続する場合は、「既存サブメニューをメニュー項目に接続するには」を参照してください。

メニューを編集するには

メニューの作成後は、メニューの編集が必要です。たとえば、メニュー項目の追加、メニュー項目への意味のある名前の付与、サブメニューの追加などです。

  1. アプリケーションの主ウィンドウの [エディタ] メニューから [メニュー] を選択して、メニュー属性エディタを表示します。

    あるいは、属性エディタを表示して、[オブジェクト型]として [メニュー] を選択します。

    エディタの詳細は、「メニュー属性エディタ」を参照してください。

  2. 必要であれば、オブジェクト名を変更します。

    自動的に生成されるオブジェクト名は、モジュール内において固有なので、通常変更する必要はありません。

  3. 必要であれば、[使用する] をクリックして、ティアオフ機能を使用可能にします。

    これにより、メニューは「表示可能」になります。すなわち、ティアオフ・インジケータ (ドットのある行) をクリックした場合、メニュー項目を選択した時点でメニューは消えません。閉じる操作を実行するまで、メニューは表示されたままです。

  4. 必要であれば、メニュー項目を [項目] リストに追加します。

    [項目の追加] をクリックすると、選択した項目の後に項目が追加されます。その他の編集機能を実行する場合は、[編集] メニュー・ボタンから選択します。

  5. 必要であれば、[項目] リスト中のメニュー項目の [項目のラベルのタイプ] を変更します。

    選択肢は、[文字列] (テキスト)、[グラフィック]、または [セパレータ] です。[グラフィック] を選択した場合、[ラベル] が [グラフィック・ファイル名] になります。[セパレータ] を選択した場合、[線の形状] がアクティブになります。

  6. 必要であれば、選択した項目の [ラベル] または [グラフィック・ファイル名] を変更します。


    注 -

    メニュー項目のラベルの最も簡単な編集方法は、[項目] リストから一番最初のものを選択することです。たとえば、[ラベル] フィールドでこれを行います。新しい項目名を入力して [Return] キーを押します。新規の項目名が [項目] リストに表示され、リストの次の項目が選択されます。すべてのラベルの編集が完了するまで、選択、入力、[Return] というプロセスを繰り返して作業を進めます。


    [項目のラベルのタイプ] で [グラフィック] を選択した場合、[グラフィック・ファイル名] は xpm または xbm グラフィック・ファイルでなければなりません。

  7. 必要であれば、[項目のニーモニック] を入力します。

    項目ラベルの 1 文字を入力します。その文字には、 メニュー項目のラベル上で下線が付きます。メニューが表示されている場合、キーを押すと、実行されるメニュー項目にアクションが接続されます。


    注 -

    大文字や小文字に関係なく、同じニーモニック文字は、1 つのメニュー内で 1 度だけしか使用できません。


  8. 必要であれば、[アクセラレータ] に入力します。

    アクセラレータは、接頭辞 (Ctrl、Alt、Meta、または Shift)、<Key>、および文字 (大文字または小文字) で構成されます。詳細は、「メニュー属性エディタ」を参照してください。

  9. [項目のラベルのタイプ] が [セパレータ] の場合は、線の形状を選択します。

    選択肢のリストについては、「メニュー属性エディタ」を参照してください。

  10. 該当する場合は、[項目のサブメニュー] を接続します。

    接続方法については、「既存サブメニューをメニュー項目に接続するには」を参照してください。

  11. 必要であれば、[項目の状態] を変更します。

    デフォルトでは、項目の状態はアクティブです。アプリケーションの起動時にメニュー項目をアクティブではない状態にするには、[アクティブ] チェック・ボックスをクリックして、選択を解除します。

  12. 必要であれば、バックグラウンドとフォアグラウンドのカラーを選択します。

    カラーを入力するか、メニューから [カラー・チューザ] を選択して [カラー・チューザ] からカラーを選択します。詳細は、「カラー・チューザからカラーを選択するには」を参照してください。

  13. 必要であれば、[接続] をクリックして、プログラム上の接続をメニュー項目に追加します。

    追加方法については、「アクションへのメニュー項目の接続」を参照してください。

  14. [適用] または [了解] をクリックして、変更内容を適用します。

    [適用] をクリックした場合、属性エディタはそのまま表示されます。

既存メニューをオブジェクトに接続するには

次の説明では、「メニューを作成するには」の手順に従って 1 つ以上のメニューが作成されていて、メニューをインタフェースのオブジェクトに接続する準備がユーザにできていることを想定しています。メニューは、メニュー・ボタン、メニューバー項目、リスト、および 4 種類の区画に接続できます。メニューは、オプション・メニューに自動的に接続されるので、メニューを接続する必要はありません。

  1. エディタで選択されたメニューを接続するオブジェクトを持つ [属性エディタ]を表示します。

    インタフェースまたは [モジュール・ブラウザ] でオブジェクトをダブルクリックするか、属性エディタで適切なオブジェクト型を選択して、[オブジェクト] リストから希望のオブジェクトを選択します。

  2. 選択したオブジェクトに接続するメニューを選択します。

    [ポップアップ・メニュー] または [プルダウン・メニュー] メニュー・ボタン上で、マウス・ボタン 2 をクリックするか、マウス・ボタン 1 または 3 を押します。メニューのサブメニューから、適切なメニューを選択します。

    Graphic

    [ポップアップ・メニュー] または [プルダウン・メニュー] のテキスト・フィールドに、選択したメニュー名が表示されます。

  3. [了解] か [適用] をクリックします。

    選択したオブジェクトにメニューが接続されます。メニューを使用できるようにする方法については、「オブジェクト間接続」を参照してください。


注 -

メニューを区画オブジェクトの 1 つ、またはリストに接続した場合、メニューはポップアップ・メニューになり、その区画上またはリスト上にカーソルがあるときにマウス・ボタン 3 を押すことによって、テスト・モードまたはコンパイル済みアプリケーションで表示できます。


メニューを作成および接続するには

メニューをオブジェクトに作成および接続する方法は、「メニューを作成するには」、および 「既存メニューをオブジェクトに接続するには」でも説明しています。次に説明する方法では、メニューの作成と接続を同時にできます。

  1. エディタで選択したメニューを接続するオブジェクトを持つ [属性エディタ] を表示します。

    インタフェースまたはモジュール・ブラウザでオブジェクトをダブルクリックするか、属性エディタで適切なオブジェクト型を選択して、[オブジェクト] リストから希望のオブジェクトを選択します。

  2. いくつかのオブジェクトで使用可能なプルダウン・メニューまたはポップアップ・メニュー・ボタンから [新規メニューの作成] を選択します。

    プルダウン・メニューは、メニュー・ボタンとメニュー・バーで使用可能です。ポップアップ・メニューは、すべての区画オブジェクトと、リストで使用可能です。項目のサブメニューは、メニュー自身で使用可能です。

    [メニュー属性エディタ] が表示され、その [メニュー・オブジェクト] リストには、選択されて新規に作成されたメニューがあります。メニューは、[オブジェクト名]、[ティアオフ]、[項目]、[項目のラベルのタイプ]、[ラベル]、および [項目の状態] のデフォルト値を持っています。

    [オブジェクト名] は、「object_type_menu」、「object_type_menu2」というようになります。これは、[新規メニューの作成] の選択時に属性エディタで選択したオブジェクトの型と、現在のモジュールに対して作成されたメニューの数に依存します。メニューは、 [メニュー・オブジェクト] リストの終わりに追加されます。この時、メニュー名の前に現在のモジュール名が付きます。

  3. メニューを編集し、[了解] をクリックして変更内容を適用し、[メニュー属性エディタ] を終了します。

    編集方法については、「メニューを編集するには」を参照してください。メニューの編集は、後で行うこともできます。

  4. 属性エディタで、[適用] または [了解] をクリックして、選択したオブジェクトにメニューを接続します。

    メニューを使用できるようにする方法については、「オブジェクト間接続」を参照してください。

既存サブメニューをメニュー項目に接続するには

次の説明では、「メニューを作成するには」に従って 2 つ以上のメニューが作成されていて、そのうちの 1 つをサブメニューとしてメニュー項目に接続する準備がユーザにできていると想定しています。

  1. オブジェクト型としてメニューが選択されているメニュー属性エディタまたは属性エディタを表示します。

  2. [メニュー・オブジェクト] または [オブジェクト] リストの中から、サブメニューを接続するメニュー項目を持つメニューを選択します。

  3. [項目] リストの中から、サブメニューを接続するメニュー項目を選択します。

  4. 選択したメニュー項目に接続するメニューを選択します。

    [項目のサブメニュー] メニュー・ボタン上で、マウス・ボタン 2 をクリックするか、マウス・ボタン 1 または 3 を押します。メニューのサブメニューから、適切なメニューを選択します。

    Graphic

    [項目のサブメニュー] のテキスト・フィールドに、選択したメニュー名が表示されます。

  5. [了解] か [適用] をクリックします。

    選択したメニュー項目に、サブメニューが接続されます。メニューを使用できるようにする方法については、「オブジェクト間接続」を参照してください。

サブメニューを作成および接続するには

次の説明では、1 つ以上のメニューが作成されていて、そのメニューの中の項目の 1 つに対して、サブメニューを作成および接続する場合を想定しています。この方法で、サブメニューを作成し、1 つの手順の一部として接続できます。また、メニューを作成し (「メニューを作成するには」を参照) 、メニュー項目に接続する (「既存サブメニューをメニュー項目に接続するには」を参照) という方法でも実行できます。


注 -

サブメニューを作成および接続する場合、2 つのエディタを使用します。一方でメニューを作成し、もう一方でサブメニューをメニュー項目に接続します。この作業をメニュー属性エディタで始める場合、サブメニューの接続はメニュー属性エディタで行いますが、サブメニューの作成は属性エディタで行います。属性エディタで始める場合は、サブメニューの接続を属性エディタで行い、サブメニューの作成はメニュー属性エディタで行います。次にメニュー属性エディタで始める場合の手順を示します。


  1. アプリケーション・ビルダの主ウィンドウの [エディタ] メニューから [メニュー] を選択して、メニュー属性エディタを表示します。

  2. [オブジェクト] リストから、サブメニューを接続するメニュー項目を持つメニューを選択します。

  3. [項目] リストから、サブメニューを接続するメニュー項目を選択します。

  4. [項目のサブメニュー] メニューから、[新規メニューの作成] を選択します。

    属性エディタが表示され、その [オブジェクト] リストには新規メニューが選択されています。

  5. メニューを編集し、[了解] をクリックして、変更した編集内容を適用し、属性エディタを終了します。

    編集方法については、「メニューを編集するには」を参照してください。メニューの編集は、後で行うこともできます。

  6. メニュー属性エディタで、[適用] をクリックして、手順 2 で選択したメニュー項目にサブメニューを接続します。サブメニューを使用できるようにする方法については、「アクションへのメニュー項目の接続」を参照してください。

ヘルプ・メニューを作成および接続するには

アプリケーションの主メイン・ウィンドウのメニュー・バーの右端にあるヘルプ・メニューは、アプリケーション一般に共通する機能です。次のようにして、ヘルプ・メニューを作成し、メニュー・バーの [ヘルプ] 項目に接続します。次の説明では、メニュー・バーを含む主メイン・ウィンドウがあり、ヘルプはそのメニュー・バーの項目の 1 つであると想定しています。

  1. エディタで選択したメニューバーを持つ属性エディタを表示します。

    インタフェースまたは [モジュール・ブラウザ] で適切なメニュー・バーをダブルクリックするか、属性エディタの [オブジェクト型] メニューから [メニューバー] を選択して、[オブジェクト] リストから希望のメニュー・バーを選択します。通常はこれで、主メイン・ウィンドウのメニュー・バーになります。

  2. [項目] リストから [ヘルプ] を選択します。

    これが、メニュー・バーの [ヘルプ] 項目になります。

  3. [プルダウン・メニュー] メニュー・ボタン上で、マウス・ボタン 2 をクリックするか、マウス・ボタン 1 または 3 を押します。メニューのサブメニューから [新規メニューの作成] を選択します。

    [プルダウン・メニュー] のテキスト・フィールドに新規メニュー名が表示され、新規メニューを読み込んだメニュー属性エディタが表示されます。

  4. メニューを編集します。

    1. たとえば、アプリケーション・ビルダのヘルプ・メニューに似たヘルプ・メニューにする場合は、[項目] リストの 2 つのデフォルト項目に 4 つの項目を追加します。各項目を順番に選択して、適切なラベル (たとえば、[概要]、[使い方]、[リファレンス]、[アイテムヘルプ]、[ヘルプの使い方]、および [ <アプリケーション名> について]) を入力します。

    2. 必要に応じて、項目のニーモニックおよびアクセラレータを追加します。

      詳細は、「メニュー属性エディタ」を参照してください。

    3. 必要に応じて、メニューに対するその他の変更を行います。

  5. メニュー属性エディタで、[了解] か [適用] をクリックします。

    メニューが完成しました。[了解] をクリックすると、メニュー属性エディタが終了します。

  6. 属性エディタで、[了解] か [適用] をクリックします。

    [ヘルプ] メニューが、メニュー・バーの [ヘルプ] 項目に接続されました。[了解] をクリックすると、属性エディタが終了します。

メッセージの作成と編集

この節では、メッセージ・エディタについて解説し、メッセージ・ダイアログ・ボックスを作成および編集する方法を説明します。

メッセージ・エディタ

メッセージ・エディタ (図 5-1 とその解説を参照) は、コンパイル済みアプリケーションで、適切な時に表示されるさまざまなタイプのメッセージを作成するために使用します。使用方法については、「メッセージ・ダイアログ・ボックスを作成するには」、および 「メッセージを編集するには」を参照してください。

図 5-1 メッセージ・エディタ

Graphic

メッセージ

現在のプロジェクトのすべてのメッセージをリストします。リスト内のメッセージ名の前にモジュール名が付きます。

モジュール・メニュー

新規メッセージを追加するモジュールを指定します。[メッセージ] リストのメッセージ名の前にモジュール名が付きます。

メッセージの追加

新規メッセージを [メッセージ] リストと現在のプロジェクトに追加します。メッセージは、モジュール・オプション・メニューで選択されるモジュールのためのものです。

メッセージの削除

選択したメッセージを削除します。

名前

現在のメッセージのインスタンス名を指定します。デフォルトのメッセージ名は、「message」、「message2」、「message3」、のようになります。

ダイアログのタイトル

メッセージ・ダイアログ・ボックスの一番上に表示されるタイトルを指定します。

タイプ

作成するメッセージのタイプを指定します。選択肢は、エラー、インフォメーション、作業中、クエスチョン、および警告です。メッセージ・テキスト区画の上に、メッセージ・タイプが表示されます。コンパイル済みアプリケーションのメッセージ・ダイアログ・ボックスに、該当するメッセージ・アイコンが表示されます。

メッセージ・テキスト区画

メッセージ・テキストの入力域となるテキスト区画です。テキストを改行する場合は、 [Return] キーを押してください。テキスト区画上部のラベルは、選択したメッセージのタイプによって変わります。

ボタン・チェック・ボックス

メッセージ・ダイアログ・ボックスの一番下に取り込まれるボタンを指定します。メッセージ・タイプによって、デフォルトで指定されるボタンのセットが異なります。

このデフォルトの選択肢は変更できます。[アクション 1]、[アクション 2]、[アクション 3]、および [取消し] ボタンに関連するアクションは、接続エディタで設定されます。詳細は、「メッセージ・ダイアログ・ボックスを作成するには」を参照してください。

デフォルト・ボタン・メニュー

選択したメッセージ・ダイアログのデフォルト・ボタンを指定します。

接続

[アクション] ボタンと [取消し] ボタンを呼び出す関数を指定するための接続エディタを表示します。

ヘルプ・テキスト

ヘルプ・エディタを表示します。このエディタで、メッセージ・ダイアログ・ボックスの [ヘルプ] ボタンをクリックした時に表示されるヘルプ・テキストを記述します。

表示ダイアログ

選択したメッセージをメッセージ・ダイアログ・ボックス (コンパイル済みアプリケーションの実際のダイアログ・ボックスに似ている) に表示するためのプッシュ・ボタンです。[ヘルプ] 以外のボタンをクリックして、ダイアログ・ボックスを閉じます。

エディタの一番下にあるボタンについては、「属性エディタ: 共通ボタン」を参照してください。

メッセージ・ダイアログ・ボックスを作成するには

エディタの各フィールドについては、「メッセージ・エディタ」を参照してください。メッセージを表示させる関数にメッセージを接続する方法については、「モードなしメッセージを関数に接続するには」を参照してください。

  1. アプリケーション・ビルダの主ウィンドウの [エディタ] メニューから [メッセージ] を選択して、メッセージ・エディタを表示します。

  2. [メッセージ] リストの下にあるオプション・メニューのメッセージを追加するモジュールを選択します。

  3. [メッセージの追加] をクリックします。

    [名前] フィールドに、固有の名前 (「message」、「message2」のようになり、名前の最後の数字は、現在のモジュールのメッセージ数に依存します) が表示されます。[メッセージ] リストに、モジュール名とメッセージ名が追加されます。

  4. 必要であれば、[名前] を変更します。

    この名前は、メッセージを内部的に識別するために使用します。たとえば、接続エディタなどで使用します。この名前は、コンパイル済みメッセージ・ダイアログ・ボックスでは表示されません。

  5. メッセージ・ダイアログのタイトルを [ダイアログのタイトル] フィールドに入力します。

    これは、コンパイルされたメッセージ・ダイアログ・ボックスのタイトル・バーに表示されます。

  6. [タイプ] メニューから、メッセージ・タイプを選択します。

    [タイプ] メニューに、メッセージ・タイプのアイコンが表示され、メッセージ・テキスト区画 ([タイプ] メニューの右側) の上に、メッセージ・タイプ (エラー、インフォメーション、作業中、クエスチョン、または警告) が表示されます。

  7. メッセージ・テキストをメッセージ・テキスト区画に入力します。コンパイルされたメッセージで改行する場合は、[Return] キーを押します。

  8. メッセージ・ダイアログ・ボックスに表示されるボタンを次のように指定します。メッセージ・テキスト区画の下にあるチェック・ボックスをクリックし、[アクション 1]、[アクション 2]、および [アクション 3] ボタンに付けるラベルを入力します。

    各メッセージ・タイプには、次のようなデフォルトのボタン・セットが用意されていてます。このボタンは変更できます。

    • エラー: アクション 2 (再試行)、取消し、ヘルプ

    • インフォメーション: アクション 1 (了解)、ヘルプ

    • 作業中: アクション 1 (閉じる)、アクション 2 (中止)、ヘルプ

    • クエスチョン: アクション 1 (はい)、アクション 2 (いいえ)、ヘルプ

    • 警告: アクション 2 (継続)、取消し、ヘルプ

  9. [デフォルト・ボタン] メニューから、デフォルトのボタンを選択します。

    このボタンは、メッセージ・ダイアログ・ボックスの表示時に特別な枠が付いています。このボタンは、[Return] キーを押すとアクテイブになります。各メッセージ・タイプには、次のようなデフォルトのデフォルト・ボタンが用意されています。このボタンは変更できます。

    • エラー: アクション 2

    • インフォメーション: アクション 1

    • 作業中: アクション 1

    • クエスチョン: アクション 1

    • 警告: アクション 2

  10. 必要に応じて、[ヘルプ・テキスト] ボタンをクリックして、ヘルプ・テキストを作成します。

    作成方法については、「ヘルプを作成するには」を参照します。

  11. [了解] か [適用] をクリックして、変更内容を適用します。

    [了解] をクリックすると、メッセージ・エディタは終了します。

メッセージを編集するには

  1. アプリケーション・ビルダの主ウィンドウの [エディタ] メニューから [メッセージ] を選択して、メッセージ・エディタを表示します。

  2. [メッセージ] リストから、編集するメッセージを選択します。

  3. 必要に応じて、メッセージを編集します。

    • メッセージを削除するには、[メッセージの削除] をクリックします。

    • ダイアログ・ボックスのタイトルを変更するには、[ダイアログのタイトル] テキスト・フィールド内をクリックして、新規ラベルを入力します。

    • メッセージ・タイプを変更するには、別のタイプのアイコンを選択します。

    • メッセージ・テキストを変更するには、メッセージ・テキスト区画内をクリックして、適切な変更内容を入力します。

    • 使用できるボタンを変更するには (該当する場合)、チェック・ボックスを選択して、新規ボタン・ラベルを入力します。

    • デフォルト・ボタンを変更するには、[デフォルト・ボタン] メニューから別のものを選択します。

    • ヘルプ・テキストを変更するには、[ヘルプ・テキスト] をクリックし、[ヘルプ・エディタ] で変更してから、[ヘルプ・エディタ] の [了解] をクリックします。

  4. [了解] か [適用] をクリックして、変更内容を適用します。

    [了解] をクリックすると、メッセージ・エディタは終了します。

モードなしメッセージを関数に接続するには

モード付き (保護) メッセージを関数に接続する方法については、「例: メッセージ用のコードの書き方」を参照してください。

  1. メッセージ・エディタの [接続] をクリックするか、アプリケーション・ビルダの主ウィンドウの [エディタ] メニューから [接続] を選択して、接続エディタを開きます。

    メッセージ・エディタでメッセージを選択して、[接続] をクリックした場合は、接続エディタの [ソース] リストに、選択されたメッセージが表示されます。その場合は、手順 4 に進んでください。

  2. [ソース] メニューから [メッセージ] を選択して、[ソース] リストにメッセージを表示します。

  3. [ソース] リストの中の、メッセージを選択します。

  4. [アクション・タイプ] として [関数呼び出し] を選択します。

    接続エディタの [ソース] 側の [いつ] メニューが起動します。

  5. [いつ] 項目 ([アクション 1 の起動]、[アクション 2 の起動]、[アクション 3 の起動]、または [取消しの起動] で、メッセージ・エディタでクリックされるボタンに依存します) を選択します。

  6. 指定したボタンを選択した時に呼び出す関数名を入力します。

    コードが生成されると、この関数は <module_name>_stubs.c に作成されます。make を実行する前に、必ず該当するコードを置換しなければなりません。

  7. [接続] をクリックして、接続を作成します。

    接続エディタの一番下にある [表示] リストに、接続が表示されます。

  8. ヘルプ以外の各ボタンに対して、手順 5 〜 7 を繰り返します。

  9. [取消し] をクリックして、[接続エディタ] を終了します。

例: メッセージ用のコードの書き方

「メッセージ・ダイアログ・ボックスを作成するには」に従ってメッセージを一度作成すると、それをいつ、どのように表示するかを決めなければなりません。メッセージは通常、ロジックのある部分が実行された後に表示されます。たとえば、ユーザが、名前を受け入れるように設計されたテキスト・フィールドに数字を入力した場合、数字が不正であることを知らせるエラー・メッセージが表示されます。

Motif のメッセージ・ボックスは、モード付きモードなし (保護非保護) の 2 つの方法のどちらかで表示できます。アプリケーション・ビルダのコード・ジェネレータ (dtcodegen) には、2 つの表示モードに対応した 2 個のルーチンがあります。これらのルーチンは dtb_utils.c にあり、次のような名前です。

特定のメッセージをモード付きで表示する場合は、dtb_show_modal_message() を使用します。特定のメッセージをモードなしで表示する場合は、dtb_show_message() を使用します。

メッセージの 2 つの扱い方における重要な相違点の 1 つは、ユーザがメッセージ・ダイアログ・ボックスで押すボタンをアプリケーションがどのように決定しているかということです。モードなしメッセージの場合、コールバックは、接続エディタを介して各ボタンに追加されます。ユーザがボタンをクリックすると、対応するコールバックが呼び出されます。モード付きダイアログが保護されているので、ボタンのコールバックは呼び出されません。代わりに、dtb_show_modal_message() が値を返し、ユーザが押したボタンを示します。

モード付きメッセージ用のコードを記述するには

メッセージをモード付き表示する場合は、dtb_show_message() を使用します。このルーチンは、ユーザが押したメッセージ・ボックス・ボタンを示す値を返します。値は、次のように dtb_utils.h で定義される列挙型です。

/*
 * Returns answer value for modal MessageBox
 */ 
typedef enum {
        DTB_ANSWER_NONE,
        DTB_ANSWER_ACTION1,
        DTB_ANSWER_ACTION2,
        DTB_ANSWER_ACTION3,
        DTB_ANSWER_CANCEL,
        DTB_ANSWER_HELP
} DTB_MODAL_ANSWER;

その後、戻り値 (たとえば switch 文経由) をテストし、コードの該当部分を実行できます。

次に、メッセージをモード付きで表示するコード例を挙げます。foo という名前の簡単なアプリケーションを作成したとします。プロジェクトは、foo.bip と名付けられ、1 つのモジュール (foo.bil) で構成されています。モジュール foo.bil は、メイン・ウィンドウ、コントロール区画、および 2 つのテキスト・フィールドで構成されています。2 つのテキスト・フィールドのうち、1 つはユーザの名前、もう 1 つは名字を入力するためのものです。ユーザが数字を入力した場合、エラー・メッセージが表示され、数字は入力できないことをユーザに通知し、2 つの選択肢を提示します。ユーザはやり直すか継続するかを選択します。やり直す場合は入力したテキストは消去され、継続する場合は入力されたテキストはそのまま残り、テキストを変更する方法についてはユーザに任されます。

関数呼び出し接続は、両方のテキスト・フィールドについて行われ、ユーザが何かを入力するたびに呼び出されます。最初のテキスト・フィールドの関数は、入力した文字が数字かどうかをチェックします。数字の場合は、エラー・メッセージをモード付きで表示します。

void 
verify_first_nameCB(
     Widget widget,
     XtPointer clientData,
     XtPointer callData 
)
{
     /*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
     char                *text = (char *)NULL;
     int                 textlen = 0;
     DTB_MODAL_ANSWER    answer = DTB_ANSWER_NONE;    
     DtbFooMainwindowInfo instance = (DtbFooMainwindowInfo) clientData;
     /*** DTB_USER_CODE_END   ^^^ Add C variables and code above ^^^ ***/


     /*** DTB_USER_CODE_START vvv Add C code below vvv ***/

     text = XmTextFieldGetString(widget);
     if ((text != NULL) && (*text != NULL))
     { 
         textlen = strlen(text);
         if (isdigit(text[textlen-1]))
         {
             dtb_foo_message_initialize(&dtb_foo_message);
             answer  dtb_show_modal_message(instance->textfield,
                        &dtb_foo_message, NULL, NULL, NULL);
             switch (answer)
             {
                 case DTB_ANSWER_ACTION1:        /* Start Over */
                     XmTextFieldSetString(widget, "");
                     break;

                 case DTB_ANSWER_ACTION2: /* Continue */
                     break;
             }
        }
     }

     /*** DTB_USER_CODE_END   ^^^ Add C code above ^^^ ***/ 
}

モードなしメッセージ用のコードを記述するには

モードなしメッセージを表示する場合は、dtb_show_message() を使用します。この関数はモード付きではなく、戻り値を返さないので、メッセージ・ボックス・ボタンのコールバックは、「モードなしメッセージを関数に接続するには」で説明したように、接続エディタを介して指定できます。メッセージ・ボックスに指定したボタンは、メッセージ・オブジェクトの [いつ] 項目として接続エディタに表示されます。

前節と同じ例を使用して、ユーザが数字を入力した場合に、名字を入力するためのテキスト・フィールドにモードなしでエラー・メッセージを表示させます。前述したように、まずメッセージ・ボックスの 2 つのボタン (「やり直し」と「継続」) 用の 1 組の関数呼び出し接続を行う必要があります。コードが生成されている場合は、適切な処理を行うルーチンにコードを追加してください。この場合、やり直しルーチンはテキスト・フィールド内を空にし、継続ルーチンは何も実行しません。

void 
verify_last_nameCB(
    Widget widget,
     XtPointer clientData,
     XtPointer callData 
) 
{
    /*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
    char               *text = (char *)NULL;
    int                 textlen = 0;    
    DtbFooMainwindowInfo instance = (DtbFooMainwindowInfo) clientData;

    /*** DTB_USER_CODE_END   ^^^ Add C variables and code above ^^^ ***/
    
    /*** DTB_USER_CODE_START vvv Add C code below vvv ***/

    text = XmTextFieldGetString(widget);
    if ((text != NULL) && (*text != NULL))
    {
         textlen = strlen(text);
         if (isdigit(text[textlen-1]))
         {
            dtb_foo_message_initialize(&dtb_foo_message);
            dtb_show_message(instance->textfield,
                        &dtb_foo_message, NULL, NULL);
         }
     }

     /*** DTB_USER_CODE_END  ^^^ Add C code above ^^^ ***/
}

void
start_overCB(
     Widget widget,
     XtPointer clientData,
     XtPointer callData 
) 
{
    /*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/

    DtbFooMainwindowInfo instance = (DtbFooMainwindowInfo) clientData;

    /*** DTB_USER_CODE_END   ^^^ Add C variables and code above ^^^ ***/
      
    /*** DTB_USER_CODE_START vvv Add C code below vvv ***/
      
    XmTextFieldSetString(dtb_foo_mainwindow.textfield2, "");

    /*** DTB_USER_CODE_END   ^^^ Add C code above ^^^ ***/
}


void
continueCB(
    Widget widget,
    XtPointer clientData,
    XtPointer callData 
) 
{    

    /*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
    /*** DTB_USER_CODE_END   ^^^ Add C variables and code above ^^^ ***/

    /*** DTB_USER_CODE_START vvv Add C code below vvv ***/
    /*** DTB_USER_CODE_END   ^^^ Add C code above ^^^ ***/
}

上述の 2 つのルーチン start_overCB()continueCB() は、dtb_show_message() のコールを介して、2 つのボタンのコールバックとして追加されます。次に挙げるのは、(dtb_utils.c から) コールバックを追加するコードの一部です。

/* Add Callbacks if necessary */
if (mbr->action1_callback != (XtCallbackProc) NULL)
    XtAddCallback(msg_dlg, XmNokCallback, mbr->action1_callback, NULL);
if (mbr->cancel_callback != (XtCallbackProc) NULL)
    XtAddCallback(msg_dlg, XmNcancelCallback, mbr->cancel_callback, NULL);
if (mbr->action2_callback != (XtCallbackProc) NULL)
{
    action_btn = dtb_MessageBoxGetActionButton(msg_dlg, DTB_ACTION2_BUTTON);
    if (action_btn != NULL)
        XtAddCallback(action_btn, XmNactivateCallback,
                      mbr->action2_callback, NULL);
}
if (mbr->action3_callback != (XtCallbackProc) NULL)
{
    action_btn = dtb_MessageBoxGetActionButton(msg_dlg, DTB_ACTION3_BUTTON);
if (action_btn != NULL)
    XtAddCallback(action_btn, XmNactivateCallback, mbr->action3_callback, NULL);
}

構造体 mbr には、メッセージに必要なすべての情報が含まれています。構造体には、メッセージ・オブジェクトが dtb_&_&_initialize() ルーチン (この例では dtb_foo_message_initialize()) を介して作成された時の、メッセージ・エディタで指定された値が入っています。