Re: C# 任意フォントのバイナリでの読み込みについて ( No.1 ) |
- 名前:管理人 日時:2012/09/02 05:16
PrivateFontCollection の AddMemoryFont を使用した場合は何故DXライブラリで使用できないかはわかりませんが、
とりあえずの対処としてメモリに保存されているフォントデータをテンポラリファイルに出力して AddFontFile で
読み込むことで使うことができましたので、よろしければこの方法を使用してみてください
byte[] fontBuf = System.IO.File.ReadAllBytes("azuki.ttf");
string name = Path.GetTempFileName();
System.IO.File.WriteAllBytes(name, fontBuf);
privateFont.AddFontFile(name);
|
Re: C# 任意フォントのバイナリでの読み込みについて ( No.2 ) |
- 名前:ちく 日時:2012/09/02 11:59
ご返答ありがとう御座います。
やはり、AddMemoryFontとの相性の悪さからか、
テンポラリファイルの手段しか無いのですね。
わかりました。上記の方法を利用させて頂きます。
|
Re: C# 任意フォントのバイナリでの読み込みについて ( No.3 ) |
- 名前:ちく 日時:2012/09/08 22:10
追記です。
管理人様の方法にて、実行可能ではあるものの、
フォントデータが直接さらけ出してしまう上、読み込んだフォントデータに対して、アプリケーションの終了まで、テンポラリファイルの修正等、一切の手出しができません。
やはり、C#にて、何か他の手段で、フォントデータを保護するような手段はありませんでしょうか?
よろしくお願いします。
|
Re: C# 任意フォントのバイナリでの読み込みについて ( No.4 ) |
- 名前:管理人 日時:2012/09/09 08:23
C++ で Win32API を使った「メモリ上に展開されたフォントファイルを読み込む」機能を使った場合は
ChangeFont で正常に変更することができたので、C# でも同様のAPIを使うようにしてみたところ、上手くいきました
その方法ですが、まず「メモリ上に展開されたフォントファイルを読み込むAPI」を使いたいクラスの中で以下の定義を行います
( 二番目のAPIは AddFontMemResourceEx の戻り値である「フォントリソースハンドル」を第一引数に取る「フォントリソースを解放するAPI」です )
[DllImport("gdi32.dll")]
extern static IntPtr AddFontMemResourceEx(IntPtr pFileView, uint cjSize, IntPtr pvResrved, IntPtr pNumFonts);
[DllImport("gdi32.dll")]
extern static int RemoveFontMemResourceEx(IntPtr fh);
APIの解説についてはMSDNの解説をご覧になってください
AddFontMemResourceEx
http://msdn.microsoft.com/ja-jp/library/cc428287.aspx
RemoveFontMemResourceEx
http://msdn.microsoft.com/ja-jp/library/cc410544.aspx
で、フォントを追加する処理はこちらです
IntPtr fontResourceHandle;
byte[] fileImage = System.IO.File.ReadAllBytes("azuki.ttf");
unsafe
{
fixed (byte* fileImageP = fileImage)
{
int fonts = 0;
int* fontsP = &fonts;
fontResourceHandle = AddFontMemResourceEx((IntPtr)fileImageP, (uint)fileImage.Length, (IntPtr)0, (IntPtr)fontsP);
}
}
ソフトを終了すると読み込んだフォントリソースは自動的に開放されると思いますが、明示的に解放する場合は以下の処理を実行します
RemoveFontMemResourceEx( fontResourceHandle );
よろしければ試してみてください
|
Re: C# 任意フォントのバイナリでの読み込みについて ( No.5 ) |
- 名前:ちく(解決) 日時:2012/09/09 12:14
丁重な対応、ありがとう御座います。
上記コードにて、バイナリフォントデータの読み込みが問題なくできました。
|