HP OpenVMS Systems Documentation |
[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ]
この章では,DECwindowsアプリケーション・インターフェイスの設計について説明します。 あわせてDECburgerのアプリケーション・インターフェイスについても説明します。
DECwindowsアプリケーション・インターフェイスを設計するための最初の手順は, 『OSF/Motifスタイル・ ガイド(DECwindows追補版)』(日本語),『DECwindows Companion to the OSF/Motif Style Guide』(英語)に記述されているアプリケーション・ インターフェイスのガイドラインを理解することです。これは, DECwindowsアプリケーションの「見た目と使い心地」を規定しているものです。 『OSF/Motifスタイル・ ガイド(DECwindows追補版)』(日本語),『DECwindows Companion to the OSF/Motif Style Guide』(英語)のガイドラインに沿ってアプリケーションを設計すると, そのアプリケーション・インターフェイスを他のDECwindows アプリケーションと一致させることができます。
アプリケーション・インターフェイスのガイドラインを理解すると,アプリケーションの形式, つまり見た目を決定することができます。アプリケーションを作成する前に, どのような見た目にしたいか概略を書いてみるとよいでしょう。 概略を書くと,第1.4.1 項で説明したように,インターフェイスにおけるウィジェットの親子関係も視覚的にとらえることができます。
次の質問に答えてみると,アプリケーション・インターフェイスの設計が容易になります。
XmFileSelectionBoxウィジェットを除き,すべてのManagerウィジェットはガジェットを受け付けます。 ただし,子のオブジェクトがウィジェットである場合のみ使用できるリソースもいくつかあります。
コールバックはアプリケーション・インターフェイスと機能コードの接続です。 ユーザ・インターフェイスを設計するときには,できるだけユーザのアクションと生成されるコールバックを一致させるようにしてください。 つまり,ユーザに取消のアクションを実行させたいなら,「取消」プッシュ・ ボタンが利用できるようにします。
アプリケーションを設計するとき,利用できる資源の仮定は慎重に行ってください。DECwindows のアプリケーションはさまざまなハードウェア・プラットホーム上に表示されるため, 多種多様な画面サイズやカラー資源などに対応していなければなりません。
アプリケーションによっては,十分な資源を割り当てることができない場合, 機能を選択的に削減する必要があるかもしれません。機能を削減するには, アプリケーションが必要とする最低限の操作環境を判断したうえで, その環境に到達するまで機能を削減しなければなりません。
第10章で互換性を維持するためのコーディングの勧告について説明していますが, 複数のハードウェア・プラットホームを対象としてDECwindows のアプリケーションを記述する場合には,これに従わなければなりません。 また,10章では次のトピックについて説明しています。
アプリケーションの見た目が決定したら,『OSF/Motifプログラマーズ・ ガイド』を調べて, 設計したユーザ・インターフェイスを一番うまく実現するウィジェットを捜してください。
第1.1.2項で説明したように, ツールキットには主要な3 種類のウィジェットがあります。
ほとんどのアプリケーションは,MainウィジェットとしてXmBulletinBoard やXmMainWindowなどのある種の容器ウィジェットを使用します。 これらのウィジェットはさまざまな種類の子をサポートし, アプリケーションに柔軟なプラットホームを与えます。
たとえば,アプリケーションにメニュー・バーが必要な場合, XmMainWindowウィジェットはメニュー・バーの子を容易にサポートできるため, そのウィジェットを使用するとアプリケーションに適したメイン・ ウィンドウを作成できます。また,XmBulletinBoardが備えている簡単なジオメトリ管理機能を使用すると, 子ウィジェットが相互に重なり合うことはありません。
入出力および選択ウィジェットは,情報を提示したり,ユーザに入力を問い合わせるために使用します。 アプリケーションに最適な種類のウィジェットを選んでください。 たとえば,テキスト入力フィールドが複数のテキスト行を処理する必要がある場合には, XmCreateScrolledTextルーチンを使用して,スクロールするウィンドウに組み込まれているXmText ウィジェットを作成します。このルーチンを使用するほうが,Text とScroll Barウィジェットを別々に作成するよりも簡単です。
このウィジェットを使用すると,アプリケーションはユーザに選択肢を与えて, その応答を得ることができます。選択ウィジェットには「1つを選択」と「複数を選択」の2種類があります。
第1.4.3項で説明したように, 既存のアプリケーションの一部を使用して新規のアプリケーションを構築できます。 たとえば,XmMainWindowウィジェットを使用するアプリケーションをすでに作成している場合は, そのコードを異なるコールバックで再使用することを考えてみてください。
できるかぎり既存のツールキットのウィジェットを使用してください。 しかし,要求に適したウィジェットが見つからない場合は,『X Window System Toolkit』に説明されているように,独自のウィジェットを作成できます。 独自のウィジェットを作成する場合には,DECwindowsの「見た目と使い心地」を実現しなければならないことに注意してください。
この節では,DECburgerアプリケーションでさまざまなウィジェットを使用する理由を説明します。 図 2-1は, DECburgerユーザ・インターフェイスで使用されるOSF/Motifのウィジェットを示しています。DEC 提供のウィジェットについては以降の章で説明します。
図 2-2に示すように,DECburgerはアプリケーションの基礎としてXmMainWindow ウィジェットを使用します。
Main WindowウィジェットはMenu Barウィジェットの項目として,注文などのDECburger アプリケーションの基本的な機能をいくつか提示します。DECburger のXmMenuBarウィジェットには,図 2-3 に示す4つのXmCascadeButtonメニュー項目が含まれています(Menu Bar ウィジェットにはカラー・システムにおける「オプション」メニュー項目も含まれています) 。
各XmCascadeButtonは1つのXmPulldownMenuウィジェットを制御します。 ユーザがMenu Barウィジェット内の項目を1つ選択すると,画面上にPull-Down Menu ウィジェットが表示されます。
図 2-4に表示されているXmPulldownMenuウィジェットは, 注文表がすでに表示されているとき,DECburgerが使用する「注文」のPull-Down Menu ウィジェットです。このメニューの内容は注文表が見えているかどうかによって異なります。
図 2-5に示すDECburgerの注文表は, XmFormDialogウィジェットです。これは子にジオメトリ管理を課す一般的な容器ウィジェットです。Dialog ウィジェットはその親ウィジェットの境界を越えることができ,DECburger の注文表は実際に越えています。
注文表の各XmFormウィジェットを区別するため,DECburgerでは各セクションの一番上に記述テキスト・ ラベルがあります。これらのテキスト・ラベルはそれぞれXmLabel ガジェットです。
DECburgerは図 2-6に示すXmRadioBoxウィジェットを使用して, ユーザが一度に1項目だけを選択できる選択リストを提示します。Radio Box ウィジェットの各項目は,XmToggleButtonガジェットによって実現されています。
ユーザが項目をいくつでも選択できる選択リストを提示するため, DECburgerは図 2-7に示すXmRowColumnウィジェットを使用します。 メニューの各項目はXmToggleButtonガジェットです。
DECburgerは数量に関する情報の入力を求めるために,図 2-8 に示すようなXmScaleウィジェットを使用します。Scale ウィジェットは値の範囲をグラフィック表示することによって, ユーザが誤った値を入力するのを防ぎます。
DECburgerは図 2-9に示すように, XmOptionMenuウィジェットを使用して,一度に1項目しか選択できない選択リストを提示します。Option Menu ウィジェット内の各項目は, XmPushButtonガジェットです。オプション・メニューはPull-Down Menuウィジェットと同様, ユーザがMB1を押したときだけディスプレイに表示されます。 このように,項目リストは呼び出されるまでディスプレイのスペースをまったく占有しません。Option Menu ウィジェットには常に,現在の選択内容が表示されます。
DECburgerは図 2-10に示すように, 数量選択を処理するもう1 つの方法としてXmTextウィジェットを使用します。Text ウィジェットを使用すると,ユーザはキーボードからテキストを入力することができます。
長い選択リストを提示するためには,DECburgerは図 2-11 に示すようなXmScrolledListウィジェットを使用します。この選択リストがディスプレイに表示されるときには, 全項目リストのうちの一部分だけがスクロール・ リスト内に見えています。XmScrolledListウィジェットは, ユーザが一度に複数の項目を選択できるように構成できます。
DECburgerは図 2-12に示すXmFormウィジェットを使用して, ドリンク類の数量選択を実現しています。XmFormウィジェットにはピックスマップ・ ラベルのあるXmPushButtonウィジェットが2つ組み込まれています。 上向き矢印のXmPushButtonでドリンク類の数量が増加し, 下向き矢印のXmPushButtonで数量が減少します。XmPushButtonガジェットでピックスマップ・ ラベルが使用できないため,ガジェットでなくウィジェットが使用されていることに注意してください。XmForm ウィジェットには, 記述テキストを表示するためと,ユーザが選択した現在値を提示するための,2 つのXmLabelガジェットも組み込まれています。
DECburgerは図 2-13に示すように,4 つのXmPushButton ウィジェットが組み込まれているXmFormDialogウィジェットを使用して「了解」, 「適用」,「リセット」,「取消」の機能を実現しています。 ガジェットでなくウィジェットを使用すると,より大きなフォント・ サイズを指定して,これらの重要機能を強調できることに注意してください。 ガジェットではフォントを指定できません。ガジェットはその親で指定されたフォントを使用します( この図はこれらのボタンで使用されている実際のフォントを表していません。 この属性を見るには, DECburgerアプリケーションを実行してください)。
XmNshowAsDefaultリソースは,「了解」XmPushButtonを省略時のボタンとして識別します。XmNdefaultButtonShadowThickness は,XmPushButton ウィジェットが選択されたとき同じサイズになるように,すべてのXmPushButton ウィジェットについて1に設定されます。
第1.1.8項で説明したように,アプリケーションはIntrinsics ルーチンを使用することにより,ツールキットの初期化, 画面やディスプレイに関する情報の取得,ウィジェットの画面へのマップとアンマップ, アプリケーションのエンド・ユーザからの入力の処理などを行なうことができます。
たとえば,DECburgerデモ用プログラムは次のようなIntrinsicsルーチンを使用します。
XtAppContext app_context; . . . toplevel_widget = XtAppInitialize(&app_context, "DECburger", NULL, 0, &argc, argv, &fallback, NULL, 0);
XQueryColor(the_display, XDefaultColormapOfScreen(the_screen), &newcolor);
the_screen = XtScreen(toplevel_widget);
XtSetMappedWhenManaged(widget_array[k_options_pdme], TRUE);
XtManageChild(main_window_widget);
XtUnmanageChild(widget_array[k_order_box]);
XtRealizeWidget(toplevel_widget);
XtAppMainLoop(app_context);
次の例では,XtSetArgは引数データ構造体に,ウィジェット属性の名前(DXmNfirstTopic) ,およびその属性に割り当てる値(help_topicで識別されるコンパウンド・ ストリング)を代入する。
XtSetArg (arglist[0], DXmNfirstTopic, help_topic);
その後XtSetValuesが,Helpウィジェットのこのインスタンスに DXmNfirstTopic属性を設定する。
XtSetArg (arglist[ac], DXmNfirstTopic, help_topic); ac++; XtSetValues (help_widget[help_num], arglist, ac);
XtSetArg(arglist[0], XmNbackground, &newcolor.pixel); XtGetValues(main_window_widget, arglist, 1);
この例はXtSetArgおよびXtGetValues Intrinsicsルーチンを呼び出して,Main Window ウィジェットの背景色を取得し,それを newcolor.pixelピクセル・フィールドに格納する。
if (XtIsManaged(main_help_widget)) {