トップページ > 記事閲覧
GetDrawStringSizeToHandleの幅の値がおかしくなることがある
名前:田中 日時: 2022/06/01 07:07

いつもお世話になっております。 文字列から文字を取り出してGetDrawStringSizeToHandleで幅を取得したところ、 GetDrawStringWidthToHandleで取得できる幅と違う場合があったため報告します。 * テストコード #include "DxLib.h" int WINAPI WinMain(_In_ HINSTANCE, _In_opt_ HINSTANCE, _In_ LPSTR, _In_ int) { // logを生成しない SetOutApplicationLogValidFlag(false); // ウィンドウモード ChangeWindowMode(true); if (DxLib_Init() == -1) return -1; char str[] = "あ「z手.」 今"; char tmp[100]; int fontHandle = CreateFontToHandle(NULL, 30, 0, DX_FONTTYPE_NORMAL); int width, sizeX, sizeY; int byte, row, count; // 裏描画 SetDrawScreen(DX_SCREEN_BACK); while (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen()) { row = 0; // strから一文字ずつ分解して大きさを表示 (実際に使いたい処理) 1〜8行目 for (int i = 0; i < sizeof(str) - 1; i += byte, row++) { byte = GetCharBytes(DX_CHARCODEFORMAT_SHIFTJIS, &str[i]); width = GetDrawStringWidthToHandle(&str[i], byte, fontHandle); GetDrawStringSizeToHandle(&sizeX, &sizeY, &count, &str[i], byte, fontHandle); strcpy_s(tmp, 100, &str[i]); tmp[byte] = 0; DrawFormatString(0, row * 20, GetColor(255, 0, 0), "%02d行 %s sizeX/Y:%d/%d width:%d byte:%d", row + 1, tmp, sizeX, sizeY, width, byte); } // str全体の大きさを表示 width = GetDrawStringWidthToHandle(str, sizeof(str) - 1, fontHandle); GetDrawStringSizeToHandle(&sizeX, &sizeY, &count, str, sizeof(str) - 1, fontHandle); DrawFormatString(0, row * 20, GetColor(255, 0, 0), "%02d行 *全部* sizeX/Y:%d/%d width:%d byte:%d", row + 1, sizeX, sizeY, width, sizeof(str) - 1); row++; // 検証 配列の先頭から文字が始まるように分解 (期待した結果) 10〜17行目 for (int i = 0; i < sizeof(str) - 1; i += byte, row++) { byte = GetCharBytes(DX_CHARCODEFORMAT_SHIFTJIS, &str[i]); strcpy_s(tmp, 100, &str[i]); tmp[byte] = 0; width = GetDrawStringWidthToHandle(tmp, byte, fontHandle); GetDrawStringSizeToHandle(&sizeX, &sizeY, &count, tmp, byte, fontHandle); DrawFormatString(0, row * 20, GetColor(255, 0, 255), "%02d行 %s sizeX/Y:%d/%d width:%d byte:%d", row + 1, tmp, sizeX, sizeY, width, byte); } } DxLib_End(); return 0; } *出力結果 01行 あ sizeX/sizeY:60/32 width:30 byte:2 02行 「 sizeX/sizeY:45/32 width:30 byte:2 03行 z sizeX/sizeY:15/32 width:15 byte:1 04行 手 sizeX/sizeY:45/32 width:30 byte:2 05行 . sizeX/sizeY:15/32 width:15 byte:1 06行 」 sizeX/sizeY:45/32 width:30 byte:2 07行 sizeX/sizeY:15/32 width:15 byte:1 08行 今 sizeX/sizeY:30/32 width:30 byte:2 09行 *全部* sizeX/sizeY:195/32 width:195 byte:13 10行 あ sizeX/sizeY:30/32 width:30 byte:2 11行 「 sizeX/sizeY:30/32 width:30 byte:2 12行 z sizeX/sizeY:15/32 width:15 byte:1 13行 手 sizeX/sizeY:30/32 width:30 byte:2 14行 . sizeX/sizeY:15/32 width:15 byte:1 15行 」 sizeX/sizeY:30/32 width:30 byte:2 16行 sizeX/sizeY:15/32 width:15 byte:1 17行 今 sizeX/sizeY:30/32 width:30 byte:2 使っているDxlibは3Dモデル機能&ソフトウエアレンダリング機能無しパッケージのWindows版 VisualStudio( C++ )用(Ver3.23)です。 リファレンスに記載されていない関数のため仕様を勘違いしているかもしれませんが、確認していただけると幸いです。 よろしくお願いいたします。 追記 さらに検証を進めたところ、GetDrawStringSizeToHandleの第五引数を半角文字単位ではなく、文字の数を指定すると期待した幅が得られるみたいです。 GetDrawStringSizeToHandle、GetDrawStringWidthToHandleとでは文字列の長さの指定の仕方が違っているのは仕様でしょうか?
メンテ

Page: 1 |

Re: GetDrawStringSizeToHandleの幅の値がおかしくなることがある ( No.1 )
名前:管理人 日時:2022/06/03 01:47

不具合のご報告ありがとうございます ご指摘の通り GetDrawStringSizeToHandle に渡す引数 StrLen の値が正しく処理されていませんでした > GetDrawStringSizeToHandle、GetDrawStringWidthToHandleとでは文字列の長さの指定の仕方が違っているのは仕様でしょうか? いえ、仕様ではなくバグです、GetDrawStringWidthToHandle と同じで半角文字単位で指定した文字数の文字のサイズが取得できるのが正しい動作となります GetDrawStringSizeToHandle と GetDrawStringWidthToHandle で同じサイズが取得できるように修正したバージョンを こちらにアップしましたので、よろしければお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい)
メンテ
Re: GetDrawStringSizeToHandleの幅の値がおかしくなることがある ( No.2 )
名前:田中(解決済み) 日時:2022/06/03 20:58

問題なく動作したのを確認しました! 早急な対応ありがとうございました。
メンテ

Page: 1 |

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

   クッキー保存