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の動作も確認できました。
|