トップページ > 記事閲覧
フォントサイズを16に出来ない
名前:あおむし 日時: 2017/08/19 02:53

初めまして、Dxlibの方にはいつもお世話になっております。 質問内容はタイトルの通りです。CreateFontToHandle関数を使ってフォントハンドルを作成しているのですが、何故かフォントのサイズを16にしようとすると、強制的に15になってしまいます。 ちなみに、Meiryo UIのような一部のフォントでは、しっかり16になっている事を確認出来ました。 しかし只今開発しているモノでは普通のMeiryoを16サイズにしたいのが願望です・・・。恐らくバグでは無いかと存じますので、どうか御修正の方お願い申し上げます。
メンテ

Page: 1 |

Re: フォントサイズを16に出来ない ( No.1 )
名前:管理人 日時:2017/08/19 20:41

> 質問内容はタイトルの通りです。CreateFontToHandle関数を使ってフォントハンドルを作成しているのですが、何故かフォントのサイズを16にしようとすると、強制的に15になってしまいます。 二つほどご質問させてください m(_ _)m 1.どのような方法で強制的に 15 になってしまっていると確認されたのでしょうか? 2.強制的に 15 になってしまうフォントの名称を教えていただけないでしょうか?
メンテ
Re: フォントサイズを16に出来ない ( No.2 )
名前:あおむし 日時:2017/08/20 08:42

情報が少なかったですね、大変失礼しました。 >1.どのような方法で強制的に 15 になってしまっていると確認されたのでしょうか? 画像編集ソフトで確認しました。 そこでフォントサイズの16と15に明らかな差異がある事も確認したので、フォント自体に問題があるわけでは無いと推測しました。 >2.強制的に 15 になってしまうフォントの名称を教えていただけないでしょうか? すみません、 >ちなみに、Meiryo UIのような一部のフォントでは、しっかり16になっている事を確認出来ました。 と書きましたが、これは誤りです。 あまりフォントの知識が無いので多くは挙げれませんが、今のところMeiryoとMS P系統とMeiryo UIで確認できました。 同じ事を繰り返し書くようですが、Meiryoのサイズ16をどうしても使いたいです。
メンテ
Re: フォントサイズを16に出来ない ( No.3 )
名前:管理人 日時:2017/08/20 11:49

同じサイズの値を指定しても表示の見た目が異なる、ということですね DXライブラリの CreateFontToHandle で指定するサイズの値と、画像編集ソフトで指定する サイズの値は単位が異なることが多いので( 原因は不明です、DXライブラリは指定された サイズをそのまま Windows のフォント機能に渡しているのですが、画像編集ソフトでは 何か計算を行ってから渡しているのか、若しくは独自のフォント描画システムでフォントを 使用しているからなのか… )、CreateFontToHandle でサイズ 16 にしても画像編集ソフトでの 15 になってしまう、ということでしたら CreateFontToHandle で指定するサイズを 17 や 18 に してみてください m(_ _)m
メンテ
Re: フォントサイズを16に出来ない ( No.4 )
名前:あおむし 日時:2017/08/20 12:07

>同じサイズの値を指定しても表示の見た目が異なる、ということですね そうです!すみません、言い方が悪かったですね・・・。 そしてMeiryoのサイズを 17 にした場合ですが、これは確かに 17 のサイズになっていました。画像編集ソフトで確認済みです。
メンテ
Re: フォントサイズを16に出来ない ( No.5 )
名前:管理人 日時:2017/08/20 12:54

謎ですね… では CreateFontToHandle で 15 にすると画像編集ソフトではどのようなサイズになるのでしょうか? あと、よろしければお使いの画像編集ソフトの名前を教えてください m(_ _)m
メンテ
Re: フォントサイズを16に出来ない ( No.6 )
名前:あおむし 日時:2017/08/20 13:40

