トップページ > 記事閲覧
キーボード入力でローマ字入力したいです。
名前:マーク42 日時: 2020/02/14 23:09

キーボード入力でローマ字入力したいです。(例えばohayouを「おはよう」としたいです。) リファレンスを見たところ int DrawKeyInputModeString( int x , int y ) を使えると思ったのですが、 どのように使えばよいかサンプルのプログラムがありませんでした。 関数DrawKeyInputModeStringはキー入力のローマ字入力は出来るのでしょうか? 以下は私が書いたわけではないのですが、キーを半角のアルファベットのまま描画するプログラムです。 #include "DxLib.h" struct key_table { int key; char val; } table[] = { { KEY_INPUT_A, 'a' }, { KEY_INPUT_B, 'b' }, { KEY_INPUT_C, 'c' }, { KEY_INPUT_D, 'd' }, { KEY_INPUT_E, 'e' }, { KEY_INPUT_F, 'f' }, { KEY_INPUT_G, 'g' }, { KEY_INPUT_H, 'h' }, { KEY_INPUT_I, 'i' }, { KEY_INPUT_J, 'j' }, { KEY_INPUT_K, 'k' }, { KEY_INPUT_L, 'l' }, { KEY_INPUT_M, 'm' }, { KEY_INPUT_N, 'n' }, { KEY_INPUT_O, 'o' }, { KEY_INPUT_P, 'p' }, { KEY_INPUT_Q, 'q' }, { KEY_INPUT_R, 'r' }, { KEY_INPUT_S, 's' }, { KEY_INPUT_T, 't' }, { KEY_INPUT_U, 'u' }, { KEY_INPUT_V, 'v' }, { KEY_INPUT_W, 'w' }, { KEY_INPUT_X, 'x' }, { KEY_INPUT_Y, 'y' }, { KEY_INPUT_Z, 'z' }, { KEY_INPUT_0, '0' }, { KEY_INPUT_1, '1' }, { KEY_INPUT_2, '2' }, { KEY_INPUT_3, '3' }, { KEY_INPUT_4, '4' }, { KEY_INPUT_5, '5' }, { KEY_INPUT_6, '6' }, { KEY_INPUT_7, '7' }, { KEY_INPUT_8, '8' }, { KEY_INPUT_9, '9' }, { KEY_INPUT_SPACE, ' ' }, { KEY_INPUT_MINUS, '-' }, { KEY_INPUT_YEN, '\\' }, { KEY_INPUT_PREVTRACK, '^' }, { KEY_INPUT_PERIOD, '.' }, { KEY_INPUT_SLASH, '/' }, { KEY_INPUT_SEMICOLON, ';' }, { KEY_INPUT_COLON, ':' }, { KEY_INPUT_LBRACKET, '[' }, { KEY_INPUT_RBRACKET, ']' }, { KEY_INPUT_AT, '@' }, { KEY_INPUT_COMMA, ',' }, }; const int table_size = sizeof(table) / sizeof(*table); void gpUpdateKey(int Key[]) { char tmpKey[256]; GetHitKeyStateAll(tmpKey); for (int i = 0; i < 256; i++) if (tmpKey[i] != 0) Key[i]++; else Key[i] = 0; } int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { SetGraphMode(960, 720, 32); // ウィンドウの大きさを指定 ChangeWindowMode(TRUE); // 全画面ではなくウインドウを使用 if (DxLib_Init() == -1) return -1; // DXライブラリ初期化処理 SetDrawScreen(DX_SCREEN_BACK); // 裏画面を使用する設定 unsigned int Cr = GetColor(255, 255, 255); // 白色の値を取得 char str[1024] = ""; int len = 0; int Key[256]; while (ProcessMessage() == 0) { gpUpdateKey(Key); for (int i = 0; i < table_size; i++) if (Key[table[i].key] == 1) str[len++] = table[i].val; ClearDrawScreen(); DrawString(250, 240 - 32, str, Cr); DrawKeyInputModeString(250, 240); ScreenFlip(); } DxLib_End(); return 0; }
メンテ

