トップページ > 記事閲覧
デフォルトフォントについて
名前:だみあん 日時: 2014/02/15 06:49

DrawStringToHandle等のToHandle系についてですが、 現在の仕様では、存在しないフォントハンドルを指定した場合には 「フォントハンドル値が異常です」という文字がデバッグ出力に出力され DrawStringToHandleは何も行われない、といった感じになっております。 そこで他のいくつかの関数の引数同様、ハンドル指定の部分に-1を入れたらデフォルト値(デフォルトフォントハンドルを返す) と言うようにしてもらえないでしょうか。 (-1以外の値で存在しないハンドルを指定した場合は従来のエラー扱いで良いと思います) というのも、フォントハンドル指定の有りと無しで ToHandle付きと、そうでないDrawStringを使い分けるのが面倒で (後からハンドル使用したいと思い直したときにソースコードを書き換え無くてはならないため) 基本的に、すべて最初からToHandle系のみしか使わない感じに運用してまして。 そうなるとデフォルトハンドルを一切使わないという感じになってしまい デフォルトフォント分のメモリも無駄になってしまいます。 そこで、フォントハンドルを指定しない場合には デフォルトハンドルを使うような形にすれば無駄にならないかなということで、 ToHandle系からでもデフォルトフォントを使える様になったらなと思いまして。 いちおうGetDefaultFontHandle(デフォルトのフォントハンドルを取得する)という物があるのも知っているのですが 単に、まだどのフォントを使うか決まっていない暫定というときなどに -1で省略して書けちゃうのは便利かなとおもいます。 でも、CreateFontToHandleが失敗したとき、ハンドルの中身が-1となるので、 それをそのまま気付かず使ってしまうというような 悪影響も出来てしまう……様な気もしたりしますが。 そしてデフォルトフォント絡みでもう一つ。 デフォルトフォントの設定変更についてです。 デフォルトフォントをCreateFontToHandleと等価な設定項目で変更できる物があるとうれしいです // デフォルトフォントハンドルで使用するフォントを変更 int ChangeFont(const TCHAR *FontName, int CharSet = -1 /* DX_CHARSET_SHFTJIS 等 */ ) ; // デフォルトフォントハンドルのフォントタイプの変更 int ChangeFontType(int FontType ) ; // デフォルトフォントハンドルの設定を変更する int SetDefaultFontState(const TCHAR *FontName, int Size, int Thick ) ; 現状ではこれらを組み合わせるしかなく、 FontTypeだけ独立した設定変更関数しかなかったりと、一度では出来ません。 せめてSetDefaultFontStateのほうにもFontTypeの項目があれば……と。 またEdgeSizeとItalicの変更方法無いようですし。 これらは、内部でフォントデータを再作成する重い処理だということで できれば一度で出来る、CreateFontToHandleと同じ項目数の設定変更方法があると嬉しいです。 ちなみにふと思ったのですが、これらのデフォルトフォントの設定変更は 画面モード変更時や、InitFontToHandle後などのデフォルトフォントの再作成時にも継続されるのでしょうか。 デフォルトフォントハンドルは、DXライブラリが内部に持ってる値を元に作成しているようなので。 デフォルトフォントの設定変更で内部の値も変更になっているのかなと思いまして。 そしてデフォルトハンドル用に内部に持っている設定値なのですが、 DxLib_Init()の前に書き換えることは出来ないのでしょうか。 それが出来れば一番無駄がないのですが。 確認してみたところ ChangeFontはDxLib_Init()の前に記述しても有効(値が変ってる?)のようですが ChangeFontType SetFontSize SetFontThickness SetDefaultFontState の4つはDxLib_Init()以前での設定は無効のようでした。 となると、復帰用の値の設定も変更されていないのかな? などと思った次第です。 いまのところデフォルトフォント自体は、雰囲気的に、最低限の環境でも表示出来る、 最低限の設定(文字デフォルト、アンチェリ無し等)で設定されているので DxLib_Init前で書き換えると起動時にフォント絡みのエラーで起動失敗、 なんて事がおこる可能性を考えて 弄れない様になっている……のでしょうか。 まとめ といったかんじで現状、 メモリの無駄には目を瞑って、デフォルトフォントを完全に無視するか デフォルトフォントを通常のハンドルの一つとして扱うのか その辺りの方向性を決めかねていまして。 今回の要望が適わないようなら前者を。 デフォルトフォント周りが扱いやすくなるようなら後者を と考えております。 よろしくお願いします。
メンテ

