タイトル【小池邦人のプログラミング日記】2000/8/6<Mac OS Xへの道 Carbon対応の実際(3)>カテゴリーCarbon/CF, 小池邦人のプログラミング日記
作成日2000/8/8 8:54:51作成者小池邦人
既存のソースコードをCarbon APIに対応させ、Mac OS X環境でも起動できるアプリを作るための工程のうち、今回は(5)のPrint Manager APIの書き換えについて解説します。

(5)Print Manager関連のAPIを変更

Carbon環境では、以前(Mac OS 8/9)のAPIは、なるべくそのまま利用できるように考慮されています。(と言うか、それがCarbonの存在意義なのですが...)よって、古すぎて使用不可になったAPIを除き、旧ソースコードのAPIを書き換える必要はほとんどありません。ごく普通のアプリケーションのソースコードなら、85%から90%は書き換え無しでCarbon環境へ移行できると思われます。しかし、Carbon環境にはAPIが完全に書き換えられているToolBox Managerがふたつ存在します。そのうちのひとつが「Print Manager」です。Print Managerは、ToolBoxの中でもほとんど変更されることがなかった「最古」のManagerです。(化石になりかかっていた)よって、Appleがこの機会に「Manager自体の大修理が必要であろう!」と判断したようです。

例えば、旧Print Manager APIで用紙設定ダイアログを表示する処理を記述すると以下の様になりました。ドキュメントファイルのデータ内、もしくは’PREC’リソースに保存しておいたTPrint構造体(用紙情報)のハンドラ(THPrint)をPrStlDialog()に渡すだけの非常に簡単な仕組みです。(この処理ではTHPrintの内容が正しいかどうかは判断していませんので注意してください)

Boolean oldPageSetup(THPrint *thd)
{
Boolean ret;

PrOpen();
if( ! thd )
{
*thd=(THPrint)NewHandle( sizeof( TPrint ) );
PrintDefault( *thd );
}
ret=PrStlDialog( *thd );
PrClose();
return( ret );
}

これを新しいPrint Manager APIで記述し直すと、以下の様に変わります。旧Print Managerに関するヘッダーファイルは「Printing.h」だったのですが、CarbonLibでは「PMApplication.h」を用いますので注意してください。旧APIとの区別のために、新APIには、すべて頭に「PM」の文字が入ります。また、新Print Manager APIを使った処理は、必ずPMBegin()で開始し、PMEnd()で終了する必要があります。

新Print ManagerではTPrintの代わりにPMPageFormat構造体を利用します。ただし、このメンバーには直接アクセスすることはできません。まずは、リソースなどに保存したドキュメントの用紙情報(*phd)をPMUnflattenPageFormat()に渡しPMPageFormatを作成します。ドキュメントが用紙情報を持っていない場合には(*phdがnilの場合)PMNewPageFormat()とPMDefaultPageFormat()を使い、新しいディフォルトPMPageFormatを作成します。用紙設定ダイアログはPMPageSetupDialog()を呼ぶことでオープンします。ユーザによりダイアログのOKボタンが押されると、PMFlattenPageFormat()で新しいハンドラ(phd1)を得て、それをドキュメントに保存し直すようにします。

Boolean newPageSetup(Handle *phd)
{
PMPageFormat form;
Handle phd1;
Boolean ret;

PMBegin();
if( *phd )
PMUnflattenPageFormat( *phd,&form );
else
{
PMNewPageFormat( &form );
PMDefaultPageFormat( form );
}
PMPageSetupDialog( form,&ret );
if( ret )
{
DisposeHandle( *phd );
PMFlattenPageFormat( form,&phd1 );
*phd=phd1;
}
PMDisposePageFormat( form );
PMEnd();
return( ret );
}

続いてプリントアウトの例です。PMPrintDialog()でプリントアウトダイアログを表示するには、PMPageFormatに加えて、PMPrintSettings構造体も必要となります。PMPrintSettingsにはプリントダイアログでユーザが設定した情報が保存されています。プリントダイアログでOKボタンが押されると、プリント環境へアクセスするためにPMBeginDocument()にょりPMPrintContextを得ます。この例で実際にプリントを実行しているのはdoMyPrintOut()ルーチンですが、これはQuickDrawの描画ルーチンなどを用いてユーザ自身で作成することになります。(この仕組みは変わらない)旧Print Managerを利用してプリントアウト処理を実行したことがある方なら、新APIでも処理の流れ自体はそんなに大きく変化していないことが理解できると思います。

Boolean newPrintOut(Handle phd)
{
CGrafPtr cptr,port;
PMPageFormat form;
PMPrintContext pctx;
PMPrintSettings set;
PMRect pmrt;
Boolean ret;

GetPort( &cptr );
PMBegin();
if( phd )
PMUnflattenPageFormat( phd,&form );
else
{
PMNewPageFormat( &form );
PMDefaultPageFormat( form );
}
PMNewPrintSettings( &set );
PMDefaultPrintSettings( set );
PMPrintDialog( set,form,&ret );
if( ret )
{
if( ! PMBeginDocument( set,form,&pctx ) )
{
PMGetAdjustedPageRect( form,&pmrt );
if( ! PMBeginPage( pctx,&pmrt ) )
{
PMGetGrafPtr( pctx,&port );
SetPort( port );
doMyPrintOut();
PMEndPage( pctx );
}
PMEndDocument( pctx );
}
}
PMDisposePageFormat( form );
PMDisposePrintSettings( set );
PMEnd();
SetPort( cptr );
return( ret );
}

次回は(6)以降の工程について詳しくお話しする予定です。APIが完全に変更されたもうひとつのMnagerである「Scrap Manager」の話しが中心となります。
関連リンクオッティモ