ご意見頂戴いたします~

ホヅミ
記事: 110
登録日時: 14年前

ご意見頂戴いたします~

投稿記事 by ホヅミ » 13年前

IDやパスワード、ほかにもキャラクターの名前を入れて仮決定した後に修正したくなったときに後で文字列を書き換えることができますよね?
あれってDXライブラリの関数で無いんですかね・・・探したけれど見つからないのですよ・・・
というわけで見つかるまでの継ぎはぎとして作ってみました。
もっと美しくなるよ~とか、ここ無駄だよとか、こうしたほうが良いのでは?という意見がほしいです。

CODE:

enum SYS_INPUTMODE{INIT=0,WAIT,SET};
/*****************************
*x,y:入力欄の座標
* *string:格納したい文字列
* *InpurHandle:キー入力ハンドル
******************************/
class SystemClass{
public:
	static int InputString(int x,int y,char *string,int *InputHandle){
		static int keywait=2;	//入力モード
		static int BScount=0;	//バックスペースキーが押されているカウント
		static bool BSFlag = false;
		int ret;
		int NowLen=0,NewLen=0;//文字数
		char str[50];
		int w;
		ret = keywait;
		switch(keywait){
		//初期化
		case INIT:
			strcpy(str,"");
			SetActiveKeyInput( *InputHandle ) ;
			keywait=WAIT;
			break;
		
		//入力中
		case WAIT:
			NowLen=strlen(string);
			GetKeyInputString( str , *InputHandle ) ;
			DrawFormatString(x,y,GetColor(255,255,255),"%s",string);
			w=GetDrawStringWidth( string , NowLen ) ;
			DrawKeyInputString( x+w ,y , *InputHandle ) ;

			//バックスペースキーが押されたとき
			if( CheckHitKey( KEY_INPUT_BACK) == TRUE  ){
				if(BSFlag)
					NewLen = -1;
				//もし、入力文字数が0なら既入力文字列を1つ減らす
				if(NewLen == -1 && (BScount == 0 || BScount > 30)){
					NowLen --;
					string[NowLen] = '\0';
				}
				if(NewLen >= 0) BSFlag = true;
				BScount++;
				//もし、入力文字数、既入力文字数が0なら操作を行わない。
			}
			else{
				BScount = 0;
			}

			if( CheckKeyInput( *InputHandle ) != 0){
				strcat(string,str);
				keywait = SET;
			}
			break;
		//何かあったときのための予備
		case SET:
			keywait = INIT;
			break;
		}
		return keywait;
		
	}
};

使い方はこんな感じです

CODE:

char String[21];
if( SystemClass::InputString(120,400,String,&InputHandle) == SET ){
        InputHandle = MakeKeyInput( 20 , FALSE , TRUE , FALSE ) ;
}

とっち
記事: 56
登録日時: 13年前

Re: ご意見頂戴いたします~

投稿記事 by とっち » 13年前

ぱっと見た感じですが、ところどころあるchar *をstd::stringで書けば、
もっときれいになるのではないかなぁと思いました。

ホヅミ
記事: 110
登録日時: 14年前

Re: ご意見頂戴いたします~

投稿記事 by ホヅミ » 13年前

おおお!ご意見ありがとうございます!
早速やってみますー