Page: 1 |

Re: デフォルトフォントについて ( No.1 )
名前:管理人 日時:2014/02/15 19:10

ご意見ありがとうございます 諸々の変更を加えたバージョンをこちらにアップしましたので、よろしければダウンロードしてください http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_DevCppTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibDotNet.zip // .NET用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) > そこで他のいくつかの関数の引数同様、ハンドル指定の部分に-1を入れたらデフォルト値 > (デフォルトフォントハンドルを返す)と言うようにしてもらえないでしょうか。 > でも、CreateFontToHandleが失敗したとき、ハンドルの中身が-1となるので、 > それをそのまま気付かず使ってしまうというような > 悪影響も出来てしまう……様な気もしたりしますが。 ToString系の関数では -2 をデフォルトハンドルを指定したことにすることにしました ( #define 定義で DX_DEFAULT_FONT_HANDLE としています ) > デフォルトフォントをCreateFontToHandleと等価な設定項目で変更できる物があるとうれしいです SetDefaultFontState に CreateFontToHandle にある引数を追加しました > ちなみにふと思ったのですが、これらのデフォルトフォントの設定変更は > 画面モード変更時や、InitFontToHandle後などのデフォルトフォントの再作成時にも継続されるのでしょうか。 継続されます ( ただ、フォント名、サイズ、太さ以外が継続されていなかったので修正しました・・・ ) > そしてデフォルトハンドル用に内部に持っている設定値なのですが、 > DxLib_Init()の前に書き換えることは出来ないのでしょうか。 できなかったので、デフォルトハンドルへの設定関係の関数を DxLib_Init の前で使用できるようにしました
メンテ
Re: デフォルトフォントについて ( No.2 )
名前:だみあん 日時:2014/02/15 22:32

