EnumFontName

使用可能なフォントの名前を列挙する

val = EnumFontName(NameBuffer, NameBufferNum)

char *NameBuffer : フォントの名前を格納する2次元配列の先頭アドレス
int NameBufferNum : 列挙するフォント名の最大数

(プラグイン / モジュール : DxLibW)

解説

この関数は、パソコンにインストールされているフォントの名前を
列挙することが出来ます。

ChangeFontCreateFontToHandle 等の関数は任意の名前を持つフォントの
データハンドルを作成することが出来るものの、標準以外のフォントは
パソコン個々でインストールされているものが違ったり、又はなかったり
するので、あるかどうかもわからないフォントを下手に指定することは
あまり望ましくありません。

そんな時にこの関数です。

この関数はパソコンにインストールされているDXライブラリで使用
可能なフォントの名前をすべて列挙し、指定の文字列配列に格納することが
出来ます。

この関数で列挙したフォントはすべて ChangeFontCreateFontToHandle 等で
使うことが出来るので、自分の使いたいフォントがパソコンにインストール
されているか調べたい時や、サウンドノベルなどの文章表示に使うフォントを
プレイヤーに選択してもらったりする時に利用できます。

さて使い方です。

まず一つのフォントの名前を格納するのに、DXライブラリでは余裕を
持って半角63文字分入る char 型配列を一つを使います。

char NameBuffer[64] ;    // フォント一個分

つまり、十個分のフォント名を格納するためにはこれが十個必要なわけ
ですから

char NameBuffer[10][64] ;    // フォント十個分

という2次元配列になります。

とりあえずパソコンにインストールされているフォント10個分の名前を
取得する例を次に示します。

char NameBuffer[10][64] ;

EnumFontName( &NameBuffer[0][0] , 10 ) ;

とまあこんな感じです。これで NameBuffer[0] から NameBuffer[9] までの
文字列配列にフォント名が入ります。

もしインストールされているフォントが10個以下だった場合はすべての
配列にはフォント名は格納されません、実際列挙されたフォントの数は
EnumFontName 関数の戻り値として返って来るので、この値を参照することに
より幾つのフォントが列挙されたのか知ることが出来ます。

char NameBuffer[10][64] ;
int FontNum ;

FontNum = EnumFontName( &NameBuffer[0][0] , 10 ) ;

これでもし FontNum に5が代入されたら、10個分のフォント名が列挙
出来る配列を渡したものの、実際には5個のフォント名しか列挙されなかった、
ということになります。


次に列挙したフォントをDXライブラリの文字列描画で使う方法を示します。

例えば上の例で列挙した一番最初のフォントを描画用フォントにしたい場合は

ChangeFont( NameBuffer[0] ) ;

とすることで変更できます。もし0番目に『MS 明朝』というフォント名が
格納されていたらこれ以後文字列描画に使われるフォントは MS 明朝体 に
変更されます。

これで列挙して利用するまでの一通りの説明は終りましたが、次に数を限定せずに
すべてのフォントを列挙する方法を解説したいと思います。

実際はバッファの数を200個などにしてしまえば、恐らくインストールされている
すべてのフォントを列挙することが出来るとは思いますが、世の中どれだけ沢山の
フォントをパソコンにインストールしている人がいるのかわかりませんので、一応
どんな状況でもすべてのフォント名を列挙する方法を示しておきたいと思います。

まず EnumFontName 関数の第1引数、つまりフォントネームを格納する配列
のアドレスを NULL にし、第2引数を0にして関数を呼び、戻り値を得ます。

int FontNum ;

FontNum = EnumFontName( NULL , 0 ) ;

すると、フォントネームは取得できないものの、フォントの数だけはしっかり
戻り値として返ってきます。この時戻り値として返ってくるのはパソコンに
インストールされているすべてのフォントの数です。

つまりこの戻り値の数分だけフォント名を格納出来るサイズを持った配列が
あればすべてのフォント名を列挙することが出来ます。が、実際にはプログラムの
実行中に動的にサイズを変えられる配列は存在しません。

ので、ここはCの標準関数である malloc を使います。この関数はパソコン上の
空きメモリから任意のサイズのメモリ領域を確保することが出来るので、これを
使ってすべてのフォント名を格納できるメモリ領域を確保することにします。

確保すべきメモリの量は 64バイト×戻り値 となります。64バイトというのは
言うまでもなく一つのフォント名に必要なメモリ領域です。(半角1文字の情報を
表現するのに必要なデータサイズは1バイト)

確保したメモリ領域のアドレスは char 型のポインタに格納します。

#include <malloc.h>

char *NameBuffer ;
int FontNum ;

FontNum = EnumFontName( NULL , 0 ) ;

// フォント名の数分だけメモリを確保
NameBuffer = ( char * )malloc( 64 * FontNum ) ;

次に確保したこのメモリ領域にフォント名を列挙し格納します。

#include <malloc.h>

char *NameBuffer ;
int FontNum ;

FontNum = EnumFontName( NULL , 0 ) ;
NameBuffer = ( char * )malloc( 64 * FontNum ) ;
EnumFontName( NameBuffer , FontNum ) ;

これで確保したメモリ領域にデータを格納することができました。

実際に使う時の注意としては、確保したメモリ領域は二次元配列ではないので、
フォント名を指定する時は

...

戻り値:
  列挙したフォント名の数

情報

プラグイン / モジュールDxLibW
バージョン3.24f
作成日2026/04/12
著作者DxLib: Takumi Yamada / HSP binding: IronHSP Project
URLhttps://dxlib.xsrv.jp/
備考hspdxlib.as をインクルードして使用
タイプDxLib ゲームライブラリ
グループDxLib フォント
対応環境
  • Windows 版 HSP
hs ファイルhsphelp\hspdxlib.hs