DXLib使用のコード:ネームエントリとかでキーボードみたいな画面からカーソルで選んで入力する日本語入力

使い方:こうするとbufに入力される。

	char buf[1024];
	JMojiKeyB kbname_ent;
	kbname_ent.GetStringByKB(buf, "べきお");
// CJMoji.h
#ifndef __CJMOJI_H_INCLUDED__
#define __CJMOJI_H_INCLUDED__

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "DxLib.h"

class JMojiKeyB {
private:
	int cursx, cursy;
	int cpage;
	char RValStr[1024];
	void JMojiKeyB::CursorMove(int vx, int vy);
	int JMojiKeyB::CursorToStr();
	void DrawKeyB();
public:
	//konsutorakuta
	JMojiKeyB::JMojiKeyB();
	int JMojiKeyB::GetStringByKB(char *buf, char *def);
};

#endif // __CJMOJI_H_INCLUDED__
// CJMoji.cpp

#include "CJMoji.h"

static char *keymojis[6][6] = {
	{
	"あいうえお はひふへほ",
	"かきくけこ まみむめも",
	"さしすせそ やゐゆゑよ",
	"たちつてと らりるれろ",
	"なにぬねの わをんー ",
		0,
	},
	{
	"あいうえお ばびぶべぼ",
	"がぎぐげご ぱぴぷぺぽ",
	"ざしずぜぞ ゃゅょっ ",
	"だぢづでど ぁぃぅぇぉ",
	"なにぬねの ゎをんー ",
		0,
	},
	{
	"アイウエオ ハヒフヘホ",
	"カキクケコ マミムメモ",
	"サシスセソ ヤヰユヱヨ",
	"タチツテト ラリルレロ",
	"ナニヌネノ ワヲンヴー",
		0,
	},
	{
	"アイヴエオ バビブベボ",
	"ガギグゲゴ パピプペポ",
	"ザジズゼゾ ャュョッ・",
	"ダヂヅデド ァィゥェォ",
	"ナニヌネノ ヮヲンヴ=",
		0,
	},
	{
	"1234567890−^",
	"qwertyuiop@「",
	"asdfghjkl;:]",
	"zxcvbnm,./\ ",
	0,
	},
	{
	"!”#$%&’()〜=¥",
	"QWERTYUIOP‘{",
	"ASDFGHJKL+*}",
	"ZXCVBNM<>?_ ",
	0,
	},
};

static const char keykode[7][2] = {
	{CTRL_CODE_LEFT, 'h'},
	{CTRL_CODE_RIGHT, 'l'},
	{CTRL_CODE_DOWN, 'j'},
	{CTRL_CODE_UP, 'k'},
	{CTRL_CODE_ESC, '\033'},//ESCAPE
	{CTRL_CODE_CR, '\n'},
	{0, 0},
};

static char getcom_ch()
{
	char rval;

	ClearInputCharBuf();

	while(1)
	{
		int i;
		char ch = GetInputCharWait(TRUE);
		for(i=0;i<6;i++)
		{
			if (keykode[i][0] == 0) break;
			if (ch == keykode[i][0])
			{
				ch = keykode[i][1];
				break;
			}
		}
		rval = ch;
		break;
	}
	return rval;
}

static const int CURSSPE_X = 15;
enum eCURSSPE_Y {
	CURS_BS,
	CURS_KBC,
	CURS_RETURN,
	CURS_N_SP,
};

//private
int JMojiKeyB::CursorToStr()
{
	char tbuf[3];
	
	if (cursx == CURSSPE_X)
	{
		switch(cursy){
		case CURS_BS:
			{
				int len;
				len = strlen(RValStr);
				if (len > 0)
				{
					RValStr[len-1] = 0;
					if (len>1)
					{
						RValStr[len-2] = 0;
					}
				}
			}
			break;
		case CURS_KBC:
			cpage++;
			if (cpage >= 6)
			{
				cpage = 0;
			}
			break;
		case CURS_RETURN:
			return 1;
		}
		//do specials
	}
	else
	{
		tbuf[0] = keymojis[cpage][cursy][cursx*2];
		tbuf[1] = keymojis[cpage][cursy][cursx*2+1];
		tbuf[2] = 0;
		strcat(RValStr, tbuf);
	}

	return 0;
}

