トップ回答者
文字列を1文字ずつ表示するには?

質問
-
文字列を1文字ずつ、ミリセコンド単位の間隔で表示したいのですが、どうすればよいでしょうか。イメージとしては、ゲームの画面下に次々に表示される文字列でしょうか。
以下の方法でも表示はできるのですが(必要箇所以外は略してます)、非常に効率が悪いです。(マルチバイト文字セットを使用)
char str[10][3] = {"文","字","列","を","表","字"};
HDC hdc;
PAINTSTRUCT ps;
int x,z;switch(msg){
case WM_PAINT:
hdc = BeginPaint(hWnd,&ps);
for(z = 0;z < 100;z++){
if(strcmp("",str) == 0){ //配列の数を調べ、値をzに代入。
break; //配列が途切れたら繰り返しを抜ける。
}
}
for(x = 0;x < z;x++){ //配列の数だけ、繰り返す。
TextOut(hdc,x*20,5,str[x],(int)strlen(str[x])); //一文字ずつ表示。
Sleep(500); //文字の間隔をあけるため、Sleepさせる。
}
EndPaint(hWnd,&ps);
break;
回答
すべての返信
-
効率化を図ることは出来ませんでしたが、オペレーションを重視して考えた結果、スリープせずに1文字ずつ表示することが出来ました。以下に方法を記述します。
#define ID_TIMER 100
HDC hdc;
PAINTSTRUCT ps;
static char str[10][3] = {"文","字","列","を","表","字"};
static int iti = 0,c = 0;
static int x;switch (msg) {
case WM_LBUTTONDOWN:
if(c == 0){
SetTimer(hWnd,ID_TIMER,50,NULL);
c = 1;
}
return 0;
case WM_TIMER:
if(wp == ID_TIMER){
InvalidateRect(hWnd,NULL,FALSE);
}
else{
return(DefWindowProc(hWnd,msg,wp,lp));
}
return 0;
case WM_PAINT:
hdc = BeginPaint(hWnd,&ps);
if(c == 1){
for(x = 0;x < 50;x++){
if(strcmp(str[x],"") == 0){ //配列の数を調べ、xに代入。
break;
}
}
if(iti < x){ //配列の数だけ文字を1つずつ描画。
TextOut(hdc,iti * 15,5,str[iti],(int)strlen(str[iti]));
++iti;
}
else{
iti = 0; //文字を描画し終えたら、初期状態に戻し、タイマーを破棄する。
c = 0;
KillTimer(hWnd,ID_TIMER);
}
}
EndPaint(hWnd,&ps);
return 0;