全角文字の表示ができない DrawFormatString

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
もちもち

全角文字の表示ができない DrawFormatString

#1

投稿記事 by もちもち » 9年前

下のコードは日本語を含む文字列を入力出力することを目的としているのですが。
DrawFormatString 関数の表示がうまくできません。
 
ひらがなで「かに」と打つと「か?ゥに?ノ」となり
感じの「蟹」と打つと「蟹?I」と表示されてしまいます。


コード:

#include"DxLib.h"
#include"draw.h"
#include"stdlib.h"
#include"locale.h"

#define timecount 50
//キー入力間隔
#define charsize 200
//マルチバイト読み込みサイズ
#define MB_CUR_FUNC 4
//改行文字
//#define kaigyou ':'

int add(int*,int*,int,int);
char* rememory(char*,int*,int);
void flg(int*);
void rehandle(int*);
int lastpoint(char*,int*);
int keytimeout(int*,int);
int mbcb(char*);
int delc(char*,int,int*,char*);


int textbox(int* window,char* text,int* text2,int* size,int* data,int* keytime,int input,int *handle){
	/* window	ウィンドウの始終座標(x、y)
		text	文字配列動的
		text2	配列の確保状況(byte単位)
		size	文章の行列制限(行、列)
		data	現在の状況(行、列、操作範囲)
		keytime キー配列*256
		input	入力許可
		handle	キーハンドル
	*/
	
	
	//基本設定
	drawarea(window);
	
	int font=CreateFontToHandle("SimHei",10,5,DX_FONTTYPE_NORMAL);
	int white =GetColor(255,255,255);
	int black =GetColor(255,255,255);
	int time =GetNowCount();
	int value=0;
	unsigned char str[charsize];
	
	unsigned char kaigyou =':';
	//基本操作
	if(input==1 ){
	
		if(CheckHitKey(KEY_INPUT_UP)==1){
			if(keytime[KEY_INPUT_UP]==0){
				keytime[KEY_INPUT_UP]=GetNowCount();
				add(data,size,1,-1);
				}else{ 
				if(keytimeout(&keytime[KEY_INPUT_UP],time)==1){
					add(data,size,1,-1);
					}
				}
			}else{keytime[KEY_INPUT_UP]=0;}
			
		if(CheckHitKey(KEY_INPUT_DOWN)==1){
			if(keytime[KEY_INPUT_DOWN]==0){
				keytime[KEY_INPUT_DOWN]=GetNowCount();
				add(data,size,1,1);
				}else{ 
				if(keytimeout(&keytime[KEY_INPUT_DOWN],time)==1){
					add(data,size,1,1);
					}
				}
			}else{keytime[KEY_INPUT_DOWN]=0;}
			
		if(CheckHitKey(KEY_INPUT_LSHIFT)==1){
			if(keytime[KEY_INPUT_LSHIFT]==0){
				keytime[KEY_INPUT_LSHIFT]=GetNowCount();
				add(data,size,0,-1);
				}else{ 
				if(keytimeout(&keytime[KEY_INPUT_LSHIFT],time)==1){
					add(data,size,0,-1);
					}
				}
			}else{keytime[KEY_INPUT_LSHIFT]=0;}
			
		if(CheckHitKey(KEY_INPUT_RSHIFT)==1){
			if(keytime[KEY_INPUT_RSHIFT]==0){
				keytime[KEY_INPUT_RSHIFT]=GetNowCount();
				add(data,size,0,1);
				}else{ 
				if(keytimeout(&keytime[KEY_INPUT_RSHIFT],time)==1){
					add(data,size,0,1);
					}
				}
			}else{keytime[KEY_INPUT_RSHIFT]=0;}
			
	//キー反応
	
	/*
		if(keytime[KEY_INPUT_UP]+timecount<time){keytime[KEY_INPUT_UP]=time;add(data,size,1,1);}
		if(keytime[KEY_INPUT_DOWN]+timecount<time){keytime[KEY_INPUT_DOWN]=time;add(data,size,1,0);}
		if(keytime[KEY_INPUT_RSHIFT]+timecount<time){keytime[KEY_INPUT_RSHIFT]=time;add(data,size,0,0);}
		if(keytime[KEY_INPUT_LSHIFT]+timecount<time){keytime[KEY_INPUT_LSHIFT]=time;add(data,size,0,1);}
	*/	
		}
	
	//文字入力
	
	if(input==1){
		if(CheckKeyInput(*handle)==1){
			
			GetKeyInputString(str,*handle);
			if(1){
				int x=0;
				int y=0;
				int num=0;
				int last=0;
				int len=0;
				len=strlen(str);
				
				data[2]=len; //文字数確認用に一時使用
				data[3]=mblen(str,MB_CUR_FUNC);
				
				int lenc=0;
				int write=0;
				last=lastpoint(text,text2);
				char* delim[2];
				delim[1]=text;
					for(;y<data[1];){
						delim[2]=strtok(delim[1],&kaigyou);
						if(delim[2]==NULL){ break;}
						delim[1]=delim[2]; 
						y++;
						}
					num=delim[1]-text;
					for(;x<data[0];){
						lenc=mbcb(text+num);
						if(len!=-1){
							num+=lenc;
							}else{return -1;}
						x++;
						}
					if(len>last){
						if(len!=0){ text=rememory(text,text2,len); }
						if(len==0){ text=rememory(text,text2,1); }
						}
					if(len==last){
						if(len!=0){ text=rememory(text,text2,len+1); }
						if(len==0){ text=rememory(text,text2,2); }
						}
					if(len<last){
						if(len>0){
							memmove(text+num+len,text+num,*text2-num-last+2);
							memmove(text+num,str,len);
							}
						if(len==0){
							memmove(text+num+1,text+num,*text2-num-last+2);
							*(text+num)=kaigyou;
							data[1]++;
							}
						}
					rehandle(handle);
					SetActiveKeyInput(*handle);
					add(data,size,0,0);
				}
			}
		//文字削除
		if(CheckHitKey(KEY_INPUT_DELETE)==1){
			if(keytime[KEY_INPUT_DELETE]==0){
				keytime[KEY_INPUT_DELETE]=GetNowCount();
				delc(text,*text2,data,&kaigyou);
				}else{ 
				if(keytimeout(&keytime[KEY_INPUT_DELETE],time)==1){
					delc(text,*text2,data,&kaigyou);
					}
				}
			}else{keytime[KEY_INPUT_DELETE]=0;}
		
		}
	
	//描画処理	

	if(1){
		int x=0;
		int y=0;
		int len=0;
		int last=lastpoint(text,text2);
		
		for(int i=0;i<last+1;){
			len=mblen(text+i,MB_CUR_FUNC);
			if(len==1 && *(text+i)==kaigyou){
				y++;
				x=0;
				}else{
				if(len==1){DrawFormatString(window[0]+10+10*x, window[1]+10+10*y, GetColor(255,255,255), "%c",*(text+i));}
				if(len==2){DrawFormatString(window[0]+10+10*x,window[1]+10+10*y,GetColor(255,255,255),"%c%c",*(text+i),*(text+i+1));}
				x++;
				}
			if(len=-1){len=1;}
			i+=len;
			}
		}
	
	drawarea(window-12);
	if(1){
		int len=0;
		int num=0;
		for(int i=0;num<*text2; i+=1){
			len=mblen(text+num,MB_CUR_FUNC);
			DrawFormatString(window[2]-200+20*(i%10), window[3]+80+20*(i/10), GetColor(255,255,255), "%d",len);
			num++;
			if(len==2){num++;}
			}
		}
	
	if(1){
		int len=0;
		for(int i=0;i<*text2;){
			len=mblen(text+i,MB_CUR_FUNC);
			if(len==1){DrawFormatString(window[2]-200+20*(i%10), window[3]+280+20*(i/10), GetColor(255,255,255), "%c",*(text+i));}
			if(len==2){DrawFormatString(window[2]-200+20*(i%10), window[3]+280+20*(i/10), GetColor(255,255,255), "%c%c%c",*(text+i),*(text+i+1));}
			if(len=-1){len=1;}
			i+=len;
			}
		}
	
			
	drawarea(window);
	
	DrawFormatString(window[2]-320, window[3]-40, GetColor(0,0,0), "x=%d",data[0]);
	DrawFormatString(window[2]-320, window[3]-60, GetColor(0,0,0), "y=%d",data[1]);
	
	DrawFormatString(window[2]-260, window[3]-60, GetColor(0,0,0), "max=%d",*text2);
	DrawFormatString(window[2]-260, window[3]-40, GetColor(0,0,0), "use=%d",*text2-lastpoint(text,text2));
	
	DrawFormatString(window[2]-200, window[3]-60, GetColor(0,0,0), "len=%d",data[2]);
	DrawFormatString(window[2]-200, window[3]-40, GetColor(0,0,0), "mbl=%d",data[3]);
	int mbm=MB_CUR_FUNC;
	DrawFormatString(window[2]-140, window[3]-40, GetColor(0,0,0), "mbm=%d",mbm);
	
	if(input==1){ DrawKeyInputString(window[0]+10+data[0]*10,window[1]+10+data[1]*10,*handle); }
	
	}