//private
void JMojiKeyB::DrawKeyB()
{
	char *spekeys[] = {"BS", "Ch", "OK!", 0};
	int dx = 16, dy = 40, Cr;
	Cr = GetColor(0, 255, 255);
	{
		char buf[1024];
		sprintf(buf, "%s_", RValStr);
		DrawString(dx, dy, buf, Cr);
	}
	Cr = GetColor(255, 255, 255);
	for(int i=0;i<6;i++)
	{
		int j;
		if (keymojis[cpage][i] == 0) break;
		for(j=0;j<16;j++)
		{
			char buf[3];
			buf[0] = keymojis[cpage][i][j*2];
			if (buf[0] == 0) break;
			buf[1] = keymojis[cpage][i][j*2+1];
			buf[2] = 0;
			DrawString(dx + 32*j, dy + 32 + i*17, buf, Cr);
			if (cursx == j && cursy == i)
			{
				DrawString(dx + 32*j-10, dy + 32 + i*17, ">", GetColor(127,255,255));
			}
		}
		if (i < CURS_N_SP)
		{
			DrawString(dx + 32*j, dy + 32 + i*17, spekeys[i], Cr);
			if (cursx == CURSSPE_X && cursy == i)
			{
				DrawString(dx + 32*j-10, dy + 32 + i*17, ">", GetColor(127,255,255));
			}
		}
	}
}

void JMojiKeyB::CursorMove(int vx, int vy)
{
	int nx, ny;
	nx = cursx + vx;
	ny = cursy + vy;
	if (vx)
	{
		int kmojilen;
		kmojilen = strlen(keymojis[cpage][cursy]);
		if (nx >= kmojilen / 2)
		{
			if (vx > 0)
			{
				nx = CURSSPE_X;
			}
			else if (vx < 0)
			{
				nx = kmojilen / 2 - 1;
			}
		}
		if (nx < 0) nx = 0;
	}

	if (ny < 0) ny = 0;

	if (nx != CURSSPE_X && vy)
	{
		int nmax = 3;
		switch(cpage)
		{
		case 4: case 5:
			nmax = 3;
			break;
		default:
			nmax = 4;
			break;
		}
		if (ny > nmax)
		{
			ny = nmax;
		}

		{
			int kmojilen;
			kmojilen = strlen(keymojis[cpage][ny]);
			if (nx >= kmojilen / 2)
			{
				nx = kmojilen / 2 - 1;
			}
		}
	}
	if (nx == CURSSPE_X)
	{
		if (ny >= CURS_N_SP)
		{
			ny = CURS_N_SP - 1;
		}
	}
	cursx = nx;
	cursy = ny;
}

//konsutorakuta
JMojiKeyB::JMojiKeyB()
{
	cursx = 0;
	cursy = 0;
	cpage = 0;
	RValStr[0] = 0;
}

int JMojiKeyB::GetStringByKB(char *buf, char *def)
{
	cursx = 0;
	cursy = 0;
	cpage = 0;
	
	if (def)
	{
		strcpy(RValStr, def);
	}

	while(1)
	{
		int breakflag = 0;
		char ch;
		//DXLib, Clear
		ClearDrawScreen();
		DrawKeyB();
		ScreenFlip();
		ch = getcom_ch();
		switch(ch)
		{
		case ' ':
		case '\n':
			if (CursorToStr()==1)
			{
				breakflag = 1;
			}
			break;
		case 'h': CursorMove(-1, 0); break;
		case 'j': CursorMove( 0, 1); break;
		case 'k': CursorMove( 0,-1); break;
		case 'l': CursorMove( 1, 0); break;
		
		case '\033':
			strcpy(buf, def);
			return 0;
		}
		if (breakflag)
		{
			break;
		}
	}
	strcpy(buf, RValStr);
	return 1;
}