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;}
}