Page: 1 |

マナー悪いぞ ( No.1 )
名前:相田 日時:2020/02/15 04:28

//teratail.com/questions/241191#reply-350280 出典を明らかにせず他人様のコードを貼るのはどうかと思う。
メンテ
Re: キーボード入力でローマ字入力したいです。 ( No.2 )
名前:相田 日時:2020/02/15 09:06

DrawKeyInputModeString はその名の通り Draw:描画 する関数であり、入力ではない。 キー入力のサンプルは //dxlib.xsrv.jp/function/dxfunc_input.html#R5N13
メンテ
Re: キーボード入力でローマ字入力したいです。 ( No.3 )
名前:マーク42 日時:2020/02/15 13:21

すいません、ちゃんと張っていませんでした。張っていただきありがとうございます。
メンテ
Re: キーボード入力でローマ字入力したいです。 ( No.4 )
名前:相田 日時:2020/02/15 13:50

誤魔化すつもりがなければ > 私が書いたわけではないのですが とは書かんだろう。見苦しいぞ。
メンテ
Re: キーボード入力でローマ字入力したいです。 ( No.5 )
名前:管理人 日時:2020/02/16 02:03

文字列入力を行う機能である InputString や MakeKeyInput などの関数では駄目なのでしょうか? <InputString> https://dxlib.xsrv.jp/function/dxfunc_input.html#R5N9 <MakeKeyInput> https://dxlib.xsrv.jp/function/dxfunc_input.html#R5N13 > 関数DrawKeyInputModeStringはキー入力のローマ字入力は出来るのでしょうか? 相田さんも仰られていますが DrawKeyInputModeString は『全角入力』や『ひらがな』など IME起動状態での現在の入力モードを表示するための関数なので、入力された文字列を表示する機能はありません
メンテ
Re: キーボード入力でローマ字入力したいです。 ( No.6 )
名前:マーク42 日時:2020/02/16 02:27

管理人様どうもありがとうござます。 あの後調べてMakeKeyInputを使ったプログラムを作りました。 しかし、問題が発生しました。 // 使用する文字コードを UTF-8 に設定 SetUseCharCodeFormat(DX_CHARCODEFORMAT_UTF8); を付け足したうえで、 文字化けではないのですが、「アインシュタイン」と打つと「あいうえおおおおおおおおアインシュタイン!」と出るはずなのですが、 「あいぁE」と出てきます。 debugでStringの中身を確かめたところ文字化けしていることがわかりました。 試しに他の言葉で確認してみると「げいむ」と打つと「げいむ!」と出るように書くと、ちゃんと「げおむ!」と出ました。 ですがStringの中身を確認すると文字化けしたデータでした。 使ってはいけない文字があるため書いたように動いても変数Stringの中身が文字化けしてしまったりするのか、プログラム自体に足りない何かがあるのか 詰まっています。どうか知恵を貸していただきたいです。 ちなみに「こんにちわ」などの「こ」を含む言葉では大量のエラーが出てきます。 << こちらがエラーです。 //pastebin.com/DX76DxQK 以下はプログラム全体です。 //pastebin.com/F9gC64f7
メンテ
Re: キーボード入力でローマ字入力したいです。 ( No.7 )
名前:motoYo 日時:2020/02/16 14:31