数々の機能追加、ありがとうございます(ぺこり ただ、せっかく仕様変更して戴いたのに難癖つけるようで心苦しいのですが >ToString系の関数では -2 をデフォルトハンドルを指定したことにすることにしました >( #define 定義で DX_DEFAULT_FONT_HANDLE としています ) についてなのですが、他の関数の引数のデフォルト指定と同じでない……というのは やはりちょっと気になってしまうところです。 ToHandle系で-1=デフォルトフォントとした場合 CreateFontToHandleが失敗したとき、デフォルトフォントを返すと同義になるとして その是非を考えたときに、どうなのだろうと思い > でも、CreateFontToHandleが失敗したとき、ハンドルの中身が-1となるので、 > それをそのまま気付かず使ってしまうというような > 悪影響も出来てしまう……様な気もしたりしますが。 と書いたのですが そもそもCreateFontToHandleは プログラム開始直後に使用するフォント分一括で作成することがほとんどで 性質的にソースコードのあちらこちらに散らばったり、 何十箇所も使われるような類でも無いですよね……。 それに、CreateFontToHandleが失敗したとして どのCreateFontToHandleが失敗したかを突き止めるのは 直後に返値のハンドルの値をチェックをすれば済むわけですし。 ということで、あまり悪影響という程のものは特に無いのかな? という気もしてきたりしてます。 そこで、CreateFontToHandleに失敗したときに-1を返すのはそのままで デバッグ出力にその旨を出力するというような形にすれば済むのではないかと思いました。 (CreateFontToHandleにわざと失敗ってどうやるのか判らなくて(たぶんハードとか環境的な問題がないと滅多に失敗しない?) 現状ではすでにそのような対処がなされているのか確認できてませんです……) そしてCreateFontToHandleに失敗して-1の入ったハンドルを利用したときは デフォルトハンドル使用というのを規定路線とするという感じでも 良いのではと思いました。 やはり、他の関数の引数のデフォルト値と同じ仕様、 というのもメリットが大きいと思う次第です。
メンテ
Re: デフォルトフォントについて ( No.3 )
名前:管理人 日時:2014/02/15 23:01

DXライブラリは特にデフォルト引数 = -1 と定義はしていません それぞれの引数で「通常使用では渡さない値」をデフォルト引数としています あと、ToHandle 系の引数 FontHandle は明示的に「フォントハンドル」を指定して頂きたいので DX_DEFAULT_FONT_HANDLE は他の関数のデフォルト引数とは違い 「デフォルトフォントハンドルを表す値」のつもりです ( SetDrawScreen に渡す DX_SCREEN_BACK や DX_SCREEN_FRONT と同じような感覚です ) CreateFontToHandle で返る -1 はデフォルトフォントハンドルという意味ではなく 「エラーが発生しました」という意味の戻り値なので、それが自然とハンドルになる というのは個人的にやりたくありません もし CreateFontToHandle でエラーが発生したらそのままデフォルトフォントハンドルを 使用するようにしたいという方がいらっしゃったら、CreateFontToHandle の戻り値が -1 だったら DX_DEFAULT_FONT_HANDLE を戻り値とするラッピング関数を作成して頂くようにしたいと思います
メンテ
Re: デフォルトフォントについて ( No.4 )
名前:だみあん 日時:2014/02/16 18:09

なるほど、デフォルト引数=-1というのは、(その引数の場合は) 明示的にエラー値(設定外)を与えるという様な意味合いなのですね。 >CreateFontToHandle で返る -1 はデフォルトフォントハンドルという意味ではなく >「エラーが発生しました」という意味の戻り値なので、それが自然とハンドルになる >というのは個人的にやりたくありません >もし CreateFontToHandle でエラーが発生したらそのままデフォルトフォントハンドルを >使用するようにしたいという方がいらっしゃったら、CreateFontToHandle の戻り値が -1 だったら >DX_DEFAULT_FONT_HANDLE を戻り値とするラッピング関数を作成して頂くようにしたいと思います このケースの場合には、(以下fontHandleはCreateFontToHandle の戻り値(int)と仮定) if(fontHandle == -1){ fontHandle = DX_DEFAULT_FONT_HANDLE; } という様な処理をするぐらいなら if(fontHandle == -1){ fontHandle = GetDefaultFontHandle(); } のほうが良いのではないでしょうか。 そうすることでToHandle系内に-2のときデフォルトハンドルに置き換えるという 無駄な処理も無くなりますし。 そのためだけにToHandle系のコストが上がってしまうのはもったいない気がします。 そして、このようなCreateFontToHandle後のチェックをした場合には チェック後にはCreateFontToHandleの値は-1以外になるのが規定になるのではないでしょうか。 そう言う意味ではCreateFontToHandle失敗後にハンドルに-1が入ったままで 何もしていないと言う事の方がお行儀がよろしくない様に思えます。 そうすると CreateFontToHandle で返る -1 == デフォルトフォントハンドル という等式はそもそも成り立たないのではないでしょうか。 そしてCreateFontToHandleが失敗した状態というのは 環境依存の原因を除けば、おおよそデバッグで修正対象になる部分なので そもそもCreateFontToHandleが失敗して-1が入っている状態自体 基本考えなくても良い状況のように思います。 例外処理として if(fontHandle == -1){ fontHandle = GetDefaultFontHandle(); } のような物を記述するわけですし。 そもそもの要望は DrawStringToHandle( 0, 0, _T("ほげ"), -1, fontHandle ) ; で、fontHandleの中身が-1だったらどうこう〜ということではなく 単に DrawStringToHandle( 0, 0, _T("ほげ"), -1, -1 ) ; と手打ちで簡単にハンドル指定を省略して書きたい。 (手軽にDrawStringとDrawStringToHandleを等価にして書き換えのリスクを抑えたい) と言うことだったりします。 なので実のところCreateFontToHandleの返値は 個人的にはあまり気にしてなかったりする部分です。 普通にCreateFontToHandle直後に返値チェックをすれば良いことなので。 そもそも現状のDrawStringToHandle実行時には ハンドルの中身が-1でも、それ以外の有効でないハンドルが入っていた場合でも 1.エラー 2.「フォントハンドル値が異常です」をデバッグ出力 3.DrawStringToHandleは何も行われない という感じでDrawStringToHandle側では 単に有効なハンドルかどうかと言うだけしか問題にしてないようですし。 DrawStringToHandle実行の時点ではもうCreateFontToHandleが失敗していたかどうかは 既に関係のない事になっていると思います。 >あと、ToHandle 系の引数 FontHandle は明示的に「フォントハンドル」を指定して頂きたいので と >CreateFontToHandle で返る -1 はデフォルトフォントハンドルという意味ではなく >「エラーが発生しました」という意味の戻り値なので、それが自然とハンドルになる の部分については、例で言うところのfontHandleのようなフォントハンドル用に作った変数には CreateFontToHandle(と、同じくフォントハンドルを返す関数であるGetDefaultFontHandle) で取得した値以外を入れるような運用が好ましくない。 と言うように思われているという解釈で良いのでしょうか。 たとえばデフォルトハンドルを指定するために int fontHandle = -1; のようなものを作ると言うようなものが好ましくないと。 そう言う意味だとするなら、私もその通りだと思います。 そういう意味では DrawStringToHandle( 0, 0, _T("ほげ"), -1, -1 ) ; のように手打ちで簡単に省略して書きたい。 と言いう運用は懸念の範疇には入らないのではないかと思うのですがいかがでしょうか。 むしろ fontHandle = DX_DEFAULT_FONT_HANDLE; という運用の方がかなり例外的な処置な気もします。 ……そしてせっかく作っていただいたのですが、 DrawStringToHandleでデフォルトフォントハンドルを指定するのに -2およびDX_DEFAULT_FONT_HANDLEという値というのは 実際の所あまり使う人もいないような気がします……。 GetDefaultFontHandle()で代用出来てしまう上に ToHandle系内に余計な条件分岐を含むコストまで嵩むっぽいですし。 ……なんか我が儘ばかり言ってスミマセン。
メンテ
Re: デフォルトフォントについて ( No.5 )
名前:管理人 日時:2014/02/16 20:02

> そもそもの要望は >  > DrawStringToHandle( 0, 0, _T("ほげ"), -1, fontHandle ) ; >  > で、fontHandleの中身が-1だったらどうこう〜ということではなく >  > 単に > DrawStringToHandle( 0, 0, _T("ほげ"), -1, -1 ) ; >  > と手打ちで簡単にハンドル指定を省略して書きたい。 > (手軽にDrawStringとDrawStringToHandleを等価にして書き換えのリスクを抑えたい) > と言うことだったりします。 だみあんさんのご要望を正しく理解できていなかったみたいです 正しく理解した上でのご返答としては「ラッパー関数を用意してください」となります > の部分については、例で言うところのfontHandleのようなフォントハンドル用に作った変数には > CreateFontToHandle(と、同じくフォントハンドルを返す関数であるGetDefaultFontHandle) > で取得した値以外を入れるような運用が好ましくない。 > と言うように思われているという解釈で良いのでしょうか。 はい > そういう意味では > DrawStringToHandle( 0, 0, _T("ほげ"), -1, -1 ) ; > のように手打ちで簡単に省略して書きたい。 >  > と言いう運用は懸念の範疇には入らないのではないかと思うのですがいかがでしょうか。 こちらの理由とは関連性はありません ToHandle 系の関数は明示的に有効なフォントハンドルを指定するようにしたいので、 -1 で省略できるようにはしたくありません ( フォントハンドルを指定しない ToHandle が無い文字列描画関係の関数と、  フォントハンドルを指定する ToHandle がある文字列描画関係の関数という住み分けなので ) > ……そしてせっかく作っていただいたのですが、 > DrawStringToHandleでデフォルトフォントハンドルを指定するのに > -2およびDX_DEFAULT_FONT_HANDLEという値というのは > 実際の所あまり使う人もいないような気がします……。 > GetDefaultFontHandle()で代用出来てしまう上に > ToHandle系内に余計な条件分岐を含むコストまで嵩むっぽいですし。 DX_DEFAULT_FONT_HANDLE の仕組みを導入したことによって内部処理がスッキリした部分もあるので、 これはこのままにしようと思います
メンテ
Re: デフォルトフォントについて ( No.6 )
名前:だみあん 日時:2014/02/16 21:10

回答ありがとうございます。 フォントハンドル指定の省略につきましては 回答のとおり、ラッパーなどで対応することにします。 長々と食い下がって申し訳ありませんでした。 それから今回修正された、デフォルトフォントの設定関係なのですが ChangeFontType SetFontSize SetFontThickness がDxLib_Init()の前で実行出来るのは確認しました。 しかし >SetDefaultFontState に CreateFontToHandle にある引数を追加しました とあるのですが SetDefaultFontStateに引数が追加されていない様です。 それどころか error LNK2019: 未解決の外部シンボル "int __cdecl DxLib::SetDefaultFontState(wchar_t const *,int,int)" (?SetDefaultFontState@DxLib@@YAHPB_WHH@Z) が関数 _WinMain@16 で参照されました。 というエラーがでてしまいます。 SetDefaultFontState(_T("NULL"), 10, 9, DX_FONTTYPE_ANTIALIASING_EDGE_4X4); と引数を CreateFontToHandleと同じにしてもダメでした こちらの場合はこうなります。 error C2660: 'DxLib::SetDefaultFontState' : 関数に 4 個の引数を指定できません。 どうもURLのファイルの中身はLibファイルだけ更新されて DxLib.hの中身が変っていないっぽい気がします。 確認よろしくお願いいたします。
メンテ
Re: デフォルトフォントについて ( No.7 )
名前:管理人 日時:2014/02/16 22:16

アップしたファイルをダウンロードして確認してみましたが、DxLib.h の中に記述されている SetDefaultFontState の引数も増えていました プロジェクトの設定でインクルードパスとライブラリパスが一致しているか、 古い DxLib.h が何処かにあって、そちらをインクルードしてしまっていないかなどを調べてみてください
メンテ
Re: デフォルトフォントについて ( No.8 )
名前:だみあん(解決) 日時:2014/02/16 23:13

すみません、なんだか判らないうちに解決してしまいました。 新たにダウンロードし直してみて解凍してみたのですが状況は変らず、 解凍先もあってるのを確認しても間違っておらず 他の変更があったと思しきlibファイルなどは2/15日のタイムスタンプに更新されていたのですが なぜか相変わらずDxlib.hファイルは2/8日のままでした。 しかし何度か繰り返している内に 急にDxlib.hが更新されました。 DxLibVCTest.exe実行のときは毎回(A)lways(すべて上書き)を選択していたのですけども。 最初に更新かけたとき 更新前にDxlib.hをさくらエディタというエディタで開いていた様な気がします。 ファイルの排他制御が掛かっていたのかもしれません。 が、今さくらエディタの設定をみてみたら、排他制御はしない設定になっていました。 他に思い当たることはないのですが とりあえず理由がよくわからない感じで Dxlib.hだけ正常に更新されていないというこちらの環境の問題? のようでした。 お騒がせして申し訳ありませんでした(ぺこり その後SetDefaultFontStateの動作も確認できました。
メンテ

Page: 1 |

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

   クッキー保存