[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ]

# 7 Printウィジェットの使用

この章では，アプリケーション・プログラムでPrintウィジェットを使用する方法について説明します。Print ウィジェットの各リソースについて説明するとともに，UIL およびツールキットのPrintウィジェットのプログラミング例も示します。

# 7.1 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ウィジェットは印刷のためにファイルをフォーマットしたり変換しないため， アプリケーションはファイルを適切なプリント・ フォーマットで提供しなければなりません。

# 7.2 Printウィジェットの使用方法

この節では，アプリケーションでPrintウィジェットを使用する方法について簡単に説明します。 このプロセスについては，以降の節でさらに詳しく説明します。

Printウィジェットを使用するために，アプリケーションは次の手順を実行します。

1. UILを使用している場合，UILモジュールでPrintウィジェットのインスタンスを宣言する。

2. Printウィジェットを呼び出す方法，通常はカスケード・メニューの「印刷」プッシュ・ ボタンを組み込む。このプッシュ・ボタンのアクティベート・ コールバックは，Printウィジェットのインスタンスをフェッチするか， ツールキット・ルーチンを呼び出してPrintウィジェットを作成する。

3. Printウィジェットを管理して実現する。

4. ユーザがPrintウィジェットと会話して印刷オプションを選択するのを待つ。

5. 「了解」または「取消」のいずれかが選択されたら，所定のアプリケーション・ コールバックを呼び出す。「了解」プッシュ・ボタンの場合， アプリケーションは影響を受けたファイルに対するアプリケーション固有の準備をいつでも実行できる。 「取消」プッシュ・ボタンの場合は， ファイルが印刷されなかったことを示す処理を実行できる。

6. プリント・ジョブをキューに登録する用意ができたら， DXmPrintWgtPrintJobルーチンを呼び出す。

   DXmPrintWgtPrintJobは識別されたファイルを所定の印刷サービスへ実際に転送し終わって， プリント・ジョブの状態をアプリケーションに返す。

7. Printウィジェットの管理を解除する。これは再作成の時間を節約して， そのPrintウィジェットを，ユーザが前回の表示に設定したのと同じ設定で画面に再表示できるようにする。 アプリケーションはPrint ウィジェットの管理を単純に解除する代わりに，それを破壊することもできる。

# 7.3 Printウィジェットの構成要素

Printウィジェットのメイン・ダイアログ・ボックスには，1次印刷オプションが入っています。 「オプション...」プッシュ・ボタンを選択すると， 追加の印刷オプションが入っている2次ダイアログ・ボックスがフェッチされて管理されます。2 次ダイアログ・ボックスに表示されているオプションは， キューに登録されているファイルの種類，およびそれが印刷されるプリンタに合わせて適合化されます。

DECburgerサンプル・プログラムによって作成されたPrintウィジェットの構成要素を， 図 7_1と図 7-2 に示します。

### 図 7-1 Printウィジェットのメイン・ダイアログ・ ボックス

### 図 7-2 Printウィジェットの2次ダイアログ・ ボックス

# 7.4 Printウィジェットのコールバック

Printウィジェットは，表 7-1 に説明しているコールバックをサポートします。

### 表 7-1 Printウィジェットのコールバック

コールバック | 説明
--- | ---
XmNokCallback | ユーザがPrintウィジェットのメイン・ ダイアログ・ボックスで「了解」プッシュ・ボタンをクリックした。 DXmNunmanageOnOkリソースが設定されている場合，メイン・ボックスの「了解」ボタンが押されると，Print ウィジェットは自動的に自分自身の管理を解除する。 アプリケーションはXmNokCallbackコールバックを使用することにより，XtGetValues ルーチンを呼び出して，ユーザが選択した印刷オプションを取得して格納したり，DXmPrintWgtPrintJob を呼び出して，プリント・ ジョブをキューに登録するなど，ほかの機能を実行することができる。
XmNcancelCallback | ユーザがPrint ウィジェットのメイン・ダイアログ・ボックスで「取消」プッシュ・ ボタンをクリックした。DXmNunmanageOnCancelリソースが設定されている場合， メイン・ボックスの「取消」ボタンが押されると，Print ウィジェットは自動的に自分自身の管理を解除する。 アプリケーションはXmNcancelCallbackコールバックを使用して，ほかの機能を実行することができる。

