● ToolBox API徒然草(2007/04/17)

  このニュースは、MOSAの会員にのみ配布されているデベロッパー向けの
  デジタルマガジンMOSADeNのに掲載された記事です。ほぼ一ヶ月遅れで
  ここに掲載されて行きます

 〜 Carbonモダンアプリケーションへの道(その12) 〜


前回紹介したHIThemeDrawTextBox()は、Compositing指定されたウィンドウやコントロール(HIView)のテキスト描画を担当しています。今回は、HIThemeTextInfo構造体の内容をさらに詳しく調べ、このAPIを用いたテキスト描画にチャレンジしてみます。

HIThemeTextInfo構造体は、3番目の引数としてHIThemeDrawTextBox()に渡します。その内部には以下のような9つのメンバが定義されています。



今のところversionにはゼロを代入するよう指示されています。次のThemeDrawStateですが、Appearance.hを調べてみると以下のような定数が定義されています。




これだけを見ると、コントロールの各状態に準じて(例えばInactiveなら薄く)テキストを描画をしてくれそうな感じなのですが、実際にはstateにどの定数を代入しても描画状態に変化はありません。現状では機能が実装されていないのか?指定するフォント種類によって違うのか?それとも継承して間接的に使うパラメータなのか?その理由は不明なのですが、とりあえずはkThemeStateActiveを代入しておけば問題なさそうです。3番目のThemeFontIDは、同じくAppearance.hにおいて以下の様に定義されています。



かなり種類が多いので、個々の定数がどういう意味を持つのかを説明することは省略します。それぞれの違いを理解するには、ヘッダファイルに記載されているコメントを参照するのが近道です。例えば、kThemeSmallSystemFontは、Smallサイズのコントロールのテキストを描画する時に用いられるフォントで、kThemeMiniSystemFontだと、Mac OS X 10.3から採用されたMiniサイズのコントロールのテキストを描画する時に用いられるフォントを指示します。

注意すべき点は、ThemeFontIDはダイレクトにフォントの種類を設定するパラメータではないと言うことです。例えば、fontID=-28671のように「ヒラギノ明朝 W3」のフォント番号をダイレクトに代入しても正しくテキストは描画はされません(何も表示されない)。描画用フォントに「ヒラギノ明朝 W3」の「24ポイント」を使いたい場合には、fontIDにはkThemeCurrentPortFontを代入しておき、描画対象となるCGrafPort(port)に対し、以下のような指定をすればOKです。

SetPortTextFont( port,-28671 ); // ヒラギノ明朝 W3
SetPortTextSize( port,24 ); // 24ポイント

このThemeFontIDですが、「Interface Builder」を使うと、ウィンドウに配置したコントロールに対して個別に設定することが可能です。対象となるコントロールのInspectorウィンドウを開き、上部のポップアップメニューで「Control」を選択します。すると、真ん中あたりに「Font Style」というポップアップメニューが表示されますので、そのメニュー項目を見ると、先ほど紹介したThemeFontIDの種類がすべて並んでいることが分かります。

HIThemeTextHorizontalFlushは、テキストを矩形枠の左右か中心のどちらに揃えて描画するのかを決定します。同様に、HIThemeTextVerticalFlushの方は、テキストを矩形枠の上下か中心のどちらに揃えて描画するのかを決定します。



次のHIThemeTextBoxOptionsは、現状では一種類のみ定義されていますが、このオプションを設定しても描画状態に変化は起こりません? こちらも機能未実装なのでしょうか? ThemeDrawState同様に謎のパラメータです(どなたか効果を御教授ください)。



HIThemeTextTruncationは、テキストが矩形内に表示しきれなかった場合の処理を指示します。Finderのファイル名表示でファイル名が長すぎると、途中に省略していることを示す「...」が表示されますが、その印を付けるかどうかの指定ができます。この時、次のtruncationMaxLinesにより表示するテキスト最大行数を指定しておく必要があります。またテキストの切り捨て(全部表示できなかった)が発生した時には、truncationHappenedにtrueが返りますので、何らかの対策を実行するかどうかの判断が可能となります。



上記の定数は、Appearance.hではなくHITheme.hの方に定義されていますので注意してください。HIThemeDrawTextBox()に対してHIThemeTextInfo構造体の内容を全て設定して渡していると煩雑ですので、簡易的にテキストを1行だけ表示するルーチンの例を上げてみます。このルーチンでは、引数で渡すHIThemeTextInfo構造体のパラメータは、フォントIDと左右の描画位置の2種類のみとなっています。



次回は、HIThemeDrawTextBox()によるテキスト描画を印刷(プリントアウト)に利用してみたいと思います。印刷といっても、ウィンドウ上のテキスト描画とそれほど違いはないのですが、幾つか注意すべきポイントを解説したいと思います。

つづく


copyright 2007 Ottimo, Inc. All rights reserved
無断転載・引用禁止