int add(int* data,int* size,int xy,int add){
	if(0==data[xy] && add==1){data[xy]++;				return 0;}
	if(data[xy]==size[xy]-1 && add==-1){data[xy]--;		return 0;}
	if(0<data[xy] && data[xy]<size[xy]-1){data[xy]+=add;	return 0;}
	}

char* rememory(char* point,int* size,int plus){
	char* memory;
	memory=(char*)realloc(point,size[0]+plus);
	for(int i=0; i<plus; i++){ point[size[0]+i]=0; }
	size[0]=size[0]+plus;
	return memory;
	}
void flg(int* value){
		value[0]++;
	}
void rehandle(int* handle){
	DeleteKeyInput(*handle);
	*handle=MakeKeyInput(20,true,false,false);
	SetActiveKeyInput(*handle);
	}
	
int lastpoint(char* point,int* size){
	int last=0;
	for(char i=0; i==0 && last<*size;last++){
	i=*(point+*size-last);
	}
	
	return last;
	}

int keytimeout(int* keytime,int time){
	if(time>*keytime+timecount ){
		*keytime=0;
		return 1;
		}
	return 0;
	}

int mbcb(char *str){
	int byte[10];
	for(int i=1;i<MB_CUR_FUNC;i++){byte[i-1]=-1;}
	for(int i=1;i=MB_CUR_FUNC;){
		byte[i-1]=mblen(str,MB_CUR_FUNC);
		if(byte[i-1]!=-1){return byte[i-1]; }
		}
	}
	
