トップページ > 過去ログ > 記事閲覧
複数行のテキスト入力フォームの実装
名前:delt 日時: 2011/12/13 05:49

DXライブラリを使用してゲームを製作しています。 そのゲーム内に、WEBサイトによくある様な掲示板を実装したいと思っています。 内容はシンプルなもので、入力フォームと書き込まれた内容を出力する箇所を実装できました。 しかしながら、入力フォームの実装に少し問題が生じましたので、ここで質問をさせてください。 問題は、入力フォームを複数行にしたいが実装できないというものです。 最初はcharの二次元配列を利用して、擬似的に実装を試みました。 しかし、入力文字は全角文字も使用できるようにしたいのですが、全角文字と擬似的な折り返しの不具合、そしてBSキーで文字削除による前行に戻る際の不具合が発生、解決が出来なかった為困っていました。 そんな折、DXライブラリ関数リファレンスページのサンプルにて、DrawKeyInputStringとSetDrawAreaで描画可能領域を変更することで、自動で改行をしてくれると書かれていましたので、これを試みました。 その結果、確かに自動で改行してくれる複数行入力フォームが出来たのですが、思っていたものではありませんでした。 実装したい事と結果の相違は 1.入力している文字列が描画可能領域の画面端を越えると確かに次の行へ行きますが、文字のはみ出た部分から次の行に表示されている 2.enterキーの押下による改行の実装が難しい 以上です。 1.はなんとなく仕様っぽい感じがするので、これで我慢するしかないのかもしれません。 描画可能領域の横幅を文字の横幅の倍数にする方法を思いついたのですが、使用したいフォントは一定の文字幅ではないので難しいです。 2.は色々考えてみて、例えばenterキーが押されたら、画面端までスペースを埋め尽くす、という方法を思いついたのですが、書き込みされた内容を一旦テキストファイルに保存しているので、やたらとスペース列が混じった文字列が保存されてしまい、さらにそれが出力するのは芳しくありません。(保存する前にスペースを削除したら、入力文字にスペースが使えなくなってしまいます。) この二つの問題を解決する方法を教えて下されば幸いです。

Page: 1 |

Re: 複数行のテキスト入力フォームの実装 ( No.1 )
名前:sy(サイ) 日時:2011/12/13 14:35

1ですが、テキストの大きさ(ピクセル)は表示する前に取得する事が出来ますので、 1行のフォームの長さを超えたら改行を加えるだけの処理で実現できます。 2ですが、スペースを埋め尽くすのであれば、 後ろから文字列を検索し、スペースでは無い文字が出てくるまで消して行けば簡単です。 ちなみに文字列のデータを管理する場合、char*よりもc++標準の<string>をインクルードし、 std::stringを使った方がはるかに便利です。
Re: 複数行のテキスト入力フォームの実装 ( No.2 )
名前:delt 日時:2011/12/13 20:05

sy様、返信ありがとうございます。 まずは前回の私の書き込みの改行が良くなく、見難い文章になっていました。 ごめんなさい。 実は前回の書き込みで記載している事以外に色々とやってみては、うまくいかないの繰り返しをしています。 私がやった事を全部書くととても長くなるので一部のみの書き込みをしました。 それでsy様からの提案は、すでに考案&理想通りいかない事を経験済みなのです。 >1ですが、テキストの大きさ(ピクセル)は表示する前に取得する事が出来ますので、 >1行のフォームの長さを超えたら改行を加えるだけの処理で実現できます。 テキストのレングスを取得しても、そもそも思い通りの「改行」が出来ないことが問題です。 >2ですが、スペースを埋め尽くすのであれば、 >後ろから文字列を検索し、スペースでは無い文字が出てくるまで消して行けば簡単です スペースで埋め尽くす案を書きましたが、これには他にも色々問題があり、 1の問題で、スペース文字の途中が下の行の頭に表示されて、全行の頭がバラバラになります。 また、スペースを消す処理を入れると、文章中の全てのスペースが消されます。 私が前回書きました例はあくまでも「色々やってみました」ということを表したかっただけで、 そもそもの問題提起が「DrawKeyInputStringとSetDrawAreaで描画可能領域を変更すること」で、 改行を完璧に実装したい(できるのか)ということです。 どうかよろしくお願いします。
Re: 複数行のテキスト入力フォームの実装 ( No.3 )
名前:sy(サイ) 日時:2011/12/14 10:31

素直にKeyInputStringで取得したデータを自前で表示して行くのが一番綺麗になると思いますよ。 DrawKeyInputStringで完璧な改行を実装するのは管理人さんの作業になってしまいます。 若しくはDXライブラリ自体をご自分で改良するか。 ちなみに http://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=past&no=1594 ライブラリの文字列関係の改行文字列ははしっかり対応されてないようです。
Re: 複数行のテキスト入力フォームの実装 ( No.4 )
名前:delt 日時:2011/12/16 03:01

やはりDXライブラリのみでは実装は出来ないみたいですね。 それを知りたかったのですっきりしました。 改めて試行錯誤して自分の目的を実装しようとしましたが、 やっぱり理想通りには出来ず、妥協することで官僚としたいと思います。 ちなみに妥協した点は以下の通りです。 ・enterキー押下による改行を諦める(SetActiveKeyInputを使用しなければ可能なのですが、文字変換リストが必要なので…) ・半角文字を入力しないことを前提とする そこで、新たな問題が出たのですが、 半角文字を入力させない方法と言うのはあるのでしょうか? MakeKeyInputの引数、SingleCharOnlyFlagで全角文字不可に出来ますが、 逆に半角文字不可(全角文字のみ可能)というのは出来ないのでしょうか?
Re: 複数行のテキスト入力フォームの実装 ( No.5 )
名前:管理人 日時:2011/12/18 17:18

文字列入力機能の自由度が低くて申し訳ありません 今回のお書き込みを見てカーソル移動の部分もDXライブラリ外で制御できるような 自由度の高い文字列入力機能を作りたいと思ったのですが、如何せん現状実装したい項目が多すぎて( +作業時間が全然確保できなくて ) 何時になるか分からない状態です、すみません orz 全角文字だけ入力できるようにする機能は数行追加すれば実装できることだったので実装してみました よろしければこちらのバージョンをダウンロードしてください m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCCTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMinGWTest.exe // MinGW 用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) MakeKeyInput 関数の最後に int DoubleCharOnlyFlag という項目を追加しました int KeyInputHandle ; KeyInputHandle = MakeKeyInput( 100, FALSE, FALSE, FALSE, TRUE ) ; とすると、全角文字しか入力できないようになります SingleCharOnlyFlag と似通った機能なので安易に引数を追加するのはどうなんだろうと思ったのですが、 現状大きく手を加える時間も無いし、そもそもそれぞれ同時に TRUE することがないフラグ達を別々の 引数にしている時点で要改修なので、今回は駄目な関数の流れに乗ることにしました (_ _; よろしければお使いください

Page: 1 |