タイトル小池邦人のプログラミング日記》2001/7/12<プリントアウトでSheet Windowを使う>カテゴリーCarbon/CF, ユーザインタフェース, 小池邦人のプログラミング日記
作成日2001/7/12 15:15:39作成者新居雅行
今回は、プリントアウトに用いる「用紙設定ダイアログ」と「プリントダイアログ」を、Sheet Windowとして表示させる方法を解説したいと思います。ただし、Navigation Service 3.0と同様に、Sheet Windowが利用できるのはMac OS Xのみとなります。

用紙設定ダイアログとプリントダイアログをSheet Windowとして表示させるためには、先んじて、Carbonアプリケーションのプリントアウトに関わるソースコードをSession APIに対応させておく必要があります。Session APIについては、Apple社のMac OS Xサイトの「Core Technologies」にある「Inside Carbon: Adopting the Carbon Printing Manager」というドキュメントを参照してください。

◇Inside Carbon: Adopting the Carbon Printing Manager
 http://developer.apple.com/techpubs/macosx/CoreTechnologies/graphics/Printing/printing.html

実際の作業は、CarbonLib 1.3.1GM SDKに含まれる「PrintSample」サンプルプロジェクトを参考にすると良いでしょう。これらのAPIを使う時には、Universal Interfaces 3.4が必要です。このうち、Printing Session APIや、それに関連する定数が定義されているヘッダーファイルは、PMCore.hとPMApplication.hとPMDefinitions.hの3つです。一度チェックしてみてください。

Session APIを利用すれば、プリントアウト処理(Task)がSession単位で管理され、同時に複数のプリントアウトが可能になります。つまり、複数のプリントアウト処理が、それぞれ別スレッドで走るわけです。Session APIの真の実力は、Mac OS Xでプリントアウトする時のみに発揮されるので、Mac OS 8/9では大きな機能変化はありません。今回は、アプリケーションが起動されている環境を調べることにより、Mac OS Xの時だけSheet Windowを使うように工夫してみました。

両ダイアログをSheet Windowとして表示する場合には、ユーザがダイアログのボタンをクリックした以降の処理をコールバックルーチンに記述しておく必要があります。そこで、起動時にsetUpPrint()ルーチンを呼び、両ダイアログで用いるコールバックルーチンのエントリーポイントを保存しておきます。

 

このうち、pageDoneProc()ルーチンが用紙設定ダイアログで使われ、printDoneProc()ルーチンがプリントダイアログで使われます。アプリケーションの起動環境がMac OS Xでなければ(chkSysOSX()で調べている)、こうした処理は必要ありません。

最初は、用紙設定ダイアログを表示するためのdoPageSetup()ルーチンを見てみます。

 

今までのプリント処理は、PMBegin()で開始し、PMEnd()で終了する必要がありました。Session APIの場合には、PMCreateSession()でSessionを確立する事から始め、最後にPMRelease()でSessionを解放します。ダイアログとしてSheet Windowを使いたい時には、PMSessionUseSheets()を実行し、それにコールバックルーチンのPMSheetDoneUPP(page_doneUPP)を渡しておきます。通常のダイアログであれば、ユーザがボタンをクリックするまでPMPageSetupDialog()から抜け出ることはありません。また、抜け出した時点でダイアログは閉じられていますので、そのままSessionを解放しても問題ない訳です。ところが、Sheet Windowを用いた場合には、すぐさまMPageSetupDialog()から抜け出してしまいます。よって、Sessionを解放するためのPMRelease()は、pageDoneProc()側で実行する必要があります。

続いて、プリントダイアログをオープンするdoPrintOut()ルーチンです。

 

用紙設定の時と同じく、Sheet Windowを使う時には、PMSessionUseSheets()にPMSheetDoneUPP(print_doneUPP)を渡します。PMCreatePrintSettings()でダイアログに必要なPMPrintSettings構造体を作り、PMSessionDefaultPrintSettings()でデフォルト値を代入してからPMSessionPrintDialog()を呼べば、プリントダイアログが表示されます。起動環境がMac OS 8/9であれば、ダイアログの「プリント」ボタンがクリックされたことを確認してから、imagePrint()ルーチンによる画像プリントを行います。処理が終了したら、PMPrintSettings構造体やSessionを解放します。しかし、Mac OS XでSheet Windowを使っている場合には、これとまったく同じ処理を、コールバックルーチンのprintDoneProc()で実行している事が分かります。

最後は、プリントアウトを実行しているimagePrint()ルーチンです。

 

始めに、makePrintPicture()で対象画像をPICTデータに変換します。SessionのJob名にはウィンドウタイトルを使い、CFStringCreateWithPascalString()でUnicodeベースの文字列に変換してからPMSetJobNameCFString()で設定します。PMSessionBeginDocument()とPMSessionBeginPage()は、非Session APIで使っていたPMBeginDocument()とPMBeginPage()に対応しています。準備が終わったら、PMSessionGetGraphicsContext()でQuickDrawによるプリントアウトを指示し、描画対象となるCGrafPtrを得ておきます。それをカレントポートに設定してDrawPicture()を実行すれば、プリントデータのSpoolingが開始されます。これが、Mac OS XでのCore Graphics(Quartz)を用いた描画であれば、その処理方法が変わりますので注意してください。描画後にPMSessionEndPage()とPMSessionEndDocument()を実行すれば処理は完了です。

では、Mac OS Xでファイルメニューの「用紙設定...」と「プリント...」を使ってみます。両ダイアログとも、対象ウィンドウのタイトルバーから降りてくるSheet Windowとして表示されます。この時、各メニューアイテムのメンテナンスは自動で行われませんので、必要があれば自分自身で行ってください。私が愛用しているプリンタは、沖データの「MICROLINE12n」です。この機種は、AppleTalk(EtherTalk)で接続する非PostScriptプリンタなのですが、ラッキーなことに、以下のサイトからMac OS Xに対応したサンプル版ドライバを入手することが可能です。

◇MICROLINE Mac OS X での対応状況
 http://www.okidata.co.jp/Event/MacOSX/macOSXNative.html

Mac OS Xにプリンタドライバをインストールしたら、先んじてプリントダイアログのプリンタメニューから「プリンタリストを編集...」を選び、「Print Center」で、そのドライバをリストに追加しておく必要があります。

 

「プリント追加...」ボタンをクリックし、上部メニューで「AppleTalk」を選べば、リストに「ML12L」が表示されるので、これを追加します。

 

この時、システム環境設定でAppleTalkをONにしておくことを忘れないでください。また、用紙設定ダイアログのフォーマットメニューも「ML12N」へと切り替えておきます。

 

用紙サイズを選んだら、引き続きプリントダイアログを表示し、「プリント」ボタンをクリックすれば印刷が開始されます。

 

次回は、プログラミングの話しを一回休憩し、7/17から7/20までNew Yorkで開催されるMacworld Conference & Expoの様子を取り上げてみたいと思います。さて、待望のMac OS X 10.1は、この会期中に発表されるのでしょうか?お楽しみに!!
[小池邦人/オッティモ]
関連リンクオッティモ