# 7.5 Printウィジェットのファイル・タイプ推測機能

アプリケーション・プログラムでDXmNfileNameListリソースを指定すると，Print ウィジェットはそのファイル拡張子が存在すればそれを使用して， 最初に印刷するファイルのタイプと，関連するプリント・ フォーマットを推測します。その後，Printウィジェットはこのファイル・ タイプに基づいて，省略時の値をいくつか設定します。したがって， DXmNfileNameListリソースを使用してファイルのリストを指定する場合， それらのファイルはすべて同一のタイプでなければなりません。つまり， すべてのファイルがテキスト・ファイルであったり，PostScriptファイルであったりしなければなりません。

印刷するファイルの属性がわからない場合，アプリケーションはDXmNfileNameList リソースを使用して，Printウィジェットのファイル・ タイプ推測機能を使用します。Printウィジェットが印刷するファイルのフォーマットを誤って推測した場合には， ユーザが正しいプリント・ フォーマットを選択できます。

# 7.6 Printウィジェットのリソース

Printウィジェットの各種リソースを指定して，Printウィジェットをユーザに対して最初にどのように表示するかを定義できます。 これに関しては『日本語DECwindows Motif for OpenVMS拡張機能説明書』(日本語)，『DECwindows Extensions to Motif』(英語)に説明があります。ユーザはその後，必要に応じて印刷オプションを変更することができます。

メイン・ダイアログ・ボックスに入っているPrintウィジェットの各リソースは， 次のグループに分けられます。

- 一般的な設定

- プリント・フォーマット

- プリンタ

- ジョブ

2次ダイアログ・ボックスに入っているPrintウィジェットの各リソースは， 次のグループに分けられます。

- 一般的な設定

- 物理的な設定

- プリンタ

- ジョブ

注意
  Printウィジェットはオペレーティング・ システムから適切なプリンタと印刷フォームの情報を取得し， 次のリソースで使用するためのコンパウンド・ストリングを作成します。

  - DXmNprinterFormList

  - DXmNprinterFormCount

  - DXmNprinterList

  - DXmNprinterCount
  アプリケーションでこれらのリソースを設定しようとしてはなりません。 アプリケーションがこのリソースの値を必要とする場合には， XtGetValuesルーチンを呼び出してその値を取得します。

例 7-1は，Printウィジェットの各種リソースを設定するUIL の例を示しています。

### 例 7-1 UILによるPrintウィジェットの各種リソースの設定

       .
       .
       .
    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モジュールに明示的に設定していないリソースを指定することができます。 ユーザ選択リソースやプリンタの省略時のリソースは， デフォルト・ファイルに指定してください。

## 7.6.1 Printウィジェットの機能の禁止

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の値としては，次のものが可能です。

- DXmSUPPRESS_NONE

- DXmSUPPRESS_DELETE_FILE

- DXmSUPPRESS_NUMBER_COPIES

- DXmSUPPRESS_PAGE_RANGE

- DXmSUPPRESS_PRINT_FORMAT

- DXmSUPPRESS_ORIENTATION

- DXmSUPPRESS_PRINTER

- DXmSUPPRESS_PRINT_AFTER

- DXmSUPPRESS_PAGE_SIZE

- DXmSUPPRESS_SIDES

- DXmSUPPRESS_NUMBER_UP

- DXmSUPPRESS_SHEET_COUNT

- DXmSUPPRESS_FILE_START_SHEET

- DXmSUPPRESS_FILE_END_SHEET

- DXmSUPPRESS_FILE_BURST_SHEET

- DXmSUPPRESS_MESSAGE_LOG

- DXmSUPPRESS_HOLD_JOB

- DXmSUPPRESS_NOTIFY

- DXmSUPPRESS_SHEET_SIZE

- DXmSUPPRESS_INPUT_TRAY

- DXmSUPPRESS_OUTPUT_TRAY

- DXmSUPPRESS_JOB_NAME

- DXmSUPPRESS_OPERATOR_MESSAGE

- DXmSUPPRESS_HEADER

- DXmSUPPRESS_AUTOMATIC_PAGINATION

- DXmSUPPRESS_DOUBLE_SPACING

- DXmSUPPRESS_LAYUP_DEFINITION

