|
プリント情報を収集するアプリケーションについて想定されるワークフローに応じて、プリントに使用する元の 1つの方法としては、利用可能なプリンタのリストを取得し、ユーザにプリンタを1つ選ばせる方法があります。この方法は、アプリケーションの利用者がプリントオプションにあまり関心がなく、プリントすることだけが目的の場合に適しています。「利用可能なプリンタから選択する」でこの方法を説明します。 2つめの方法は、標準の「プリント設定」ダイアログボックスおよび「ページ設定」ダイアログボックスを使用して、ユーザにプリンタおよびプリント設定を選択させる方法です。この方法では、ユーザがプリンタを選択できる上に、ほかのオプション(たとえば、用紙サイズやレイアウトなど)も設定できます。この場合、プリンタの選択に加えてすべてのプリント設定も保存する必要があるかもしれません。「「プリント設定」ダイアログと「ページ設定」ダイアログからプリント設定を取得する」でこの方法を説明します。 どちらの場合も、肝心なのは環境設定のプリンタ選択を保存し、復元することです。これは「プリント設定の保存と読み込み」で説明します。 利用可能なプリンタから選択する利用可能なプリンタのリストは、 注: リスト1:利用可能なプリンタのリストの取得
OSStatus CreatePMPrintersAndPrinterNames( CFArrayRef *outPrinters, CFArrayRef *outPrinterNames )
{
*outPrinters = NULL;
*outPrinterNames = NULL;
// PMPrintersのリストを取得
OSStatus err = PMServerCreatePrinterList( kPMServerLocal, outPrinters );
if( err == noErr )
{
CFIndex i, count = CFArrayGetCount( printers );
// プリンタ名を保持するために別の配列を作成する。この配列を使用して、ユーザにプリンタを選択させる
// メニューまたはリストを作成できる。
CFMutableArrayRef printerNames = CFArrayCreateMutable( NULL, count, kCFTypeArrayCallBacks );
if( printerNames )
{
for(i = 0; i < count; ++i)
{
PMPrinter printer = (PMPrinter)CFArrayGetValueAtIndex( printers, i );
CFStringRef name = PMPrinterGetName( printer );
CFArrayAppendValue( printerNames, name );
}
}
*outPrinterNames = printerNames;
}
return err;
}
「プリント設定」ダイアログと「ページ設定」ダイアログからプリント設定を取得する標準の「プリント」ダイアログを使用してユーザがプリンタおよびプリント設定を選択できるようにすればさらに柔軟性が増します。そうすることで、ユーザは、プリントジョブのすべてのプリント設定をカスタマイズすることが可能になり、以降のプリントジョブのテンプレートとしてそれらの設定を保存できるようになります。ユーザが最初にプリントした後、そのプリント設定を保存し、後でその設定を使用することができます。リスト2に、「プリント」ダイアログを表示し、後で再利用できるようにプリンタおよびプリント設定を取得する方法を示します。 リスト2:「プリント」ダイアログのプリンタ情報を保存する
OSStatus CreatePageFormat( PMPageFormat * outFormat )
{
PMPrintSession printSession;
OSStatus err;
Boolean accepted;
// ページのフォーマットを作成するために、
// ユーザに「ページ設定」を使用してページフォーマットを設定させる。
*outFormat = NULL;
err = PMCreateSession( &printSession );
if( !err )
{
// セッションを作成できたので、ページフォーマットを作成しデフォルトに設定する。
err = PMCreatePageFormat( outFormat );
if( !err )
err = PMSessionDefaultPageFormat( printSession, *outFormat );
// 「ページ設定」ダイアログを表示する。ユーザが取り消すか、
// エラーが発生した場合、作成したページフォーマットを破棄し、
// NULLフォーマット、およびPMSessionPageSetupDialogから返された
// 任意のエラーを返す。
err = PMSessionPageSetupDialog( printSession, *outFormat, &accepted );
if( err || !accepted )
{
PMRelease( *outFormat );
*outFormat = NULL;
}
PMRelease( printSession );
}
return err;
}
OSStatus CreatePrintSettings( PMPageFormat ioFormat, PMPrinter * outPrinter, PMPrintSettings * outSettings)
{
PMPrintSession printSession;
OSStatus err;
Boolean accepted = false;
*outPrinter = NULL;
*outSettings = NULL;
// 「プリント設定」とプリンタの選択を作成するために、ユーザに
// 「プリント」ダイアログを使用して、それらの設定を作成させる。
err = PMCreateSession( &printSession );
if( !err )
{
// 現在のプリンタに照らして「ページフォーマット」を検証する。これによって
// フォーマットが更新される場合もある。
err = PMSessionValidatePageFormat( printSession, ioFormat, kPMDontWantBoolean );
// プリント設定を作成し、デフォルトに設定する。
if( !err )
err = PMCreatePrintSettings( outSettings );
if( !err )
err = PMSessionDefaultPrintSettings( printSession, *outSettings );
// 「プリント」ダイアログを表示する。
if( !err )
err = PMSessionPrintDialog( printSession, *outSettings, ioFormat, &accepted );
if( !err && accepted )
{
// ユーザが受け入れた場合、選択したプリンタを保持し、
// このセッション以降も存続するようにする。
// プリンタ取得時にエラーが発生した場合、
// NULLのままとなる
err = PMSessionGetCurrentPrinter( printSession, outPrinter );
if( !err )
PMRetain( *outPrinter );
}
else
{
// エラーが発生したか、ユーザによって操作が取り消された。
// そのため、設定を破棄しNULLにする。
// PMPrinterはまだ設定されていないため、NULLのままとなる。
PMRelease( *outSettings );
*outSettings = NULL;
}
PMRelease( printSession );
}
return err;
}
プリント設定の保存と読み込みユーザが以前に選択したプリンタへの参照を保存するもっとも簡単な方法は、CFPreferencesを使用することです。プリンタIDは、 警告:ユーザは実行時に、プリンタの構成を容易に変更できるので、コードにおいては、使用しているプリンタが存在しなくなるような状況に備えておく必要があります。そのような場合、コードのなかでユーザに新しいプリンタを選択させるようにします。「プリンタIDを検証する」に有効性を確認する方法の1つを示します。 リスト3:環境設定にプリント設定を保存する
OSStatus SavePrintSettings( PMPrintSession inSession, PMPrintSettings inSettings, PMPageFormat inFormat )
{
CFStringRef printerID;
PMPrinter printer;
CFDataRef flatSettings, flatFormat;
OSStatus err, tempErr;
// 処理を始める前に、プリントセッションから現在のプリンタを取得する必要がある。
// プリンタの取得でエラーが発生した場合、単純にそのエラーを返し、ほかには何もしない。
err = PMSessionGetCurrentPrinter( inSession, &printer );
if( err == noErr )
{
// PMSessionGetCurrentPrinterが正常に戻ってきた場合、セッションが有効である限りプリンタは有効である。
// したがって、プリンタ名も有効であると想定する。
printerID = PMPrinterGetID( printer );
CFPreferencesSetAppValue( kPrinterID, printerID, kCFPreferencesCurrentApplication );
CFRelease( printerID );
tempErr = PMFlattenPrintSettingsToCFData( inSettings, &flatSettings );
if( tempErr == noErr )
{
// プリント設定をフラット化できる場合、環境設定に保存する
CFPreferencesSetAppValue( kPrintSettings, flatSettings, kCFPreferencesCurrentApplication );
CFRelease( flatSettings );
}
else
{
// プリント設定をフラット化できない場合、環境設定から削除する
CFPreferencesSetAppValue( kPrintSettings, NULL, kCFPreferencesCurrentApplication );
}
tempErr = PMFlattenPageFormatToCFData( inFormat, &flatFormat );
if( tempErr == noErr )
{
// ページフォーマットをフラット化できる場合、環境設定に保存する
// フラット化できない場合、別のプリンタにページフォーマットを再利用できる
CFPreferencesSetAppValue( kPageFormat, flatFormat, kCFPreferencesCurrentApplication );
CFRelease( flatFormat );
}
}
return err;
}
リスト4:環境設定からプリント設定を復元する
void CopyPrintSettings( CFStringRef * outPrinterID, PMPrintSettings * outSettings, PMPageFormat * outFormat )
{
CFDataRef flatSettings, flatFormat;
*outPrinterID = CFPreferencesCopyAppValue( kPrinterID, kCFPreferencesCurrentApplication );
*outSettings = NULL;
*outFormat = NULL;
// CFPreferencesを通じてプリンタIDを読み込む
if( *outPrinterID != NULL )
{
flatSettings = CFPreferencesCopyAppValue( kPrintSettings, kCFPreferencesCurrentApplication );
flatFormat = CFPreferencesCopyAppValue( kPageFormat, kCFPreferencesCurrentApplication );
// フラット化解除のエラーが発生した場合、対応する設定はNULLになり、設定が
// なかったことを示すので、フラット化解除エラーは無視する。
if( flatSettings != NULL )
{
PMUnflattenPrintSettings( flatSettings, outSettings );
CFRelease( flatSettings );
}
if( flatFormat != NULL )
{
PMUnflattenPageFormatWithCFData( flatFormat, outFormat );
CFRelease( flatFormat );
}
}
}プリンタIDを検証するユーザは、アプリケーションの実行中を含め、いつでもプリント設定を再構成できるため、シームレスな動作をさせるためには、プリント操作を行う前に、利用するプリンタを必ず確認する必要があります。これを実現するには、プリンタIDから リスト5:プリンタIDの有効性を確認する
// この関数は、プリンタを検証する方法の1つを示す。
// これよりも賢明な方法としては、プリンタの作成を試み、
// 成功した場合はそのプリンタを使用し、失敗した
// 場合は、ユーザに設定を更新させる。
Boolean IsValidPrinter( CFStringRef inPrinterID )
{
PMPrinter printer = PMPrinterCreateFromPrinterID( inPrinterID );
Boolean valid = printer != NULL;
// エラーが返されるだけなので、PMReleaseにNULLを渡しても問題ない。
// NULLでないプリンタを確実に解放することだけが目的であるため、
// エラーを無視して問題ない。
PMRelease( printer );
return valid;
}
ドキュメント改訂履歴
掲載日: 2007-03-29 | ||||||||||
|