26
 フォント 



多くのウィジェットで文字を表示することができますが、その文字のフォントを指定する方法を解説します。

 
 
フォント情報の種類
 
 

 フォントを指定するに複数の表現形態があります。すべて文字列形式です。

(1)フォントファミリー
Windowsなどでの用語と同じです。
たとえば、
-----------------------
MS 明朝
-----------------------
といったものです。ファミリー名は日本語のこともあり、さらに上記のように空白を含むこともあります。MindのプログラムとGUIライブラリとの間でこの形式単独でやりとりをすることはありません。
(2)フォント情報
本ライブラリで使う形式です。フォント情報はフォントファミリーにサイズその他の属性加えたもので、実際に文字を表示するための情報となります。たとえば、
-----------------------
{MS 明朝} 24 italic
-----------------------
といったものです。Mindのプログラムでフォントを指定する時はこの形式を使います。
(3)フォントマクロ
フォント情報をシンボル化したものです。(マクロ定義のようなものです) たとえば、
-----------------------
TkDefaultFont
-----------------------
といったものです。必ず実体となるフォント情報に紐づけされます。

 
 
フォントの設定
 
 
以下で「フォント情報」と言うとき、前項目で解説した本来のフォント情報のほか、フォントマクロも指定できます。
■フォントを設定
 たとえば ラベル、ボタン、メッセージ といったウィジェットに対してフォントを設定することができます。

構文=
<フォント情報>を <ウィジェットID>に フォントを設定 → ・
       プログラム例:
    メインウィンドウで ラベルのIDを取得し ラベル1に 入れ
    「{MSP 明朝} 11」を ラベル1に フォントを設定し
 フォント情報は文字列なので、ソースコードに直接記入する場合は 「 」、あるいは " " のように記号で囲み、文字列定数とします。もちろん、文字列変数経由で指定したり処理単語を呼び出してそれから返された情報を使って構いません。その場合は囲み記号は要りません。
 ここでフォント情報の書き方を説明します。一般的な形式は、
(形式)              ↓オプション(文字列)
  {フォントファミリー} サイズ 属性 属性 ・・
              ↑整数
(例)
  {MS 明朝} 24 italic
 のようなものです。フォントファミリーを { } 記号でくくりますが、空白を含まない名称の場合は { } は不要です。ただ、常に { } を付けたほうが見た目として分かりやすいです。
 フォントファミリー名に続いてサイズを数字で書きます。
 さらにオプションとして属性を文字列として付与できます。属性は以下が有効です。
    ----------------------------
    属性の文字列   その意味
    ----------------------------
    bold       太字
    italic      斜体
    underline     アンダーライン
    overstrike    取り消し線
    ----------------------------

 
 
フォントマクロ
 
 

 GUIライブラリ内部で文字を描画するときのフォントが二段階で処理されることがあります。
 たとえば特にフォント指定をしていないラベルウィジェットに何か文字を表示する際、GUIエンジンが最初に適用するものはフォントマクロとしての「TkDefaultFont」です。この場合は、このフォントマクロがさらに実体としてのフォント情報に対応する、といった二段になっています。
 既に定義されているフォントマクロは以下の通りです。
  ----------------------------------------------------------
  Mind単語名    その値(文字列定数)  意味
  ----------------------------------------------------------
  TkDefaultFont  「TkDefaultFont」   標準フォント
  TkTextFont   「TkTextFont」     標準テキストフォント
  TkFixedFont   「TkFixedFont」     標準固定幅フォント
  TkMenuFont   「TkMenuFont」     標準メニューフォント
  ----------------------------------------------------------
 フォントマクロは1語の文字列です。長いフォント情報もこの1語で代替できることが利点です。
 ソースコードに記述する際の打ち間違えを防ぐため、同名のMind単語としても定義されています。たとえばプログラム中に、
  (非推奨)
   「TkDefaultFont」を ・・
などと記入すると打ち間違いなどもあるため、この値を返す同名Mindの単語を別途定義してあります。それを使えば、
  (推奨)
   TkDefaultFontを ・・
のように書け、万が一綴りを間違えたときはコンパイラがエラー検出できます。

TkDefaultFont(標準フォント名)
ラベル、ボタン、メッセージなど、非常に多くのウィジェットで共通に参照されるフォントマクロです。もちろん具体的なフォント情報が別途ひも付けられています。
TkTextFont(標準テキストフォント)
テキストウィジェットだけに適用されるフォントです。
TkFixedFont(標準固定幅フォント)
TkMenuFont(標準メニューフォント)
メニューウィジェットだけに使われます。

 
フォントマクロの登録・置換
 

■フォントマクロを登録
 ユーザが新しいフォントマクロを登録することができます。

構文=
                                ↓文字列 <フォント情報>を <マクロ名>に フォントマクロを登録 → <マクロ名>
       プログラム例: font-create.exe を起動してみてください