- DXmSUPPRESS_START_SHEET_COMMENT

- DXmSUPPRESS_PASS_ALL

- DXmSUPPRESS_PRINTER_FORM

- DXmSUPPRESS_PRIORITY

- DXmSUPPRESS_SETUP

## 7.6.2 Printウィジェットの機能の追加

アプリケーションはDXmPrintWgtAugmentListルーチンを呼び出して，追加のプリント・ フォーマットを定義するとともに，Printウィジェットのオプション・ メニューに新規のオプションを追加することができます。 DXmPrintWgtAugmentListルーチンのフォーマットは次のとおりです。

         unsigned long int DXmPrintWgtAugmentList(pw,list,data)
                Widget   pw;
                int      list;
                caddr_t  data;

DXmPrintWgtAugmentListのpw引数は，Printウィジェットを識別します。list 引数は，次の定数から選択しなければなりません。

- DXmPRINT_FORMAT

- DXmPAGE_SIZE

- DXmSIDES

- DXmFILE_START_SHEET

- DXmFILE_END_SHEET

- DXmFILE_BURST_SHEET

- DXmMESSAGE_LOG

- DXmSHEET_SIZE

- DXmINPUT_TRAY

- DXmOUTPUT_TRAY

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 への呼び出しで，返された整数を使用します。

### 7.6.2.1 プリント・フォーマットの追加

プリント・フォーマットを追加するときは，list引数に定数DXmPRINT_ FORMAT，data引数にはタイプDXmPrintFormatStructの変数を使用します。 DXmPrintFormatStruct構造体のすべてのフィールドには，有効なコンパウンド・ ストリングが入っていなければなりません。NULLのコンパウンド・ ストリングは認められません。

追加されたフォーマットを選択すると，DXmNpassAllリソースはFALSE (無効) に，DXmNautoPaginationはTRUE (有効)に設定されます。このような動作を希望しない場合， アプリケーションはXmNokCallbackコールバックで，DXmNpassAll とDXmNautoPaginationを希望する設定値に設定しなければなりません。

例 7-2はプリント・フォーマットを追加する例を示しています。

### 例 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));
       .
       .
       .

### 7.6.2.2 オプション・メニューへの追加

Printウィジェットのオプション・メニューにオプションを追加するときは，list 引数にDXmPRINT_FORMAT以外の定数，data引数にタイプDXmPrintOptionMenuStruct の変数を使用します。

DXmPrintOptionMenuStructデータ構造体のui_stringフィールドには， 有効なコンパウンド・ストリングが入っていなければなりません。 DXmPrintOptionMenuStructデータ構造体のos_stringフィールドは， 有効なコンパウンド・ストリングまたはNULLのいずれかでなければなりません。

そのフィールドがNULLでない場合，ユーザがオプションを選択すると， Printウィジェットはオペレーティング・システムにos_stringフィールドの文字列を送信します。

そのフィールドがNULLの場合は，ユーザがオプションを選択しても， Printウィジェットはオペレーティング・システムに何も送信しません。 つまり，Printウィジェットは省略時の値が選択されたときのように機能します。

アプリケーションが各オプション・メニューに追加できるオプションの数は限られています。 アプリケーションが限定数以上のオプションを追加しようとすると，DXmPrintWgtAugmentList は0のステータスを返します。

例 7-3はメニューにオプションを追加する例を示しています。

### 例 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.7 UILによるPrintウィジェットの作成

例 7_4と例 7-5 は，DECburgerサンプル・プログラムでPrint ウィジェットを作成する方法を示しています。

### 例 7-4 UILによる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);
                   };

                };
       .
       .
       .

1. Printウィジェットのインスタンスを作成します。省略時の設定により，1 つまたは複数のファイルを2部印刷し，「了解」または「取消」のいずれかのプッシュ・ ボタンが押されるとPrintウィジェットの管理を解除します。

### 例 7-5 UILによるPrintウィジェットの作成- Cサポート

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

       .
       .
       .

1. Printウィジェットのインスタンスがまだ存在しない場合は， それをフェッチします。

2. コールバック・ルーチン・リストの要素へ値を割り当てます。 各コールバック・ルーチンのデータ構造体には，コールバック・ルーチンのアドレスとタグが入っています。 この場合，コールバック・ルーチンはactivate_print で，タグの値はありません。NULLの値はコールバック・ ルーチン・リストの終わりを意味しています。

