2007年5月30日

フォントファイルをリソースに埋め込む(プライベートフォント)

アプリケーションのフォントをガチガチに固定したい場合ってないですか?
実行ファイルと同じフォルダに特定の名前にしておく。
それすらも禁止したい場合、無いですか?
ずいぶんむかしに、そんなケースがありました。んでもって、実現する方法がありました。

/*
 *
 *  ハンドルは、RemoveFontMemResourceEx で開放
 */
HANDLE LoadResourceFont( HINSTANCE hInst, UINT uID )
{
  HANDLE  hResFont;
  HGLOBAL  hGlobal;
  HRSRC  hRSrc;
  DWORD  dwSize, dwInst;
  LPVOID  lpLock = NULL;

  hResFont = NULL;
  hRSrc = FindResource( hInst, MAKEINTRESOURCE(uID), RT_FONT );
  if( hRSrc != NULL ){
    hGlobal = LoadResource( hInst, hRSrc );
    if( hGlobal != NULL ){
      dwSize = SizeofResource( hInst, hRSrc );

      lpLock = LockResource( hGlobal );
      if( lpLock != NULL ){
        hResFont = AddFontMemResourceEx( lpLock, dwSize, NULL, &dwInst );
      }
      FreeResource( hGlobal );
    }
  }
  return hResFont;
}

まず、フォントファイルはリソースに登録できます。
そのリソースは、FindResourceでハンドルを取得できます。
LoadResource、SizeofResource、LockResourceとリソースからグローバルハンドル(メモリブロック)へデータの型を切り替えていきます。
メモリ上のフォントリソースをAddFontMemResourceExで登録することで、リソースのフォントを使用することができます。
登録されたフォントは、CreateFont系APIで書体を指定できます。
AddFontMemResourceExで登録したフォントリソースはRemoveFontMemResourceExで開放することができます。

ただ、フォントの多くは、ファイルサイズが大きいです。10メガ越えも珍しくありません。
# ビットマップフォントは比較的軽いですが
ファイルサイズの大きすぎる実行ファイルは「なにがあるんだ?」と思われてしまいます。
圧縮でもできればいいんですけどね。

3 件のコメント:

Lapis さんのコメント...

>ファイルサイズの大きすぎる実行ファイルは「なにがあるんだ?」と思われてしまいます。
圧縮でもできればいいんですけどね。

(仕様的に可能なら)リソースだけDLLにすると良いよ。

まっつ さんのコメント...

> (仕様的に可能なら)リソースだけDLL
技術的には可能だよね。
リソースDLLとか多言語対応用DLLの作り方も需要があれば書こうかな。

Lapis さんのコメント...

以前リソースDLLをはじめて作った時、リソースDLL=サテライトDLLっていうのにたどり着くのに時間かかった。

需要がどの程度かは判らないけど、世の中の困っている誰かをいつか助けるかもしれない、って意味では書いておくと良いかもねー