いつもお世話になっております。
文字列から文字を取り出して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とでは文字列の長さの指定の仕方が違っているのは仕様でしょうか?