int delc(char* text,int text2,int* data,char* kaigyou){
	int x=0;
	int y=0;
	int num=0;
	int last=0;
	int len=0;

	int lenc=0;
	int write=0;
	int flg=0;
	last=lastpoint(text,&text2);
	char* delim[2];
	delim[1]=text;
	for(;y<data[1] && flg==0 ;){
		delim[2]=strtok(delim[1],kaigyou);
		if(delim[2]==NULL){ flg=1; }
		delim[1]=delim[2]; 
		y++;
		}
	num=delim[1]-text;
	for(;x<data[0] && flg==0 ;){
		lenc=mbcb(text+num);
		if(len!=-1){
			num+=lenc;
			}else{return -1;}
		if(len==0){ flg=1; }
		x++;
		}
	if(flg==1){num=last;}
	lenc=mblen(text+num,MB_CUR_FUNC);
	if(lenc!=-1){
		if(num!=0 && last>text2){memmove(text+num-lenc,text+num+lenc-1,text2-num-last+1);}
		if(lenc==2){*(text+text2-last)=0;}
		*(text+text2-last+1)=0;
		}else{return -1;}
	}


アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: 全角文字の表示ができない DrawFormatString

#2

投稿記事 by h2so5 » 9年前

2バイト文字を表示した後にカウントが1バイトしか増加していないのでズレていると思います。
218行目で引数の数が合ってません。

box
記事: 2002
登録日時: 13年前

Re: 全角文字の表示ができない DrawFormatString

#3

投稿記事 by box » 9年前

字下げがスッキリしていなくて、コードが読みづらいです。
何とかする方がいいと思います。
もちもち さんが書きました:

コード:

				char* delim[2];
このように定義しているdelim[2]に対して、
もちもち さんが書きました:

コード:

						delim[2]=strtok(delim[1],&kaigyou);
						if(delim[2]==NULL){ break;}
						delim[1]=delim[2]; 
これはまずいでしょうね。delim[2]は、配列の定義範囲外です。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

もちもち

Re: 全角文字の表示ができない DrawFormatString

#4

投稿記事 by もちもち » 9年前

h2so5 さんが書きました: 2バイト文字を表示した後にカウントが1バイトしか増加していないのでズレていると思います。
218行目で引数の数が合ってません。
すみません 193行目の「%c%c」と218行目の「%c%c%c」違いを比較するために残したままでした。
box さんが書きました: 字下げがスッキリしていなくて、コードが読みづらいです。
何とかする方がいいと思います。
字下げですが「bannerスタイル」を真似て書いています。
C言語の場合は,どのスタイルが読みやすいのですか?
box さんが書きました: delim[2]は、配列の定義範囲外です。
ありがとうございます。
奇跡的に動作していたので気づきませんでした。