割り込み失礼します。 > マーク42 様 SetUseCharCodeFormatは、DXLibが渡された文字列をどの文字コード方式で処理するかを指定するものです。 Windowsアプリケーションのプロジェクトは、DXLibを使う以上はShift-JISが標準になりますので、 リンク上のプログラムでは //StringはUFT-8方式で作られたので、UFT-8方式で処理されて正常に表示される DrawString(0, 0, String, GetColor(255, 255, 255)); //比較文字列同士の文字コードが異なるのでTRUEが帰ることはない if (strcmp(String, "アインシュタイン") == 0) { //そもそもここは通れない。 //"あいうえおおおおおおおおアインシュタイン!"はShift-JISなので、UFT-8方式で処理しようとしてもうまく行かない DrawString(100, 500, "あいうえおおおおおおおおアインシュタイン!", GetColor(200, 200, 255)); } となります。 基本的に文字コードをわざわざUFT-8にする利点は無いので、特に理由がない場合は SetUseCharCodeFormat(DX_CHARCODEFORMAT_UTF8); は外しましょう。 どうしてもUFT-8を使いたいのであれば、const char* の文字コード指定方法を調べましょう。 > 管理人 様 この質問と直接関連性があるわけでは有りませんが、 Windows 10 19H1から、メモ帳の文字コードがデフォルトがBOM無しUFT-8に統一されました。 BOM無しとなると標準ではShift-JIS文字コードで処理されてしまうため、新たにメモ帳で作成したファイルを読み込むと文字化けが発生してしまいます。 (もちろん、名前を付けて保存->文字コードを指定(->UFT-8(BOM付き))などなら問題有りませんが...) 2byte以上文字を使ったテキストファイルを扱うこともそうないとは思いますが、様々なところで文字コードがUFT-8を標準にしつつあるのが現状です。 しかし、標準をUFT-8に移行するとDXLibで今まで標準で扱えていたテキストファイルが標準で扱えなくなるという問題も発生します。。。 DXLibの標準で文字コードについて、どうお考えでしょうか?
メンテ
Re: キーボード入力でローマ字入力したいです。 ( No.8 )
名前:管理人 日時:2020/02/17 00:39

> マーク42さん motoYoさんも仰られていますが、SetUseCharCodeFormat(DX_CHARCODEFORMAT_UTF8); は不要です > ちなみに「こんにちわ」などの「こ」を含む言葉では大量のエラーが出てきます。 > << > こちらがエラーです。 > //pastebin.com/DX76DxQK エラーを手元で確認してみたいと思いますので、こちらのエラーが発生するcppファイルをzip形式で 圧縮してファイルアップローダーなどにアップしていただけないでしょうか? m(_ _)m > motoYoさん > DXLibの標準で文字コードについて、どうお考えでしょうか? 標準の文字コードは現在このようになっています Windows Shift-JIS Android UTF-8 iOS UTF-8 Windows以外は既に UTF-8 が標準なのですが、Windows は VisualStudio の標準がいつまでも Shift-JIS なので、VisualStudio の標準文字コードが UTF-8 にならない限りはこれからも Windowsだけは Shift-JIS の予定です ただ、FileRead_gets などでテキストファイルを読み込んだときの文字コードの判定処理は 現状より強化して、文字コードの自動判別処理を追加しようと思います
メンテ
Re: キーボード入力でローマ字入力したいです。 ( No.9 )
名前:マーク42 日時:2020/02/17 01:43

motoYoさん、管理人様、どうもありがとうございます! 以下がこんにちわ」のエラープログラムです。 6.gigafile.nu/0224-bd85867c50c9d0c1a916f0a6cdbadd3eb 今回の問題を解決するためにShift-JISに統一すればいいとわかったのでmotoYoさんから頂いたプログラム //StringはUFT-8方式で作られたので、UFT-8方式で処理されて正常に表示される DrawString(0, 0, String, GetColor(255, 255, 255)); //比較文字列同士の文字コードが異なるのでTRUEが帰ることはない if (strcmp(String, "アインシュタイン") == 0) { //そもそもここは通れない。 //"あいうえおおおおおおおおアインシュタイン!"はShift-JISなので、UFT-8方式で処理しようとしてもうまく行かない DrawString(100, 500, "あいうえおおおおおおおおアインシュタイン!", GetColor(200, 200, 255)); } を使わせて頂いたのですが、真になると思ったのですが何も描画されませんでした。 語学力が無くてすいません。どうかより具体的な解決方法を教えて頂けないでしょうか。 どうかよろしくお願いいたします。
メンテ
Re: キーボード入力でローマ字入力したいです。 ( No.10 )
名前:管理人 日時:2020/02/17 23:42

