トップページ > 記事閲覧
DrawExtendStringが絡む文字列の描画について
名前:was-blue.0793 日時: 2020/05/29 18:49

文字列を確実に指定された幅以内で1行で描画するためにDrawExtendStringを使用しています。 文字列を描画する時にExRateYを1.0にしてExRateXの値が1.0未満になると、指定した座標より若干下にずれて描画されます。 GetDrawExtendStringSizeを使って座標基準を中央・下に指定する処理を実装しているのですが、 この関数で取得される文字列の高さの値が下にずれる分を考慮しない値が返ってきているように思います。 「文字列の縦の倍率が1.0で横の倍率が1.0未満だと上下に余白ができてしまい、GetDrawExtendStringSizeでその余白は考慮されない」のは仕様でしょうか?
メンテ

Page: 1 |

Re: DrawExtendStringが絡む文字列の描画について ( No.1 )
名前:管理人 日時:2020/05/31 21:16

> 文字列を描画する時にExRateYを1.0にしてExRateXの値が1.0未満になると、指定した座標より若干下にずれて描画されます。 私が以下のようなプログラム( ExRateX が 1.0 の場合の文字と、ExRateX が 0.5 の場合の文字を重ねて、 Y座標がずれるか確認する )で確認した限りでは ExRateX の値が 1.0 未満になっても指定した座標より 下にずれて描画されるという事はありませんでした #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // ウインドウモードで起動 ChangeWindowMode( TRUE ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; SetFontSize( 64 ) ; // メインループ while( ProcessMessage() == 0 ) { // 画面のクリア ClearDrawScreen() ; DrawExtendString( 0, 0, 1.0, 1.0, "あ", GetColor( 255,255, 255 ) ) ; DrawExtendString( 12, 0, 0.5, 1.0, "あ", GetColor( 0,255,0 ) ) ; DrawExtendString( 64, 0, 1.0, 1.0, "B", GetColor( 255,255, 255 ) ) ; DrawExtendString( 72, 0, 0.5, 1.0, "B", GetColor( 0,255,0 ) ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; } よろしければ was-blue.0793さんの環境でも↑のプログラムではずれずに描画されるか試してみていただけないでしょうか? m(_ _)m
メンテ
Re: DrawExtendStringが絡む文字列の描画について ( No.2 )
名前:was-blue.0793 日時:2020/06/26 20:41

>>管理人さん 当該問題は当方が独自に作成していた文字の座標基準を設定する処理が原因で下にズレているように見えたことが原因でした。 しかし、ExRateYが1.0に設定されているにも関わらずExRateXの値次第で縦の長さが変わってしまうと意図した描画ができないケースが多いです。 ExRateXの値に関係なくExRateYが1.0であれば通常の描画同様の高さになるようにすることは可能でしょうか?
メンテ
Re: DrawExtendStringが絡む文字列の描画について ( No.3 )
名前:管理人 日時:2020/06/28 01:04

No.1 でも申し上げましたが、簡単に試した限りでは、私の環境では ExRateXの値に関係なくExRateYが1.0であれば通常の描画同様の高さになります よろしければ 『ExRateYが1.0に設定されているにも関わらずExRateXの値次第で縦の長さが変わってしまう』 という結果が確認できるサンプルプログラムをこちらの掲示板に貼り付けていただけないでしょうか? m(_ _;m
メンテ
Re: DrawExtendStringが絡む文字列の描画について ( No.4 )
名前:was-blue.0793 日時:2020/07/01 22:47

>>管理人さん 簡略化していますが、以下のプログラムで『ExRateYが1.0に設定されているにも関わらずExRateXの値次第で縦の長さが変わってしまう』ことが示されると思われます。 このプログラムは、文字列の縦横の長さにかかわらず文字列を画面中央に描画したいものです。 (CSSの「text-align:center; vertical-align:middle;」を簡易的に再現するようなイメージです) int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // ウインドウモードで起動 ChangeWindowMode( TRUE ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; const char* str = "The quick brown fox jumps over the lazy dog" int x = 320 int y = 240 double xsh = 0.5; int xc1, yc1; int xc2, yc2; GetDrawExtendStringSize(&xc1, &yc1, nullptr, 1.0, 1.0, str, strlen(str)); GetDrawExtendStringSize(&xc2, &yc2, nullptr, xsh, 1.0, str, strlen(str)); SetFontSize(32); // メインループ while( ProcessMessage() == 0 ) { // 画面のクリア ClearDrawScreen() ; DrawExtendString(x - xc1, y - yc1, 1.0, 1.0, str, GetColor(255, 0, 0)); DrawExtendString(x - xc2, y - yc2, xsh, 1.0, str, GetColor(0, 0, 255)); // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }
メンテ
Re: DrawExtendStringが絡む文字列の描画について ( No.5 )
名前:管理人 日時:2020/07/02 00:38

再現用プログラムを載せていただきありがとうございます 手元でも現象を確認できました バグがあったのは DrawExtendString ではなく、GetDrawExtendStringSize の方でした DrawExtendString は正常な描画を行うのですが、GetDrawExtendStringSize が 正常ではない縦幅を返すので、GetDrawExtendStringSize で得られる情報を元に 座標を調整して描画を行うと座標がずれてしまう、というものでした DrawExtendString で正常な描画ができる時点で GetDrawExtendStringSize の方を 疑うべきでした、すみません… GetDrawExtendStringSize が正常な縦幅を返すように修正したバージョンを アップしましたので、よろしければお試しください 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/DxLibAndroidTest_ARM.zip // Android版 ARM用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_ARM64.zip // Android版 ARM64用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_x86.zip // Android版 x86用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_x64.zip // Android版 x64用 https://dxlib.xsrv.jp/temp/DxLibiOSTest.zip // iOS版 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい)
メンテ

Page: 1 |

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

   クッキー保存