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);
}
}
.
.
.