> 以下がこんにちわ」のエラープログラムです。 > 6.gigafile.nu/0224-bd85867c50c9d0c1a916f0a6cdbadd3eb すみません、アップしていただいた zipファイルの中に main.cpp が存在しないようです ご確認をお願いします > 語学力が無くてすいません。どうかより具体的な解決方法を教えて頂けないでしょうか。 ではより具体的に SetUseCharCodeFormat(DX_CHARCODEFORMAT_UTF8); は不要なので、削除するかコメントアウトしてください
メンテ
Re: キーボード入力でローマ字入力したいです。 ( No.11 )
名前:マーク42 日時:2020/02/18 01:45

すいませんでした。 こちらは大丈夫です。 1.gigafile.nu/0225-e0ebc4988eafb03c1e04d0c3ebf68634 SetUseCharCodeFormat(DX_CHARCODEFORMAT_UTF8); を消したのですが文字列の比較で真の方を通りませんでした。
メンテ
Re: キーボード入力でローマ字入力したいです。 ( No.12 )
名前:motoYo 日時:2020/02/18 23:54

送っていただいたサンプルプログラム(//pastebin.com/F9gC64f7)から SetUseCharCodeFormat(DX_CHARCODEFORMAT_UTF8); を消すorコメントアウトすることで、真を返します。
メンテ
Re: キーボード入力でローマ字入力したいです。 ( No.13 )
名前:管理人 日時:2020/02/19 00:21

> すいませんでした。 > こちらは大丈夫です。 > 1.gigafile.nu/0225-e0ebc4988eafb03c1e04d0c3ebf68634 ありがとうございます、アップしていただいた main.cpp を拝見したところ > ちなみに「こんにちわ」などの「こ」を含む言葉では大量のエラーが出てきます。 ↑こちらのエラーの原因がわかりました main.cpp のテキスト形式が『Unicode (UTF-8 シグネチャなし) - コードページ 65001』となっているのが原因です VisualStudio の Windowsソフト用コンパイラは『Unicode (UTF-8 シグネチャなし)』のテキスト形式の プログラムファイルのコンパイルには対応していないので、『Unicode (UTF-8 シグネチャなし)』のテキスト形式で 保存された main.cpp をコンパイルしようとするとアップしていただいたようなコンパイルエラーが発生します VisualStudio で main.cpp を開いた状態で VisualStudio のメニューの 『ファイル』→『名前を付けて main.cpp を保存(A)...』を選択して『名前を付けてファイルを保存』ダイアログを開き、 ダイアログの右下にある『上書き保存(S)』の右側にある ▼ をクリックすると表示される 『エンコード付きで保存(V)...』をクリックすると『main.cpp は既に存在します。上書きしますか?』と表示されるので 『はい(Y)』をクリックしてください そうすると次に『保存オプションの詳細設定』ダイアログが開きますので、 『エンコード(E):』の項目を 『Unicode(UTF-8 シグネチャなし) - コードページ 65001』 から 『Unicode(UTF-8 シグネチャ付き) - コードページ 65001』 に変更して、それから『OK』ボタンを押して保存してください こうすることで main.cpp のテキスト形式を VisualSutdio の Windowsソフト用コンパイラが対応している 『Unicode(UTF-8 シグネチャ付き) - コードページ 65001』に変更することができます この形式であればプログラム中に『こ』があってもコンパイルエラーにはなりませんので、 よろしければお試しください > SetUseCharCodeFormat(DX_CHARCODEFORMAT_UTF8); > を消したのですが文字列の比較で真の方を通りませんでした。 こちらの原因も main.cpp のテキスト形式が『Unicode(UTF-8 シグネチャなし)』であった為である可能性が 高いので、とりあえず main.cpp のテキスト形式を『Unicode(UTF-8 シグネチャ付き)』にした上で再度試してみてください
メンテ
Re: キーボード入力でローマ字入力したいです。 ( No.14 )
名前:マーク42(解決) 日時:2020/02/20 09:43

わざわざご親切に、どうもありがとうございます。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存