例として簡単なコードを載せます。 #include "Dxlib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow) { ChangeWindowMode(TRUE); SetGraphMode(640, 480, 32); if( DxLib_Init() == -1 ) return -1; int FH; FH = CreateFontToHandle("Meiryo", 16, 1, DX_FONTTYPE_ANTIALIASING); while(!ProcessMessage() && !ClearDrawScreen()) { DrawStringToHandle(10, 10, "あいうえお阿ゐ羽絵雄12345ABCDE", GetColor(255,255,255), FH); ScreenFlip(); } DxLib_End(); return 0; } これを実行した結果をスクリーンショットし、画像編集ソフト「GIMP」を使いフォントを比較した画像が下記のURLに・・・と、貼ろうとしたのですがURLは貼れないんですね・・・。 言葉の説明になりますが、そこでDxlibで描画された 16 サイズの文字列と、GIMPで描画した文字列を比較しました。GIMP側で 15 サイズの文字列と大きさがぴったりになり、 GIMP側で16,17 サイズはそれよりも大きい物だと判別できました。
メンテ
Re: フォントサイズを16に出来ない ( No.7 )
名前:管理人 日時:2017/08/20 17:43

ご返答ありがとうございます 手元でも GIMP でのサイズ 16 と CreateFontToHandle でのサイズ 16 が異なることを確認しました ただ、16 以外のサイズの見た目が GIMP と CreateFontToHandle で一致しているのは偶然です ( No.3 でのご返答の通り、画像編集ソフトでのサイズと、CreateFontToHandle でのサイズは単位が異なるので ) ただ、近い見た目になっているのは、DXライブラリ内部で 『指定したサイズに対して描画される文字のサイズが著しく異なる一部のフォントではサイズを補正する処理』 を行っていたのが原因で、CreateFontToHandle を使用した場合 GIMP での 16 に相当するサイズにできないのもこれが原因でした ( No.3 で『DXライブラリは指定されたサイズをそのまま Windows のフォント機能に渡している』と申し上げて いましたが、一部のフォントに関してはサイズを補正していたことを失念していました、すみません m(_ _;m ) この『指定したサイズに対して描画される文字のサイズが著しく異なる一部のフォントではサイズを補正する処理』を 無効にした上で、サイズを 24 にしたところ、GIMP でのサイズ 16 と同じ文字が描画されることが確認できました ただ、補正処理を完全に無効にしてしまうと補正処理ありで正常に動作するように組まれたプログラムが正常に 動作しなくなってしまうので、新たに『補正処理を使用するかどうか』を設定するための関数を追加しました よろしければその関数を追加したこちらのバージョンをダウンロードしてください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.exe // Windows版 C++ Builder 10.1 Berlin 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース ( 中身を既存のライブラリのファイルに上書きして、VisualStudioをお使いの場合は『リビルド』を、  BCCをお使いの場合は『再構築』をして下さい ) 以下の関数を追加しました // フォントのサイズを補正する処理を行うかどうかを設定する( Flag TRUE:行う( デフォルト ) FALSE:行わない ) int SetFontUseAdjustSizeFlag( int Flag ) ; こちらの関数を CreateFontToHandle を呼ぶ前に FALSE を渡して呼んでください、サイズの補正処理が行われなくなります そして、CreateFontToHandle で指定するフォントのサイズを 24 にしていただければ、GIMP でのサイズ 16 と 同じ見た目になります あと、本件とはちょっと話題がそれますが、アンチエイリアス付きフォントのタイプとしては DX_FONTTYPE_ANTIALIASING の他に DX_FONTTYPE_ANTIALIASING_4X4 と DX_FONTTYPE_ANTIALIASING_8X8 があります、 こちらは DX_FONTTYPE_ANTIALIASING に比べて若干シャープさに欠けますが 「DX_FONTTYPE_ANTIALIASING では『A』の文字の線が明らかに『C』の文字の線より太い」 といった問題が解消されます よろしければ使用をご検討ください m(_ _)m
メンテ
Re: フォントサイズを16に出来ない ( No.8 )
名前:あおむし 日時:2017/08/20 19:37

言われた通りに FALSE にしてサイズを 24 にしたところ、望んでいる描画ができました!本当にありがとうございます!! >DX_FONTTYPE_ANTIALIASING の他に DX_FONTTYPE_ANTIALIASING_4X4 と DX_FONTTYPE_ANTIALIASING_8X8 があります 滑らか且つシャープに描画したいので、今回は 4X4 と 8X8 の方は使用を考えておりません・・・。ご親切に教えていただき、ありがとうございます! ついでながらに同じフォント類の問題なので、厚かましいですがもう一つ質問させて頂きます。 実は Meiryo Bold のサイズ 18 を描画したい場面もあるのですが、こちらは何故か Meiryo Bold では無く MS Gothic になっているみたいです・・・。 また CreateFontToHandle で Thick を指定しても、5か6単位毎?に増やして指定しないと変化が見られません。 この2つの事を確認できるのが、下記のコードです。 #include "Dxlib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow) { ChangeWindowMode(TRUE); SetGraphMode(640, 480, 32); if( DxLib_Init() == -1 ) return -1; int FH[4]; for(int i=0;i<4;i++) FH[i] = CreateFontToHandle("Meiryo Bold", 18, 1+i*2, DX_FONTTYPE_ANTIALIASING); while(!ProcessMessage() && !ClearDrawScreen()) { for(int i=0;i<4;i++) { DrawStringToHandle(10, 10+20*i, "あいうえお阿ゐ羽絵雄12345ABCDE", GetColor(255,255,255), FH[i]); DrawFormatStringToHandle(10+480, 10+20*i, GetColor(255,255,255), FH[i], "Thick = %d", 1+i*2); } ScreenFlip(); } DxLib_End(); return 0; } こちらも文章で説明しますと、 Thick値を 1 から数えて 3, 5, 7 と、 2 ずつ繰り上げた4つの文字列を上から順に描画しますが、1〜3つ目の変化が一切ありません。 おまけに「GIMP」で比較・確認をしたところ、 Meiryo Bold では無く MS Gothic で書いた文字と一致していました(サイズはどちらも 18 です)。「あ」の3画目の最初がはみ出るか、と言ったところや「お」等の横線部分が水平な横線か、もしくは斜線になっているかどうかなど、違いは見ていただければお分かり頂けると存じます。 そして、4つ目で変化が起きてる事を確認しました。しかしこちらも恐らく Meiryo Bold では無いように思えます。理由は上記で書いた特徴部分が MS Gothic と一致しているからです。 大変厚かましいお願いではございますが、よろしければこちらもご検討の方どうぞお願いいたします。
メンテ
Re: フォントサイズを16に出来ない ( No.9 )
名前:あおむし 日時:2017/08/20 19:46

情報を付け足すと、サイズに関係無く MS Gothic になっているようです。 Meiryo Bold か、もしくは太字フォント自体に問題があると存じます。
メンテ
Re: フォントサイズを16に出来ない ( No.10 )
名前:管理人 日時:2017/08/20 21:39

> 実は Meiryo Bold のサイズ 18 を描画したい場面もあるのですが、こちらは何故か Meiryo Bold では無く MS Gothic になっているみたいです・・・。 CreateFontToHandle で指定できるフォント名は、フォントの FullFontName である必要があり、 GIMP や Excel などで表示されるフォント名とは異なる場合が多いです そして存在しないフォント名( CreateFontToHandle では無効なフォント名 )を指定した場合は デフォルトのフォントでフォントハンドルが作成されます こちらの「フォントインストーラー SAKURA」というソフトでフォントの詳細情報を閲覧することができるのですが <フォントインストーラー SAKURA> http://www.vector.co.jp/soft/winnt/writing/se191710.html Meiryo Bold の FullFontName は「メイリオ ボールド」となっていて、こちらを CreateFontToHandle で 指定したところ Meiryo Bold の書体になりました よろしければお試しください > また CreateFontToHandle で Thick を指定しても、5か6単位毎?に増やして指定しないと変化が見られません。 Thick は値を 100倍して Win32 API の CreateFont の fnWeight に渡しています <CreateFont> https://msdn.microsoft.com/ja-jp/library/cc428368.aspx fnWeight に渡す値は以下のように一応 100 毎に設定されていますが FW_DONTCARE 0 FW_THIN 100 FW_EXTRALIGHT 200 FW_ULTRALIGHT 200 FW_LIGHT 300 FW_NORMAL 400 FW_REGULAR 400 FW_MEDIUM 500 FW_SEMIBOLD 600 FW_DEMIBOLD 600 FW_BOLD 700 FW_EXTRABOLD 800 FW_ULTRABOLD 800 FW_HEAVY 900 FW_BLACK 900 恐らくそれぞれの太さの値に対応するかどうかはフォント毎に異なるのだと思います
メンテ
Re: フォントサイズを16に出来ない ( No.11 )
名前:あおむし 日時:2017/08/20 21:58

「メイリオ ボールド」を指定したところ、望む描画に成功しました!何から何まで本当にありがとうございました!!
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存