イベント処理・フォント作成テストとは (パラメータ1、パラメータ2、・・、パラメータ数)
        登録名は 文字列

    〜略〜

    「{MS 明朝} 24」を 「myfontA」で フォントマクロを登録し
                            登録名に 入れ
    登録名を ラベル1記憶に フォントを設定し
    ラベル1記憶を 変更反映し
 上記例では、「myfontA」という名前で新しいフォントマクロを登録し、そのマクロ名で既に描画済みの”ラベル1”の文字を書き換えています。
 返されるマクロ名(文字列)ですが、GUIライブラリ内部の文字列実体変数に格納された後、そこを指す文字列情報をスタックに返して来ます。もし得られた文字列を直ちに消費しないまま再度呼び出すると上書きされてしまうため、ユーザが用意した文字列実体変数に退避するなど工夫してください。しばらく経ってから再度このマクロ名を使う場合も同様です。
 さて、「フォントマクロを登録」するとどういう良いことがあるのか・・ですが、
 一つには、プログラムのあちこちに同じフォント情報を書くのは無駄ですが、フォントマクロなら簡略かつ一括で処理できるます。将来フォントを変更することになったとき、マクロ定義の1個所だけ変更すれば良いからです。(ただ、これについてはひんぱんに利用するフォント情報を変数に入れておくとか、処理単語定義にする方法もあります)
 もう一つは、フォントマクロとして登録しておくと、GUIエンジンの処理が少しだけ速くなることです。(登録時点でフォント情報の解析が済んでいるので)

■フォントマクロを置換
 フォントマクロに紐づけられているフォントを別のフォントにすり替える機能です。指定したフォントマクロを使っているすべてのウィジェットが即時に書き換わります。
 内部処理としてはフォントマクロを削除したあと、登録をおこなっています。

構文=
<フォント情報>を <マクロ名>に フォントマクロを置換 → ・
       プログラム例: font-stdfont-change.src
    「{MS 明朝} 32」を TkDefaultFontに フォントマクロを置換し

                ↓ボタンを押すとフォントが変化

 実際に font-stdfont-change.exe を起動してみて欲しいのですが、既に描画されたウィジェットの3つが一括してフォント変更されています。具体的には「TkDefaultFont」にひも付けられる実際のフォントを別フォントに取り換えています。
 既に描画された文字であっても即時で書き換わります。

■フォントマクロを削除
 フォントマクロの登録を削除します。

構文=
<マクロ名>を フォントマクロを削除 → ・
標準系フォントマクロを削除すると動作が保証されません。ユーザが登録したフォントマクロに限ってください。


 
 
フォントの参照
 
 

 指定したウィジェットにどのようなフォントが割り当てられているかを参照で きます。

■フォントの参照と具体化

構文=
(ステップ1) <ウィジェットID>の フォントを参照             → <フォントマクロorフォント情報> (ステップ2) <フォントマクロorフォント情報>の フォント情報を具体化             → <フォント情報>       記:「フォント情報を具体化」に最初から具体値を         与えた場合はそのままの値を返します
 フォントの取得は2段階き手続きになります。
 まず、ウィジェットIDを積んで「フォントを参照」を呼び出すと、
     フォントマクロ or 具体的なフォント情報
のいずれかが得られます。
 サンプルプログラム font-stdfont-show.exe を実行すると上記標準フォントを確認することができます。
 もし最終的に(マクロ名ではなく)具体的なフォント情報が欲しいのであれば、
     ○○を フォントを参照し フォント情報を具体化し
のように2語を連結して実行すれば具体的なフォント情報を得られます。

       プログラム例: font-getinfo を実際に起動してみてください
        フォントは   文字列
        フォント情報は 文字列
    〜略〜
    テキストボックス記憶の フォントを参照し フォントに 入れ
    〜略〜
    フォントを フォント情報を具体化し フォント情報に 入れ
            ↓実行結果



 
 
システムフォントの取得
 
 

 今走行しているOSで使えるすべてのフォント情報を取得することができます。
"font-all-in-system-list.exe" は利用可能なすべてのフォントを確認するツールとしても利用できます。

■すべてのシステムフォントを得る

構文=
                  ↓文字列 すべてのシステムフォントを得る → 全フォント情報(圧縮形式)
 利用可能なすべてのフォント(正確には、フォントファミリーの羅列)を独自に圧縮した長い文字列として返します。ライブラリ内部に確保した文字列実体に格納した後、そこを指す文字列情報として返しますからユーザでの格納は、
    ○○は 文字列
で構いません。

■一つのシステムフォントを切り出し

構文=
<全フォント情報> 一つのシステムフォントを切り出し                 → 全フォント情報、フォントファミリー
 先の「すべてのシステムフォントを得る」で得られた全フォント情報を与えると、先頭の一つを切り出して返してきます。残りの全フォント情報も積まれてくるので、繰り返し実行することですべてのフォントを一つずつ取り出して一覧表示する・・などの処理ができます。
       プログラム例: font-all-in-system-list.src が類似のことをやっています。起動してみてください
        全情報は   文字列
        ファミリーは 文字列
    すべてのシステムフォントを得て 全情報に 入れ
    ここから
        全情報から
         一つのシステムフォントを切り出し
          全情報と ファミリーに 入れ
        ファミリーが 空列?
            ならば 打ち切り   ←すべて切り出すと最後は
            つぎに         空列が返されます
        ファミリーを ・・・・・し
    繰り返し
 上記のようなループ処理にすることが多いと思います。
font-all-in-system-list.exe の画面:
 (全フォントのうち頭に @ が付いたもの(縦書き用)はループ内で無視するなど、もう少しコードが長くなっています)