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