フォントデータ(.otf)をロードする方法について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
村人Cに昇格
記事: 7
登録日時: 12年前

フォントデータ(.otf)をロードする方法について

#1

投稿記事 by 村人Cに昇格 » 10年前

いつもお世話になっております。
この度久々にゲームを作っていて、「フォントデータ」をロード(ユーザにインストールしてもらわずに)して文字列の描画を行うことにしました。
そこでこちらのトピックに過去ログが存在することを知りコードを使ってみたところ、うまくいかずに手こずっております。

.ttfフォントデータをCreateFontToHandleで使用する
http://dixq.net/forum/viewtopic.php?f=3&t=15532

書いたコードはこちらになります。

コード:

void FontLoad(void){
        LPCSTR hFont = ".¥¥DATE¥¥sample.otf";
	if (AddFontResourceEx(hFont, FR_PRIVATE, NULL) > 0) {
	}
	else {
		/*Error/*
		MessageBox(NULL, "読込失敗", "", MB_OK);
	}
	SetFontSize(30);
	ChangeFont("002 zou", DX_CHARSET_DEFAULT);
	DrawString(0, 0, "0123456789ABCDEF", GetColor(255, 255, 255));
}
フォントのロードには失敗します。
ですがファイルパスの誤りは何度も確認しましたがあっていました。
ブレイクポイントをLPCSTR hFontの行に設置してみたところ
”0xcccccccc <文字列の文字の読み取り中にエラーが発生しました。>”
と言われてしまいます。
他のフォントを試してもダメでした。
なぜだか原因がつかめずにいます。
ご回答、よろしくお願いします。

アバター
amehirune
記事: 181
登録日時: 11年前
住所: どっか
連絡を取る:

Re: フォントデータ(.otf)をロードする方法について

#2

投稿記事 by amehirune » 10年前

こんにちは。参考先のトピ主です。
私は未熟なので、このようなバグの原因はわかりません。ほかの方からの回答をお待ちください。

代わりにと言ったらなんですが、こちらに解決したコード(の改良版)を載せておきます。

コード:

	//フォント登録
	int FontSize,FontHandle;
	void *Buf;
	DWORD font_num;

	{
		//Sampleをロード
		font_num = 0;
		FontSize = FileRead_size( "dat/font/Sample.otf" );
		FontHandle = FileRead_open( "dat/font/Sample.otf" );
		Buf = malloc( FontSize );

		FileRead_read( Buf,FontSize,FontHandle );
		AddFontMemResourceEx( Buf, FontSize, NULL, &font_num );
	}
それと、今更ながらですが、私の環境では提示されたコードが正常実行しました。
パスの表記の仕方に問題があるのかもしれません。
私の場合、"dat/font/Sample.otf"としていました。
オフトピック
開発環境:VC++2008EE
OS:Windows10 Pro
物理メモリ:8GB
ほら、来いよ!! 誤字や矛盾を指摘したい奴から、前に出てこいよぉおおおおおおおッ!!!
※都合により、不定期でしか現れません。即返などはできませんのでご了承ください※

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: フォントデータ(.otf)をロードする方法について

#3

投稿記事 by みけCAT » 10年前

LPCSTRの代わりにconst char*
AddFontResourceExの代わりにAddFontResourceExA
としたらどうなりますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: フォントデータ(.otf)をロードする方法について

#4

投稿記事 by YuO » 10年前

村人Cに昇格 さんが書きました:ですがファイルパスの誤りは何度も確認しましたがあっていました。
相対パスで書いてありますが,カレントディレクトリも含めて確認しましたか。
ありがちなのは,相対パスの起点となるカレントディレクトリが想定と異なる,というものです。
そもそも,カレントディレクトリはプログラム中で明示的に指定しない限りどこになるかわからないものなので,GetModuleFileName + PathRemoveFileSpec + PathAppend,場合によっては PathCanonicalize も使って絶対パスに変換し,それをAddFontResourceExに渡してみてはどうでしょうか。
村人Cに昇格 さんが書きました:ブレイクポイントをLPCSTR hFontの行に設置してみたところ
”0xcccccccc <文字列の文字の読み取り中にエラーが発生しました。>”
と言われてしまいます。
その行ではまだhFontへの代入が行われていないため,Visual C++のデバッガはとりあえず変数を0xCCで埋めます。
これは,未処理変数を使用しようとしていることを見つけやすくするための機能です。
ステップ実行を行い,次の行に実行行を移せば (=ブレイクポイントを設定した行を実行すれば),hFontに値が設定されるはずです。

村人Cに昇格
記事: 7
登録日時: 12年前

Re: フォントデータ(.otf)をロードする方法について

#5

投稿記事 by 村人Cに昇格 » 10年前

返信が大変遅くなりました。
申し訳ございません。

amehirune 様
こちらのコードでもロードできませんでした。
すごくわかりやすい綺麗なコードをせっかく掲載していただいたのに、申し訳ないです><;

みけCAT 様、YuO 様
LPCSTRの代わりにconst char*
AddFontResourceExの代わりにAddFontResourceExA
とした場合も出力結果に相違は発生しませんでした。

また、

パスを試しに
".¥¥DATE¥¥Sample.otf"
から
"DATE/Sample.otf"
にしたところ文字化けが発生してしまいました。
ですが”読込失敗”というメッセージボックスの表示はなくなりました。
これは読込には成功しているが表示する際に文字コードかなにかが原因で文字化けが発生していると考えてもよろしいのでしょうか?

フォントファイルの場所は以下のようになっております。

プロジェクトファイル
|_ 各種cppファイルやslnファイル
   |_ DATE
      |_ Sample.otf

アバター
amehirune
記事: 181
登録日時: 11年前
住所: どっか
連絡を取る:

Re: フォントデータ(.otf)をロードする方法について

#6

投稿記事 by amehirune » 10年前

では、以下の点を確認してみてください。

・DXライブラリが最新のものになっているか?
 プログラムをデバッグ実行した際などにログが出力されるはずです。
 もし最新のものになっていなければ、更新してみてください。
・CreateFontToHandle関数に渡しているフォント名が適切か?
 恐らくCreateFontToHandle関数を利用し、描写をしているのではないかと思います。
 その時のフォント名が、本来のものと異なっている可能性があります。
 注意してほしいのが、「.otfファイル名≠フォント名」ということです。
 .otfファイルをダブルクリックした際に開かれるウィンドウの上のほうに正式なフォント名の記載があります。
 一度ご確認ください。
・表示的に不可能文字を描写しようとしていないか?
 例えば、私の使っている「1Byte文字」では、全角文字は使用できません。
 そのように、あなたが使おうとしているフォントにも、不可能文字が存在することがあるかもしれません。
 テスト描写の際は、「1234567890aiueo」などと、簡単な文字列をお勧めします。
ほら、来いよ!! 誤字や矛盾を指摘したい奴から、前に出てこいよぉおおおおおおおッ!!!
※都合により、不定期でしか現れません。即返などはできませんのでご了承ください※

村人Cに昇格
記事: 7
登録日時: 12年前

Re: フォントデータ(.otf)をロードする方法について

#7

投稿記事 by 村人Cに昇格 » 10年前

解決いたしました!
amehirune 様のおっしゃるとおり、フォント名の誤表記並びに出力不可文字だったことが原因のようです。
テスト用に用意したフォントが日本語のみ対応のフォントで、それが原因で半角文字列が文字化けしてしまったようです。
試しに半角(本来使用したい)フォントで実行してみたところ正常に出力されました。
コード自体に不具合はなかったようです…

最後までお力添え、アドバイスなどをしていただき、amehirune 様並びにYuo 様、みけCAT 様のお三方に感謝いたします。
ありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る