HP OpenVMS Systems Documentation |
[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ]
この章では,アプリケーション・プログラムでPrintウィジェットを使用する方法について説明します。Print ウィジェットの各リソースについて説明するとともに,UIL およびツールキットのPrintウィジェットのプログラミング例も示します。
Printウィジェットはモードなしのウィジェットであり,これを使用するとDECwindows のアプリケーションは,さまざまなフォーマットの1つ以上のファイルを速く印刷できます。 アプリケーション・プログラマとして行わなければならないことは,UIL のDXmPrintDialogオブジェクト・タイプまたはツールキットのDXmCreatePrintDialog ルーチンのいずれかを使用して,Print ウィジェットのインスタンスを作成し,DXmPrintWgtPrintJobルーチンを呼び出して, そのプリント・ジョブをキューに登録することだけです。
アプリケーションはまた,UILのDXmPrintBoxオブジェクト・タイプまたはDXmCreatePrintBox ルーチンを使用して,ダイアログ・シェルのないPrint ウィジェットを作成することもできます。このオブジェクト・タイプまたはルーチンは,Print ウィジェットを既存のウィジェットの1つに追加するために使用できます。
Printウィジェットはグラフィック・インターフェイスを使用して,各種の印刷オプションについてユーザに入力を促すため, ユーザはUNIXのprint コマンドあるいはOpenVMSのPRINTコマンドの構文を知らなくてもファイルを印刷できます。 さらに,PrintウィジェットはOpenVMS論理名を使用して, 利用できるプリント・キューを決定して表示するため,ユーザは特定のOpenVMS システム上でのプリント・キューについての知識を必要としません。
Printウィジェットはアプリケーションで,Printウィジェットがユーザに対して最初にどのように表示されるかを決定できます。 その後,ユーザは使用しているファイルおよびプリント・ キューに基づいて,各種のリソースを変更できます。
この節では,アプリケーションでPrintウィジェットを使用する方法について簡単に説明します。 このプロセスについては,以降の節でさらに詳しく説明します。
Printウィジェットを使用するために,アプリケーションは次の手順を実行します。
DXmPrintWgtPrintJobは識別されたファイルを所定の印刷サービスへ実際に転送し終わって, プリント・ジョブの状態をアプリケーションに返す。
Printウィジェットのメイン・ダイアログ・ボックスには,1次印刷オプションが入っています。 「オプション...」プッシュ・ボタンを選択すると, 追加の印刷オプションが入っている2次ダイアログ・ボックスがフェッチされて管理されます。2 次ダイアログ・ボックスに表示されているオプションは, キューに登録されているファイルの種類,およびそれが印刷されるプリンタに合わせて適合化されます。
DECburgerサンプル・プログラムによって作成されたPrintウィジェットの構成要素を, 図 7-1と図 7-2 に示します。
Printウィジェットは,表 7-1 に説明しているコールバックをサポートします。
コールバック | 説明 |
---|---|
XmNokCallback | ユーザがPrintウィジェットのメイン・
ダイアログ・ボックスで「了解」プッシュ・ボタンをクリックした。
DXmNunmanageOnOkリソースが設定されている場合,メイン・ボックスの「了解」ボタンが押されると,Print
ウィジェットは自動的に自分自身の管理を解除する。
アプリケーションはXmNokCallbackコールバックを使用することにより,XtGetValues ルーチンを呼び出して,ユーザが選択した印刷オプションを取得して格納したり,DXmPrintWgtPrintJob を呼び出して,プリント・ ジョブをキューに登録するなど,ほかの機能を実行することができる。 |
XmNcancelCallback | ユーザがPrint
ウィジェットのメイン・ダイアログ・ボックスで「取消」プッシュ・
ボタンをクリックした。DXmNunmanageOnCancelリソースが設定されている場合,
メイン・ボックスの「取消」ボタンが押されると,Print
ウィジェットは自動的に自分自身の管理を解除する。
アプリケーションはXmNcancelCallbackコールバックを使用して,ほかの機能を実行することができる。 |
アプリケーション・プログラムでDXmNfileNameListリソースを指定すると,Print ウィジェットはそのファイル拡張子が存在すればそれを使用して, 最初に印刷するファイルのタイプと,関連するプリント・ フォーマットを推測します。その後,Printウィジェットはこのファイル・ タイプに基づいて,省略時の値をいくつか設定します。したがって, DXmNfileNameListリソースを使用してファイルのリストを指定する場合, それらのファイルはすべて同一のタイプでなければなりません。つまり, すべてのファイルがテキスト・ファイルであったり,PostScriptファイルであったりしなければなりません。
印刷するファイルの属性がわからない場合,アプリケーションはDXmNfileNameList リソースを使用して,Printウィジェットのファイル・ タイプ推測機能を使用します。Printウィジェットが印刷するファイルのフォーマットを誤って推測した場合には, ユーザが正しいプリント・ フォーマットを選択できます。
Printウィジェットの各種リソースを指定して,Printウィジェットをユーザに対して最初にどのように表示するかを定義できます。 これに関しては『日本語DECwindows Motif for OpenVMS拡張機能説明書』(日本語),『DECwindows Extensions to Motif』(英語)に説明があります。ユーザはその後,必要に応じて印刷オプションを変更することができます。
メイン・ダイアログ・ボックスに入っているPrintウィジェットの各リソースは, 次のグループに分けられます。
2次ダイアログ・ボックスに入っているPrintウィジェットの各リソースは, 次のグループに分けられます。
例 7-1は,Printウィジェットの各種リソースを設定するUIL の例を示しています。
. . . object myprint_widget : DXmPrintDialog { arguments { XmNnoResize = true; DXmNnumberCopies = 13; DXmNpageRangeFrom = compound_string("3"); DXmNpageRangeTo = compound_string("20"); DXmNprintFormatList = compound_string_table ("PostScript(R)", "DDIF", "ANSI"); DXmNprintFormatCount = 3; DXmNprintFormatChoice = compound_string("ANSI"); DXmNorientation = DXmORIENTATION_PORTRAIT; DXmNprintAfter = compound_string("23-JUN-1990 17:30"); DXmNdeleteFile = true; DXmNpageSize = DXmSIZE_LEDGER; DXmNsides = DXmSIDES_SIMPLEX_ONE; DXmNnumberUp = 0; DXmNsheetCount = 1; DXmNfileStartSheet = DXmFILE_SHEET_NONE; DXmNfileEndSheet = DXmFILE_SHEET_ONE; DXmNfileBurstSheet = DXmFILE_SHEET_ALL; DXmNmessageLog = DXmMESSAGE_LOG_DEFAULT; DXmNholdJob = true; DXmNnotify = false; DXmNsheetSize = DXmSIZE_LEGAL; DXmNinputTray = DXmINPUT_TRAY_DEFAULT; DXmNoutputTray = DXmOUTPUT_TRAY_DEFAULT; DXmNjobName = compound_string("This is the Job Name"); DXmNoperatorMessage = compound_string("This is the Operator Message"); DXmNheader = true; DXmNdoubleSpacing = true; DXmNstartSheetComment = compound_string("This is the Start Sheet Comment"); DXmNpriority = 12; DXmNunmanageOnOk = true; DXmNunmanageOnCancel = true; DXmNfileNameList = compound_string_table ("order.txt", "test.txt"); DXmNfileNameCount = 2; DXmNsuppressOptionsMask = DXmSUPPRESS_NUMBER_COPIES; DXmNoptionsDialogTitle = compound_string("Secondary Dialog Box"); }; . . .
一般に,DXmNprinterChoiceやDXmNdefaultPrinterなどのユーザ選択リソースや省略時のリソースはシステムによって異なるため,UIL ファイルで設定してはなりません。 『OSF /Motifプログラマーズ・ガイド』に説明されているように,アプリケーションはそのアプリケーション固有のデフォルト・ ファイルを使用して,C またはUILモジュールに明示的に設定していないリソースを指定することができます。 ユーザ選択リソースやプリンタの省略時のリソースは, デフォルト・ファイルに指定してください。
PrintウィジェットにはDXmNsuppressOptionsMask引数があり,この引数を使用するとPrint ウィジェットの機能を禁止することができます。アプリケーション・ プログラマはDXmNsuppressOptionsMask引数を使用することによって, ユーザが利用できる印刷オプションを制限できます。
DXmNsuppressOptionsMask引数はビットマスクであり,プログラマは禁止したいリソースについて論理OR 演算を実行します。つまり,ツールキットのルーチンを使用している場合は, 次のようにXtSetArgへの呼び出しで, リソースの論理和演算を行ないます。
XtSetArg (arglist[ac], DXmNsuppressOptionsMask, DXmSUPPRESS_DELETE_FILE | DXmSUPPRESS_OPERATOR_MESSAGE); ac++;
UILからも,禁止したいリソースの論理和演算を行ないます。
object main_print : DXmPrintDialog { arguments { XmNdialogTitle = "DECburger: Print"; DXmNoptionsDialogTitle = "DECburger: Print Options"; DXmNnumberCopies = 2; DXmNunmanageOnOk = true; DXmNunmanageOnCancel = true; DXmNsuppressOptionsMask = DXmSUPPRESS_DELETE_FILE + DXmSUPPRESS__OPERATOR_MESSAGE; }; callbacks { XmNhelpCallback = procedure sens_help_proc(k_print_help); }; };
DXmNsuppressOptionsMaskの値としては,次のものが可能です。
アプリケーションはDXmPrintWgtAugmentListルーチンを呼び出して,追加のプリント・ フォーマットを定義するとともに,Printウィジェットのオプション・ メニューに新規のオプションを追加することができます。 DXmPrintWgtAugmentListルーチンのフォーマットは次のとおりです。
unsigned long int DXmPrintWgtAugmentList(pw,list,data) Widget pw; int list; caddr_t data;
DXmPrintWgtAugmentListのpw引数は,Printウィジェットを識別します。list 引数は,次の定数から選択しなければなりません。
data引数は,タイプがDXmPrintFormatStructまたはDXmPrintOptionManuStruct の参照によって引き渡されるデータ構造体です。DXmPrintFormatStruct データ構造体は,次のように宣言されています。
typedef struct _DXmPrintFormatStruct { XmString ui_string; XmString os_string; XmString var_string; } DXmPrintFormatStruct;
ui_stringフィールドはユーザ・インターフェイスに表示されるラベルです。 os_stringフィールドはプリント・フォーマットを識別するために, オペレーティング・システムへ渡されます。var_ stringフィールドは,そのプリント・フォーマットに使用するプリンタ・ リストを識別するOpenVMSあるいはUNIXの環境変数です。
DXmPrintOptionMenuStructは次のように宣言されています。
typedef struct _DXmPrintOptionMenuStruct { XmString ui_string; XmString os_string; } DXmPrintOptionMenuStruct;
ui_stringフィールドはユーザ・インターフェイスに表示されるラベルであり, os_stringフィールドは印刷オプションをオペレーティング・ システムに示します。
DXmPrintWgtAugmentListは,要求が実行されない場合,NULLを返します。 要求が実行されると,DXmPrintWgtAugmentListは新しい要素を識別する整数を返します。 この整数はプリント・フォーマットを追加しているときには必要ありません。 ただし,この整数はあとでオプション・メニューにおいてXtGetValues とXtSetValuesを呼び出すときに使用できます。
たとえば,アプリケーションがオプション・メニューにオプションを追加して, その追加したオプションを選択したい場合,アプリケーションはXtSetValues への呼び出しで,返された整数を使用します。
プリント・フォーマットを追加するときは,list引数に定数DXmPRINT_ FORMAT,data引数にはタイプDXmPrintFormatStructの変数を使用します。 DXmPrintFormatStruct構造体のすべてのフィールドには,有効なコンパウンド・ ストリングが入っていなければなりません。NULLのコンパウンド・ ストリングは認められません。
追加されたフォーマットを選択すると,DXmNpassAllリソースはFALSE (無効) に,DXmNautoPaginationはTRUE (有効)に設定されます。このような動作を希望しない場合, アプリケーションはXmNokCallbackコールバックで,DXmNpassAll とDXmNautoPaginationを希望する設定値に設定しなければなりません。
例 7-2はプリント・フォーマットを追加する例を示しています。
. . . DXmPrintFormatStruct r_my_struct; r_my_struct.ui_string = XmStringCreateLtoR("User String", XmSTRING_DEFAULT_CHARSET); r_my_struct.os_string = XmStringCreateLtoR("OS String", XmSTRING_DEFAULT_CHARSET); r_my_struct.var_string = XmStringCreate("Logical", XmSTRING_DEFAULT_CHARSET); DXmPrintWgtAugmentList(print_widget, DXmPRINT_FORMAT, &r_my_struct)); . . .
Printウィジェットのオプション・メニューにオプションを追加するときは,list 引数にDXmPRINT_FORMAT以外の定数,data引数にタイプDXmPrintOptionMenuStruct の変数を使用します。
DXmPrintOptionMenuStructデータ構造体のui_stringフィールドには, 有効なコンパウンド・ストリングが入っていなければなりません。 DXmPrintOptionMenuStructデータ構造体のos_stringフィールドは, 有効なコンパウンド・ストリングまたはNULLのいずれかでなければなりません。
そのフィールドがNULLでない場合,ユーザがオプションを選択すると, Printウィジェットはオペレーティング・システムにos_stringフィールドの文字列を送信します。
そのフィールドがNULLの場合は,ユーザがオプションを選択しても, Printウィジェットはオペレーティング・システムに何も送信しません。 つまり,Printウィジェットは省略時の値が選択されたときのように機能します。
アプリケーションが各オプション・メニューに追加できるオプションの数は限られています。 アプリケーションが限定数以上のオプションを追加しようとすると,DXmPrintWgtAugmentList は0のステータスを返します。
例 7-3はメニューにオプションを追加する例を示しています。
. . . DXmPrintOptionMenuStruct r_my_struct; r_my_struct.ui_string = XmStringCreateLtoR("User String", XmSTRING_DEFAULT_CHARSET); r_my_struct.os_string = XmStringCreateLtoR("OS String", XmSTRING_DEFAULT_CHARSET); DXmPrintWgtAugmentList(print_widget, DXmPAGE_SIZE, &r_my_struct)); . . .
例 7-4と例 7-5 は,DECburgerサンプル・プログラムでPrint ウィジェットを作成する方法を示しています。
. . . !The print widget object 【1】 object main_print : DXmPrintDialog { arguments { XmNdialogTitle = "DECburger: Print"; DXmNoptionsDialogTitle = "DECburger: Print Options"; DXmNnumberCopies = 2; DXmNunmanageOnOk = true; DXmNunmanageOnCancel = true; }; callbacks { XmNhelpCallback = procedure sens_help_proc(k_print_help); }; }; . . .
. . . #include <DXm/DXmPrint.h> . . . /* Print Widget Creation */ static void create_print() { unsigned int ac; Arg arglist[10]; XtCallbackRec callback_arg[2]; start_watch(); 【1】if (!print_widget) { if (MrmFetchWidget (s_MrmHierarchy, "main_print", toplevel_widget, &print_widget, &dummy_class) != MrmSUCCESS) s_error ("can't fetch print widget"); 【2】callback_arg[0].callback = activate_print; callback_arg[0].closure = 0; callback_arg[1].callback = NULL; callback_arg[1].closure = NULL; ac = 0; 【3】XtSetArg (arglist[ac], XmNokCallback, callback_arg);ac++; 【4】XtSetArg (arglist[ac], DXmNsuppressOptionsMask, DXmSUPPRESS_DELETE_FILE | DXmSUPPRESS_OPERATOR_MESSAGE); ac++; 【5】XtSetValues (print_widget, arglist, ac); } 【6】XtManageChild(print_widget); stop_watch(); } . . .
例 7-6は,DECburgerサンプル・ プログラムのPrint ウィジェットが,DXmCreatePrintDialogルーチンを使用してどのように作成されるかを示しています。
. . . #include <DXm/DXmPrint.h> . . . 【1】 print_widget = (Widget)NULL; /* Print widget*/ . . . static void create_print() { unsigned int ac; Arg arglist[10]; 【2】static int num_copies; XmString print_format; 【3】XtCallbackRec callback_arg[2]; 【4】if (!print_widget) { num_copies = 2; 【5】callback_arg[0].callback = activate_print; callback_arg[0].closure = 0; callback_arg[1].callback = NULL; callback_arg[1].closure = NULL; ac = 0; 【6】XtSetArg (arglist[ac], DXmNnumberCopies, num_copies); ac++; XtSetArg (arglist[ac], DXmNunmanageOnOk, TRUE); ac++; XtSetArg (arglist[ac], DXmNunmanageOnCancel, TRUE); ac++; XtSetArg (arglist[ac], XmNokCallback, callback_arg);ac++; 【7】XtSetArg (arglist[ac], DXmNsuppressOptionsMask, DXmSUPPRESS_DELETE_FILE | DXmSUPPRESS_OPERATOR_MESSAGE); ac++; 【8】print_widget = DXmCreatePrintDialog (toplevel_widget, "Print Widget", arglist, ac); 【9】XtManageChild(print_widget); return; } 【10】XtManageChild(print_widget); } . . .
UILまたはツールキット・ルーチンのいずれかを使用してPrintウィジェットのインスタンスを作成した後は, そのプリント・ジョブをプリンタ・キューへ登録しなければなりません。 このために,DXmPrintWgtPrintJobルーチンが用意されています。Print ウィジェットのID,印刷するファイルのリスト, 印刷するファイルの数をDXmPrintWgtPrintJobルーチンへ渡します。
例 7-7は,DECburgerサンプル・ プログラムのDXmPrintWgtPrintJob ルーチンを呼び出す例を示しています。
. . . static void activate_print(w, tag, reason) Widget w; int *tag; XmAnyCallbackStruct *reason; { unsigned long int l_status; XmString file_pointer[1]; int l_num_names,l_i; char at_buffer[30]; FILE *fopen(), *fp; 【1】if ((fp = fopen("order.txt", "w")) != NULL) { fprintf(fp, "Function Not Yet Implemented\n"); fclose(fp); 【2】file_pointer[0] = XmStringCreateLtoR("order.txt", XmSTRING_DEFAULT_CHARSET); 【3】l_status = DXmPrintWgtPrintJob(print_widget, file_pointer, 1); 【4】printf("DXmPrintWgtPrintJob return status: %x\n",l_status); } } . . .