3. XmNokCallbackリソースはNULLで終了する引数リストを使用して， ユーザが「了解」プッシュ・ボタンを押したときに呼び出すルーチンを決定します。

4. ファイル削除とオペレータ・メッセージの各リソースを制限します。

5. XtSetValuesを呼び出してPrintウィジェットの値を設定します。

6. Printウィジェットを管理します。

# 7.8 ツールキット・ルーチンによるPrintウィジェットの作成

例 7-6は，DECburgerサンプル・ プログラムのPrint ウィジェットが，DXmCreatePrintDialogルーチンを使用してどのように作成されるかを示しています。

### 例 7-6 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);
    }

       .
       .
       .

1. DECburgerではPrintウィジェットを，ソース・ファイル全体を通して参照できるように， グローバル・データ・セクションで定義します。DECburger はprint_widgetを明示的にNULLに初期化して，誤った値が入らないようにします。DECburger はあとでprint_widgetが存在するかどうかを検査し， 誤った値が入っている場合には予期しない結果が生じます。

2. 変数num_copiesはDXmNnumberCopiesリソースを設定するために使用されます。 この例は省略時の設定により，部数を2に設定します。

3. コールバック・ルーチン・リストをコールバック・ルーチンのデータ構造体の配列として宣言します。 配列には2つの要素が入っていることに注意してください。 コールバック・ルーチン・リストはNULL で終了するため，すべてのコールバック・ルーチン・リストには少なくとも2 つの要素が入っていなければなりません。

4. Printウィジェットがすでに存在するかどうかを検査します。 すでに存在する場合は，それを管理するだけでかまいません。

5. コールバック・ルーチン・リストの要素に値を割り当てます。 各コールバック・ルーチンのデータ構造体には，コールバック・ルーチンのアドレスとタグが入っています。 この場合，コールバック・ルーチンはactivate_print で，タグの値はありません。NULLの値はコールバック・ ルーチン・リストの終わりを意味しています。

6. 指定したい各リソースに対してXtSetArg Intrinsicsルーチンを1 回呼び出します。DECburgerは，DXmNunmanageOnOkとDXmNunmanageOnCancel の各リソースを設定し，Printウィジェットのメイン・ ダイアログ・ボックス内の「了解」または「取消」のいずれかのプッシュ・ ボタンが押されたときに，Printウィジェットの管理を解除するようにします。

7. DECburgerは「ファイル削除」および「オペレータ・メッセージ」の各オプションを禁止します。 つまり，ユーザはPrintウィジェットを使用して印刷中のファイルを削除することができず， またオペレータ・ メッセージも禁止されます。

8. DXmCreatePrintDialogルーチンを呼び出して，Printウィジェットを作成します。DXmCreatePrintDialog はPrintウィジェットのウィジェットID を返します。

9. 新規に作成されたPrintウィジェットを管理します。

10. Printウィジェットがすでに存在する場合，DECburgerは既存のPrint ウィジェットを管理するだけでかまいません。

# 7.9 プリント・ジョブのキューへの登録

UILまたはツールキット・ルーチンのいずれかを使用してPrintウィジェットのインスタンスを作成した後は， そのプリント・ジョブをプリンタ・キューへ登録しなければなりません。 このために，DXmPrintWgtPrintJobルーチンが用意されています。Print ウィジェットのID，印刷するファイルのリスト， 印刷するファイルの数をDXmPrintWgtPrintJobルーチンへ渡します。

例 7-7は，DECburgerサンプル・ プログラムのDXmPrintWgtPrintJob ルーチンを呼び出す例を示しています。

### 例 7-7 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);

        }

    }

       .
       .
       .

1. 書き込み用にorder.txtという名前のファイルをオープンします。 オープンできると，そのファイルに"Function Not Yet Implemented"というメッセージを印刷して，それをクローズします。

2. ファイル名からコンパウンド・ストリングを作成します。

3. DXmPrintWgtPrintJobルーチンを呼び出して，PrintウィジェットID ，order.txtファイルが入っているXmString配列，印刷するファイルの数(1) を指定します。

4. 標準出力にプリント・ジョブの状態を印刷します。

[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ]