文字幅について
Posted: 2013年9月26日(木) 08:09
お久しぶりです。3Dです。今回は文字幅についての質問です。
現在、C++が以前より使えるようになったので、また性懲りもなく東方ProjectのMusicRoom の再現をしています。その事で質問があります。
それは、全角文字と半角文字の入り交じった文を表示する時、DrawExtendFormatStringToHandleを使用して表示すると拡大率が固定なので、たとえば、半角なら拡大率を0.86f、漢字やひらがな、カタカナの場合は拡大率を1.0fにしたい時にどうすれば良いのかわかしません。自分で関数を作ってみたものの、これだと一文字目が半角だと拡大率が0.86f固定に、逆に一文字目が全角なら拡大率が1.0f固定になってしまいます。
長ったらしく書きましたが、要するに文字列の中の全角文字と半角文字の拡大率を変て表示する方法です。
もし、Dxライブラリでは不可能と言うのならばDirectXやWin32APIなどでの方法を教えて頂けると幸いです。
自作関数
サンプルコードです
【開発環境】
Windows XP
Visual C++ Express 2008
Dxライブラリ
現在、C++が以前より使えるようになったので、また性懲りもなく東方ProjectのMusicRoom の再現をしています。その事で質問があります。
それは、全角文字と半角文字の入り交じった文を表示する時、DrawExtendFormatStringToHandleを使用して表示すると拡大率が固定なので、たとえば、半角なら拡大率を0.86f、漢字やひらがな、カタカナの場合は拡大率を1.0fにしたい時にどうすれば良いのかわかしません。自分で関数を作ってみたものの、これだと一文字目が半角だと拡大率が0.86f固定に、逆に一文字目が全角なら拡大率が1.0f固定になってしまいます。
長ったらしく書きましたが、要するに文字列の中の全角文字と半角文字の拡大率を変て表示する方法です。
もし、Dxライブラリでは不可能と言うのならばDirectXやWin32APIなどでの方法を教えて頂けると幸いです。
自作関数
bool IsJapaneseChar( unsigned char code )
{
if( ( code >= 0x81 && code <= 0x9F ) ||
( code >= 0xE0 && code <= 0xFC ) ) {
return true;
}
return false;
}
void DrawSubStringToHandle( int x, int y, int color, int FontHdl,char* String, ... )
{
va_list args;
va_start( args, String );
char str[1024];
int i;
double ExRate_X = 0.0f; // 文字の拡大率
for( i=0 ; String[i] != '\0' ; i++ ) {
if( IsJapaneseChar( String[i] ) == true ) {
ExRate_X = 1.0f;
} else {
ExRate_X = 0.86f;
}
}
vsnprintf_s( str, sizeof( str ), _TRUNCATE, String, args );
DrawExtendFormatStringToHandle( x, y, ExRate_X, 1.0f, color, FontHdl, str );
}
// サンプルコードには上の自作関数は使用しておりません。
#include "DxLib.h"
bool ProcessLoop()
{
if( ClearDrawScreen() != 0 ) return false;
if( ProcessMessage() != 0 ) return false;
if( CheckHitKey( KEY_INPUT_ESCAPE ) ) return false;
return true;
}
typedef struct _TAG_TALK
{
char Aisatu[3][256];
}talk_t;
int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
{
ChangeWindowMode( TRUE ), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK );
int Font = CreateFontToHandle( "MSPゴシック", 16, 0, DX_FONTTYPE_ANTIALIASING_EDGE );
talk_t talk = { "No.1 お早うございます", "No.2 今日は", "No.3 今晩は" }; // 挨拶を登録
while( ProcessLoop() ) {
for( int i=0 ; i<3 ; i++ ) {
SetDrawMode( DX_DRAWMODE_BILINEAR );
DrawExtendFormatStringToHandle( 63, 95+20*i, 0.86f, 1.0f, GetColor( 255,255,255 ), Font,"%s", talk.Aisatu[i] );// ここ!
SetDrawMode( DX_DRAWMODE_NEAREST );
}
ScreenFlip();
}
DxLib_End();
return 0;
}
【開発環境】
Windows XP
Visual C++ Express 2008
Dxライブラリ