|
Technote 1080
Adding Items to the Printing Manager's Dialogs
目次
Printing Managerと互換性を保つためのガイドライン
印刷ダイアログの心臓部:TPrDlgレコード
印刷ダイアログの仕組
独自の項目を追加する
サンプルコード
概略 |
このテックノートはPrinting Managerのダイアログに独自の項目を追加する方法について説明します。以前はTechnote
PR 09 -- Print Dialogs: Adding Itemsと名付けられていました。
Printing Managerを設計するにおいて、アプリケーションが印刷デバイスごとに違った対応を取らなくてもいいよう、全般的なインタフェースが用いられました。しかし、このようなインタフェースではアプリケーションの柔軟性が限られてしまうことがあります。たとえば、印刷の際に印刷ダイアログの標準オプション以外の設定情報を必要とするアプリケーションがあります。このテックノートでは、印刷ダイアログ及び用紙設定ダイアログに独自の項目を追加する方法を紹介します。
このテックノートでは現在のMacintosh Printing Managerに対応するとともに、サンプルコードもPascalからCに移行されました。
ここで紹介されているサンプルコード(PDlogExpand.hqx)は、このテックノートの最後にあるダウンロード項目でダウンロードすることができます。 |
Printing Managerと互換性を保つためのガイドライン
MacintoshのPrinting Managerは今後も改良されていきます。そこで、Printing Managerが変更されても、アプリケーションとの互換性を維持するためのガイドラインを紹介します。
印刷ダイアログに独自の項目を追加する際は、このテックノートで紹介する方法に従って下さい。他の方法で項目を追加すると、互換性が維持できなくなる可能性があります。
印刷ダイアログの既存項目を削除したり、項目リストに項目を挿入しないで下さい。項目を増やす場合は必ず項目リストの末端に追加して下さい。
既存項目の番号は変わる可能性があるので、項目番号に依存した設計はしないで下さい。たとえば、ImageWriterの用紙設定ダイアログにあるドラフトボタンの番号に依存をしているアプリケーションは、ドラフトボタンの番号が変更された際に正常に動作しなくなります。
追加する項目は必ず画面の高さの半分以内でレイアウトして下さい。アップルは将来的に項目数を増し、画面の上半分全体を使用する可能性があります。また、LaserWriter
8.4では印刷ダイアログの設計が変更されましたが、その他の印刷ドライバと互換性を保つためにも、引き続き高さの制限を守って下さい。
LaserWriter 8.4.xでは、印刷ダイアログが全面的に改装されました。このテックノートに従って項目を追加していれば、追加項目は別のペーンにまとめて表示されます(ペーンのタイトルにはアプリケーション名が使われます)。万が一このテックノートで記されていない方法で項目を追加していらば、LaserWriter
8.4.xでは問題が発生します。詳しくはdevelop
27 -- Print Hints: The All-New LaserWriter Driver Version 8.4をご覧下さい。
印刷ダイアログの背景色と全面色は白と黒とは限らないので、コントロール類を描画する際は十分気をつけて下さい。また、背景色や全面色を無闇に変えたりすると他の項目に悪影響を及ぼし、サイケな色合いになりかねません。
印刷ダイアログの心臓部:TPrDlgレコード
印刷ダイアログの仕組を説明する前に、各ダイアログの心臓部となるTPrDlgレコードを理解する必要があります。TPrDlgは次のように、Printing.hで定義されています。
struct TPrDlg {
DialogRecord Dlg; /*The Dialog window*/
ModalFilterUPP pFltrProc; /*The Filter Proc.*/
PItemUPP pItemProc; /*The Item evaluating proc.*/
THPrint hPrintUsr; /*The user's print record.*/
Boolean fDoIt;
Boolean fDone;
long lUser1; /* Four longs reserved by Apple */
/* to hang global data.*/
long lUser2; /* More stuff needed by the */
/* printing dialog.*/
long lUser3;
long lUser4;
};
typedef struct TPrDlg TPrDlg;
typedef TPrDlg *TPPrDlg;
typedef TPrDlg *TPPrDlgRef;
印刷ダイアログに関する情報はすべてTPrDlgに保存されています。以下の説明ではこのTPrDlgを頻繁に参照します。
印刷ダイアログの仕組
アプリケーションからPrStlDialogやPrJobDialogを呼ぶと、プリンタドライバはPrDlgMain
()を呼びます。PrDlgMainは次のように定義されています。
extern pascal Boolean PrDlgMain (THPrint hPrint, PDlgInitUPP pDlgInit);
PrDlgMainはpDlgInitを呼び、ダイアログボックス自体(Dlg)、ダイアログフック関数(pItemProc)、ダイアログイベントフィルタ(pFilterProc)を初期化して、値をTPrDlgに書き込みます。印刷ダイアログの場合はPrJobInit、用紙設定ダイアログの場合はPrStlInitがPrDlgMainに渡されます。これらの関数は次のように定義されています。
extern pascal TPPrDlgRef PrJobInit (THPrint hPrint);
extern pascal TPPrDlgRef PrStlInit (THPrint hPrint);
TPrDlgレコードを初期化した後、PrDlgMainはShowWindowを呼びます(ダイアログは隠された状態で作成されています)。次に、ModalDialogを呼んで、pFltrProcに保存されているダイアログイベントフィルタを渡します。項目がクリックされると、pItemProcのコールバック関数で処理されます。OKボタンがクリックされる(またはreturnやenterキーが押される)とプリントレコードが有効になります。逆に、キャンセルボタンがクリックされるとプリントレコードは有効になりません。
独自の項目を追加する
印刷ダイアログに独自の項目を追加する場合は、ダイアログが表示される前にTPrDlgレコードを変更しなければなりません。項目リストの末端に追加する項目を加え、ダイアログフックとイベントフィルタのコールバック関数を自分の物と置き換えます。追加した項目は通常のダイアログ処理の過程で描画されます。
以下のサンプルコードでは、初期化関数がダイアログの項目リストに独自の項目を足しています。また、標準ダイアログフック関数をprPItemProcに保存し、TPrDlgレコードのpItemProcに新しいダイアログフック関数を設定します。ダイアログフック関数を置き換える場合は、コールバック関数の中から標準ダイアログフック関数を呼んで、既存項目を正しく処理しなければなりません。
サンプルコード
印刷ダイアログに項目を追加するCのサンプルコードです。
備考
イベントフィルタが必要な場合も、ダイアログフックと同じ要領で指定します。
概略
以上です。これで貴方も印刷ダイアログに項目を追加できるようになりました。
参考文献
ダウンロード項目
|