Re: CreateFontToHandleで出来たフォントに文字が含まれているか調べる方法 ( No.1 ) |
- 名前:管理人 日時:2022/06/03 01:50
> bool isDrawText(char *input_text){
> font_image_textの中にinput_textの文字全て入っていればtrueを返します
> }
関数isDrawText は CreateFontToHandle などは特に関係なく、font_image_text の文字列に
input_text に含まれる文字がすべて入っていれば true が返るということでしょうか?
( 例えば、font_image_text = "あいうえお" で、input_text = "いお" だったら true が返り、
input_text = "えこ" だったら false が返るということでしょうか? )
|
Re: CreateFontToHandleで出来たフォントに文字が含まれているか調べる方法 ( No.2 ) |
- 名前:焼肉 日時:2022/06/03 06:46
>関数isDrawText は CreateFontToHandle などは特に関係なく、font_image_text の文字列に
>input_text に含まれる文字がすべて入っていれば true が返るということでしょうか?
すいません。CreateFontToHandleではなく以下のLoadFontDataToHandle関数でした。
宣言 int LoadFontDataToHandle( char *FileName, int EdgeSize ) ;
>( 例えば、font_image_text = "あいうえお" で、input_text = "いお" だったら true が返り、
>input_text = "えこ" だったら false が返るということでしょうか? )
はい。
|
Re: CreateFontToHandleで出来たフォントに文字が含まれているか調べる方法 ( No.3 ) |
- 名前:管理人 日時:2022/06/04 01:57
ご返答ありがとうございます
なるほど、LoadFontDataToHandle で作成したフォントハンドルに含まれている文字だけが
font_image_text に入っている前提なのですね、理解できました
試しに isDrawText を実装して、実際に"いお"と"えこ"の処理結果を画面に表示する
プログラムを組んでみましたので、よろしければご覧ください m(_ _)m
#include "DxLib.h"
#include <string.h>
const char *font_image_text="あいうえお" ;
bool isDrawText( const char *input_text )
{
int i = 0 ;
// 入力文字列の終端に到達するまで繰り返し
while( input_text[ i ] != '\0' )
{
// 入力文字の1文字のバイト数を取得する
int InputCharBytes = GetCharBytes( DX_CHARCODEFORMAT_SHIFTJIS, &input_text[ i ] ) ;
int j = 0 ;
// フォントの中に入っている文字の終端に到達するまで繰り返し
while( font_image_text[ j ] != '\0' )
{
// フォントの中に入っている1文字のバイト数を取得する
int FontCharBytes = GetCharBytes( DX_CHARCODEFORMAT_SHIFTJIS, &font_image_text[ j ] ) ;
// 入力文字とフォント文字のバイト数が一致していて、且つ文字コード自体も一致していたらループを抜ける
if( FontCharBytes == InputCharBytes &&
memcmp( &input_text[ i ], &font_image_text[ j ], InputCharBytes ) == 0 )
{
break ;
}
// フォントの中に入っている文字の比較対象の位置を1文字分移動する
j += FontCharBytes ;
}
// フォントの中に入っている文字の中に入力文字列の文字が無かったら false を返す
if( font_image_text[ j ] == '\0' )
{
return false ;
}
// 入力文字のチェック対象の位置を1文字分移動する
i += InputCharBytes ;
}
// ここに到達したということは、全ての入力文字がフォントの中に
// 入っている文字の何れかと一致したということなので true を返す
return true ;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
// ウインドウモードで起動
ChangeWindowMode( TRUE ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1 ;
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "いお : %s", isDrawText( "いお" ) ? "true" : "false" ) ;
DrawFormatString( 0, 16, GetColor( 255,255,255 ), "えこ : %s", isDrawText( "えこ" ) ? "true" : "false" ) ;
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
入力文字列を1文字づつフォントの文字列の文字の中に含まれているかをチェックする形です
( 1文字のバイト数は GetCharBytes という関数で取得しています )
|
Re: CreateFontToHandleで出来たフォントに文字が含まれているか調べる方法 ( No.4 ) |
- 名前:焼肉 日時:2022/06/04 05:16
管理人様ありがとうございます。
何度もすいません。
const char *font_image_text="あいうえお" ;
の部分はフォントの中に何の文字が存在するか分からないため、本来存在しないため、
GetFontCharInfoを使用して判定を行おうと思うのですが、フォントに存在しない文字ならばGetFontCharInfo関数のint* SizeXは0が戻ってくると考えて良いでしょうか?
具体的には以下のソースになります。
// DXライブラリのエラーコードは-1
const int kErrorValue = -1;
/**
* @brief 文字列が正常に描画出来るか判定する
*
* @param font_handle フォントハンドル
* @param input_text 判定する文字列
* @return true 正常に描画出来る文字列なら**true**
* @return false
*/
bool isDrawText(int font_handle, const char * input_text) {
int i = 0 ;
int before_width = 0;
// 入力文字列の終端に到達するまで繰り返し
while( input_text[ i ] != '\0' )
{
// 入力文字の1文字のバイト数を取得する
// TODO: 環境によってDX_CHARCODEFORMAT_SHIFTJISの部分を変更する
int input_char_bytes = GetCharBytes( DX_CHARCODEFORMAT_SHIFTJIS, &input_text[ i ] ) ;
// フォントの中に入っている文字の中に入力文字列の文字が無かったら false を返す
int tmp[4], width;
// 幅の取得に失敗したらfalse
if(GetFontCharInfo(font_handle, &input_text[i], &tmp[0], &tmp[1], &tmp[2], &width, &tmp[3]) == kErrorValue) {
// TODO: エラー出力。フォントが存在しないエラーを吐く
return false;
}
// 空白文字が混じっていれば幅が0の文字が検出される?
// TODO: ここは正しい結果が出るか要確認
if(width == before_width) {
return false;
}
before_width = width;
// 入力文字のチェック対象の位置を1文字分移動する
i += input_char_bytes ;
}
return true;
}
|
Re: CreateFontToHandleで出来たフォントに文字が含まれているか調べる方法 ( No.5 ) |
- 名前:管理人 日時:2022/06/05 01:55
> const char *font_image_text="あいうえお" ;
> の部分はフォントの中に何の文字が存在するか分からないため、本来存在しないため、
なんと font_image_text は存在しませんでしたか…
> GetFontCharInfoを使用して判定を行おうと思うのですが、フォントに存在しない文字ならばGetFontCharInfo関数のint* SizeXは0が戻ってくると考えて良いでしょうか?
いえ、指定した文字がフォントに存在しない文字の場合は SizeX には何も値が代入されませんので、
0 は戻ってきません( SizeX には関数を呼ぶ前の値がそのまま入っています )
また、GetFontCharInfo は渡されたフォントハンドルが無効な場合以外に、指定された文字がフォントに存在しない場合も
-1 を返しますので、isDrawText は以下のように短縮することが出来ます( あと、値の取得が不要な引数については NULL を渡すことが出来ます )
bool isDrawText(int font_handle, const char * input_text) {
int i = 0 ;
// 入力文字列の終端に到達するまで繰り返し
while( input_text[ i ] != '\0' )
{
// フォントの中に入っている文字の中に入力文字列の文字が無かったら false を返す
if(GetFontCharInfo(font_handle, &input_text[i], NULL, NULL, NULL, NULL, NULL ) == kErrorValue) {
return false;
}
// 入力文字のチェック対象の位置を1文字分移動する
// TODO: 環境によってDX_CHARCODEFORMAT_SHIFTJISの部分を変更する
i += GetCharBytes( DX_CHARCODEFORMAT_SHIFTJIS, &input_text[ i ] ) ;
}
return true;
}
|
Re: CreateFontToHandleで出来たフォントに文字が含まれているか調べる方法 ( No.6 ) |
- 名前:焼肉(解決済み) 日時:2022/06/05 10:37
管理人様、ありがとうございます。
助かりました。
おかげで良いアプリが作れそうです。
|
|