ページ 11

半角文字'%'が表示されなくなった

Posted: 2015年11月02日(月) 16:16
by amehirune
お久しぶりでございます、アメヒルネです。

本日は、最近実装が完了した「仮想フルスクリーン」が原因と思われるバグについて
投稿させていただきます。
上記システムを実装するにあたり、フルスクリーンかそうでないかによって
表示される位置及びサイズを変更する、という関数を自作し、
実際に使用したところ、'%'のみが表示されなくなってしまいました。

以下に原因と思われる部分のコードを載せます。
どうかご教授のほどをよろしくお願いします。

尚、開発環境はVC++2008EEで、DXライブラリを使用しております。

コード:

#include "../header/GV.h"

//フォントデータロード
int CreateFontToHandleFull(int no,const TCHAR *FontName,int Size,int Thick,
						   int FontType=-1,int CharSet=-1, int EdgeSize=-1,int Itaric=0,int Handle=-1){

   	//必要情報を宣言
	double RateX,RateY,RateEx;

	//標準フォントダウンロード
	font[no]   = CreateFontToHandle( FontName,Size,Thick,FontType,CharSet,EdgeSize,Itaric,Handle );

	//フルスクリーン用フォントダウンロード
	{
		RateX = (double)DesktopSizeX / WIN_X;		//X成分拡大レートを解析
		RateY = (double)DesktopSizeY / WIN_Y;		//Y成分拡大レートを解析
		RateEx = ( RateX<RateY ? RateX:RateY );		//レートの小さいほうを適用

		Size *= RateEx;
		Thick *= RateEx;

		fontEx[no] = CreateFontToHandle( FontName,Size,Thick,FontType,CharSet,EdgeSize,Itaric,Handle );
	}

	return 0;

}

int DrawFormatStringToHandleEx(int x,int y,int Color,int FontHandle,const TCHAR *FormatString, ... ){

	int DivX,DivY;
	char Strings[256];
	va_list list;

	va_start( list,FormatString );
	vsprintf( Strings,FormatString,list );
	va_end( list );

	if(WinMode==1){

		if( ExtendRateX<ExtendRateY ){		//拡大倍率がX方向のほうが小さければ
			DivX = 0;
			DivY = (DesktopSizeY/2) - (WIN_Y*ExtendRateA/2);		//ゲーム画面を中央に表示させる
		}
		else{								//拡大倍率がY方向のほうが小さければ
			DivX = (DesktopSizeX/2) - (WIN_X*ExtendRateA/2);
			DivY = 0;												//ゲーム画面を中央に表示させる
		}

		DrawFormatStringToHandle( DivX+x*ExtendRateA,DivY+y*ExtendRateA,Color,fontEx[FontHandle],Strings );
	}
	else DrawFormatStringToHandle( x,y,Color,font[FontHandle],Strings );



	return 0;

}

コード:

DrawFormatStringToHandleEx( x,y,WHITE,FONT,"%d%%",100 )
結果≫100

Re: 半角文字'%'が表示されなくなった

Posted: 2015年11月03日(火) 11:02
by Rittai_3D
実験してみようと思いましたが、

コード:

WinMode
ExtendRateX
ExtendRateY
ExtendRateA
font[]
fontEx[]
DesktopSizeX
DesktopSizeY
WIN_X
WIN_Y
が分からないのでコンパイルが通りませんでした。
また、Dxライブラリのバージョンも教えてください。

Re: 半角文字'%'が表示されなくなった

Posted: 2015年11月03日(火) 11:11
by あたりめ
vsprintfもDrawFormatStringToHandleも %% -> % の処理が入るので
%%%% にする必要があるような気がします。

Re: 半角文字'%'が表示されなくなった

Posted: 2015年11月03日(火) 12:52
by amehirune
ご返答ありがとうございます。
あたりめさんのおっしゃった通り、%%を%%%%へと変更してみたところ、確かに%が表示されました。
Rittai_3Dさんも、ご回答ありがとうございました。

Re: 半角文字'%'が表示されなくなった

Posted: 2015年11月03日(火) 12:54
by みけCAT
%%を%%%%に変えることはせずに、素直にDrawFormatStringToHandleではなくDrawStringToHandleを使って描画するようにすればいいのではないでしょうか?

Re: 半角文字'%'が表示されなくなった

Posted: 2015年11月03日(火) 13:50
by amehirune
みけCATさん
変数xの値と%を合わせて、「100%」というような表示を行いたいと考えておりましたので、
やはりDrawFormatStringToHandleのほうが望ましいと考えました。
sprintf_s関数を使ってもよかったのですが、そうすると文字の表示が2度手間になってしまい、
それを私は嫌っているので。

Re: 半角文字'%'が表示されなくなった

Posted: 2015年11月03日(火) 13:59
by みけCAT
amehirune さんが書きました:sprintf_s関数を使ってもよかったのですが、そうすると文字の表示が2度手間になってしまい、
それを私は嫌っているので。
現状のvsprintfを使うプログラムでも、同様に2度手間なのではないでしょうか?

Re: 半角文字'%'が表示されなくなった

Posted: 2015年11月03日(火) 15:54
by あたりめ
"%d%%%%"がvsprintfで"100%%"、最後のDrawFormatStringToHandleで
"100%" になってるので、どちらか一回にすべきとは思います。
途中経過をデバッガで止めて見てみたり、デバッグ出力させてみるのもいいですね。