トップページ > 記事閲覧
MakeKeyInputで作ったハンドルに文字列を追加したい
名前:はむ 日時: 2019/11/03 22:04

こんにちは。 はじめて質問させていただきます。よろしくお願いします。 私がやりたいことは、モールス信号(スペースキーで入力)で得た入力を文字に変換して画面に表示させることです。 その機能の実装のために、質問があります。 <以下、実現したいこと> ・モールス信号入力中はカーソルを点滅させる。 ・文字に変換できたら、すぐに表示。 ・文字の削除も可能 ・Enterキーで終了。 これだけです。が、これを一から作るとなるととてつもない時間がかかりそうなので、 似たことができるMakeKeyInput関数を利用できないものかと考えています。 自分のイメージでは int InputHandle = MakeKeyInput(50, FALSE, FALSE, FALSE); char tmp; while (ProcessMessage() == 0) { ClearDrawScreen(); //もし入力を終了したらbreak //カーソルを表示 //モールス信号でスペースキーの信号を文字に変換->tmpに格納 //AddKeyInputString(tmp, InputHandle)的な関数で文字列を追加 //削除の信号が送られてきたら削除 DrawKeyInputString(0, 0, InputHandle); ScreenFlip(); } ライブラリ内の関数を見たのですが、実装のしかたがよくわかりません(自分の思っているような関数がないです)。 どのようにすれば自分のやりたいことが実現できるのでしょうか? 役に立ちそうな関数など教えていただきたいです。
メンテ

Page: 1 |

追記: MakeKeyInputで作ったハンドルに文字列を追加したい ( No.1 )
名前:はむ 日時:2019/11/03 23:19

すみません、環境の説明がありませんでした。 【環境】 Windows10 Visual Studio 2017 Community DXライブラリ 3.20c 初心者ですが、C++の基礎はしっかりと勉強しました。(自作関数・自作クラス・ポインタの基礎等はおさえてます) 少々コードにミスがあるかもしれませんが、ご容赦ください。 【追記】 自分の考えを書いておこうと思います。 上の簡易コードのAddKeyInputStringと「削除の信号が送られてきたら削除」なるものは、いま自分が知っている知識の範囲内で作成することもできそうです。 しかし、新しく作成するchar型配列に入力中の保存し、既存のSetKeyInputStringで表示して、文字の削除もしたいとなると処理のコードが少々長くなって しまい、自分の力量だとかなりの時間がかかってしまいます。 そこで、もしすでに同機能の関数があるならば教えていただきたいと思っています。 もし、ないという場合は自力で作るつもりです。 加えて、SetActiveKeyInputを使用せずにカーソルを表示する関数を探しています。 一からカーソルを作るとなるとかなり大変な作業になるのでこれはさすがにあまり作りたくありません...。 さらに、上のコード中の >  //モールス信号でスペースキーの信号を文字に変換->tmpに格納 と言う記述は少しわかりにくいですが、文字(数字/半角/全角)・' '(スペース)・「削除」のいずれかがtmpに格納され、それはスペースキーを 押す(何回押すかは文字による)ことによって表されると言う意味です。伝わりましたでしょうか? また、 > //もし入力を終了したらbreak と言う記述がありますが、これはif (CheckKeyInput(InputHandle) != 0) break;のようなものを指します。 キー入力ハンドルをアクティブにしないと常に0となってしまうので前述のようにしました。 これは、最悪CheckHitKey(KEY_INPUT_ENTER)で済ませようと思っています。 以上、詳しい質問の補足でした。 特に、カーソルをどのようにすれば良いのか教えていただきたいです。
メンテ
Re: MakeKeyInputで作ったハンドルに文字列を追加したい ( No.2 )
名前:管理人 日時:2019/11/04 00:49

> 加えて、SetActiveKeyInputを使用せずにカーソルを表示する関数を探しています。 SetActiveKeyInput を使用せずにカーソルを表示する関数はありませんので、 恐らく MakeKeyInput を使用しないで自前で DrawBoxでカーソル描画、 DrawString で入力した文字列の描画、を行った方が良いと思います > 一からカーソルを作るとなるとかなり大変な作業になるのでこれはさすがにあまり作りたくありません...。 そんなに大変な作業にはならないと思います… DrawString で描画する文字列の幅は GetDrawStringWidth で取得できますので、 入力中の文字列を DrawString で描画して、DrawString で描画した文字列の幅を GetDrawStringWidth で取得して、文字列の幅の分だけ右側に移動した座標に DrawBox で カーソルっぽい縦長の長方形を描画すればカーソル表示の出来上がりです カーソルの件があるので MakeKeyInput はお勧めできませんが、当初の ご質問である『MakeKeyInput で作ったハンドルに文字列を追加する』に関しては 入力中文字列を取得する関数 GetKeyInputString と、 入力中文字列を変更する関数 SetKeyInputString を使用する方法があります // キー入力ハンドルの入力中の文字列を取得する int GetKeyInputString( char *StrBuffer, int InputHandle ) ; // キー入力ハンドルに指定の文字列をセットする int SetKeyInputString( char *String, int InputHandle ) ; 以下のように GetKeyInputString で取得した入力中文字列に strcat で文字列の末尾に 追加したい文字を追加して、文字を追加した文字列を SetKeyInputString で入力中文字列として 設定するようにすれば『ハンドルに文字列を追加する』が実現できます char String[ 1024 ]; // 入力中の文字列を代入するためのバッファ // 現在の入力中の文字列を取得 GetKeyInputString( String, InputHandle ); // 文字を追加 strcat( String, "b" ); // 現在の入力中の文字列に設定 SetKeyInputString( String, InputHandle ); よろしければお試しください m(_ _)m
メンテ
Re: MakeKeyInputで作ったハンドルに文字列を追加したい ( No.3 )
名前:はむ 日時:2019/11/04 01:35

管理人様 迅速な対応に感謝します。 少し考え過ぎていたようです。 カーソルの表示もさほど難しくはありませんでした。 頑張ってDrawStringで実装してみようと思います。 また、コードも載せたいと思います。 本当にありがとうございました。
メンテ
Re: MakeKeyInputで作ったハンドルに文字列を追加したい ( No.4 )
名前:はむ 日時:2019/11/04 19:43

//描画領域の設定 SetDrawArea(200, 100, 1020, 600); //文字格納変数 char String[2276] = ""; int cursorX = 0, cursorY = 0; while (ProcessMessage() == 0) { //エンターキーで終了 if (CheckHitKey(KEY_INPUT_RETURN) != 0) break; //画面を消去 ClearDrawScreen(); //モールス信号を変換しstrcat_sDxでStringに結合 //イメージ if(strlen(String)<2276 && CheckHitKey(KEY_INPUT_SPACE)!=0){ strcat_sDx(String, sizeof(String), "e"); } //出力画面用の長方形を表示 DrawBox(200, 100, 1020, 500, GetColor(0, 0, 0), FALSE); DrawBox(201, 101, 1019, 499, GetColor(255, 255, 255), TRUE); //改行しながら文字を表示 DrawObtainsString_CharClip(200, 100, GetFontSize(), String, GetColor(0, 0, 0)); //カーソルの表示 GetObtainsStringCharPosition_CharClip(200, 100, GetFontSize(), String, strlen(String), &cursorX, &cursorY); DrawBox(cursorX, cursorY, cursorX + 2, cursorY + GetFontSize(), GetColor(0, 0, 255), TRUE); ScreenFlip(); } 上記のようなコードでイメージしていたものを実現できました。 無理にMakeKeyInputを使おうとしていて、頭がこんがらがっていたようです。 ご指摘いただいて無事に実装できました。 お忙しい中、回答ありがとうございました。
メンテ

Page: 1 |

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

   クッキー保存