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