できるだけ不要な部分は消したのですが動作結果は変わりませんでした。

コード:

#include"DxLib.h"
#include"draw.h"
#include"stdlib.h"
#include"locale.h"

#define timecount 50
//キー入力間隔
#define charsize 200
//最大文字列
#define MB_CUR_FUNC 4
//マルチバイト読み込みサイズ

//改行文字':'

int add(int*,int*,int,int);
char* rememory(char*,int*,int);
void flg(int*);
void rehandle(int*);
int lastpoint(char*,int*);
int keytimeout(int*,int);
int mbcb(char*);


int textbox(int* window,char* text,int* text2,int* size,int* data,int* keytime,int input,int *handle){
	/* window	ウィンドウの始終座標(x、y)*2
		text	文字配列できれば動的
		text2	配列の確保状況(char単位)
		size	文章の行列制限(行、列)
		data	現在の状況(行、列、操作範囲)
		keytime キー配列*256
		input	入力許可
		handle	キーハンドル
	*/
	
	
	//基本設定
	drawarea(window);
	
	int font=CreateFontToHandle("SimHei",10,5,DX_FONTTYPE_NORMAL);
	int white =GetColor(255,255,255);
	int black =GetColor(255,255,255);
	int time =GetNowCount();
	int value=0;
	unsigned char str[charsize];
	
	unsigned char kaigyou =':';
	//基本操作
	if(input==1 ){
	
		if(CheckHitKey(KEY_INPUT_UP)==1){
			if(keytime[KEY_INPUT_UP]==0){
				keytime[KEY_INPUT_UP]=GetNowCount();
				add(data,size,1,-1);
				}else{ 
				if(keytimeout(&keytime[KEY_INPUT_UP],time)==1){
					add(data,size,1,-1);
					}
				}
			}else{keytime[KEY_INPUT_UP]=0;}
			
		if(CheckHitKey(KEY_INPUT_DOWN)==1){
			if(keytime[KEY_INPUT_DOWN]==0){
				keytime[KEY_INPUT_DOWN]=GetNowCount();
				add(data,size,1,1);
				}else{ 
				if(keytimeout(&keytime[KEY_INPUT_DOWN],time)==1){
					add(data,size,1,1);
					}
				}
			}else{keytime[KEY_INPUT_DOWN]=0;}
			
		if(CheckHitKey(KEY_INPUT_LSHIFT)==1){
			if(keytime[KEY_INPUT_LSHIFT]==0){
				keytime[KEY_INPUT_LSHIFT]=GetNowCount();
				add(data,size,0,-1);
				}else{ 
				if(keytimeout(&keytime[KEY_INPUT_LSHIFT],time)==1){
					add(data,size,0,-1);
					}
				}
			}else{keytime[KEY_INPUT_LSHIFT]=0;}
			
		if(CheckHitKey(KEY_INPUT_RSHIFT)==1){
			if(keytime[KEY_INPUT_RSHIFT]==0){
				keytime[KEY_INPUT_RSHIFT]=GetNowCount();
				add(data,size,0,1);
				}else{ 
				if(keytimeout(&keytime[KEY_INPUT_RSHIFT],time)==1){
					add(data,size,0,1);
					}
				}
			}else{keytime[KEY_INPUT_RSHIFT]=0;}
		}
	
	//入力操作
	
	if(input==1){
		if(CheckKeyInput(*handle)==1){
			
			GetKeyInputString(str,*handle);
			if(1){
				int x=0;
				int y=0;
				int num=0;
				int last=0;
				int len=0;
				len=strlen(str);
				

				
				int lenc=0;
				int write=0;
				last=lastpoint(text,text2);
				char* delim[2];
				delim[0]=text;
					for(;y<data[1];){
						delim[1]=strtok(delim[0],&kaigyou);
						if(delim[1]==NULL){ break;}
						delim[0]=delim[1]; 
						y++;
						}
					num=delim[0]-text;
					for(;x<data[0];){
						lenc=mbcb(text+num);
						if(len!=-1){
							num+=lenc;
							}else{return -1;}
						x++;
						}
					if(len>last){
						if(len!=0){ text=rememory(text,text2,len); }
						if(len==0){ text=rememory(text,text2,1); }
						}
					if(len==last){
						if(len!=0){ text=rememory(text,text2,len+1); }
						if(len==0){ text=rememory(text,text2,2); }
						}
					if(len<last){
						if(len>0){
							memmove(text+num+len,text+num,*text2-num-last+2);
							memmove(text+num,str,len);
							}
						}
					if(len==0){
						if(2>last){text=rememory(text,text2,1);}
						memmove(text+num+1,text+num,*text2-num-last+2);
						*(text+num)=kaigyou;
						data[1]++;
						}
					
					rehandle(handle);
					SetActiveKeyInput(*handle);
					add(data,size,0,0);
				}
			}
	
	//描画処理	

	if(1){
		int x=0;
		int y=0;
		int len=0;
		int last=lastpoint(text,text2);
		
		for(int i=0;i<last+1;){
			len=mblen(text+i,MB_CUR_FUNC);
			if(len==1 && *(text+i)==kaigyou){
				y++;
				x=0;
				}else{
				if(len==1){DrawFormatString(window[0]+10+10*x, window[1]+10+10*y, GetColor(255,255,255), "%c",*(text+i));}
				if(len==2){DrawFormatString(window[0]+10+10*x,window[1]+10+10*y,GetColor(255,255,255),"%c%c",*(text+i),*(text+i+1));}
				x++;
				}
			if(len=-1){len=1;}
			i+=len;
			}
		}
	
	drawarea(window-12);
	if(1){
		int len=0;
		int num=0;
		for(int i=0;num<*text2; i+=1){
			len=mblen(text+num,MB_CUR_FUNC);
			DrawFormatString(window[2]-200+20*(i%10), window[3]+80+20*(i/10), GetColor(255,255,255), "%d",len);
			num++;
			if(len==2){num++;}
			}
		}
	
	if(1){
		int len=0;
		for(int i=0;i<*text2;){
			len=mblen(text+i,MB_CUR_FUNC);
			if(len==1){DrawFormatString(window[2]-200+20*(i%10), window[3]+280+20*(i/10), GetColor(255,255,255), "%c",*(text+i));}
			if(len==2){DrawFormatString(window[2]-200+20*(i%10), window[3]+280+20*(i/10), GetColor(255,255,255), "%c%c",*(text+i),*(text+i+1));}
			if(len=-1){len=1;}
			i+=len;
			}
		}
		
	drawarea(window);
	
	DrawFormatString(window[2]-320, window[3]-40, GetColor(0,0,0), "x=%d",data[0]);
	DrawFormatString(window[2]-320, window[3]-60, GetColor(0,0,0), "y=%d",data[1]);
	
	DrawFormatString(window[2]-260, window[3]-60, GetColor(0,0,0), "max=%d",*text2);
	DrawFormatString(window[2]-260, window[3]-40, GetColor(0,0,0), "use=%d",*text2-lastpoint(text,text2));
	
	if(input==1){ DrawKeyInputString(window[0]+10+data[0]*10,window[1]+10+data[1]*10,*handle); }
	
	}

int add(int* data,int* size,int xy,int add){
	if(0==data[xy] && add==1){data[xy]++;				return 0;}
	if(data[xy]==size[xy]-1 && add==-1){data[xy]--;		return 0;}
	if(0<data[xy] && data[xy]<size[xy]-1){data[xy]+=add;	return 0;}
	}

char* rememory(char* point,int* size,int plus){
	char* memory;
	memory=(char*)realloc(point,size[0]+plus);
	for(int i=0; i<plus; i++){ point[size[0]+i]=0; }
	size[0]=size[0]+plus;
	return memory;
	}
void flg(int* value){
		value[0]++;
	}
void rehandle(int* handle){
	DeleteKeyInput(*handle);
	*handle=MakeKeyInput(20,true,false,false);
	SetActiveKeyInput(*handle);
	}
	
int lastpoint(char* point,int* maxbyte){
	int last=0;
	for(char i=0; i==0 && last<*maxbyte ;last++){
		i=point[(*maxbyte-1)-last];
		}
	return last;
	}

int keytimeout(int* keytime,int time){
	if(time>*keytime+timecount ){
		*keytime=0;
		return 1;
		}
	return 0;
	}

int mbcb(char *str){
	int byte[10];
	for(int i=1;i<MB_CUR_FUNC;i++){byte[i-1]=-1;}
	for(int i=1;i=MB_CUR_FUNC;){
		byte[i-1]=mblen(str,MB_CUR_FUNC);
		if(byte[i-1]!=-1){return byte[i-1]; }
		}
	}


閉鎖

“C言語何でも質問掲示板” へ戻る