トップページ > 記事閲覧
ToolLib_StringInput改造
名前:gmo 日時: 2017/10/18 00:15

お世話になってます。 現在SwordBoutについているToolLibの改造を継続してる状況なのですが、StringInputで躓いております。 ToolLibはToolLibウインドウそれぞれの内側の描画について、SetDrawAreaを呼び出し、スクロールとの整合性を取りながら行っておりますが、 これがStringInputと相性が悪く、入力域に変換ウィンドウや入力モードウィンドウがかぶさるように表示されたり、 入力域がスクロールの結果狭くなってるところに、入力文字が無理やりな感じで表示が行われてしまいます。 入力中はSetDrawAreaで描画制限なしに設定して変換ウィンドウが入力域に被らないようにしたり、いろいろ回避策を 練っては調整するのですが、描画が納得いかない結果になったり、バグなのか仕様なのかわからない ことが起きたり・・ということがここしばらくの自分の開発の傾向になってしまってます。 ゲーム自体の開発というより、ゲーム構築のツール開発というカテゴリになってしまい、かつ何かが問題というよりほぼ見た目の話になってしまいますが、 相談に乗って頂けたら幸いです。 まず、変換ウィンドウ、IME入力モード表示はSetDrawAreaの描画制限領域の設定の影響を受けずに表示できるようにしたいのですが、可能でしょうか。 IME入力モードは表示の関数が独立しているため、自前でSetDrawAreaを呼び出して制限を解除できるのであまり問題はないのですが、 変換ウィンドウについては、まずどう考えたらいいのかわからない状況です。 なのでいっそ、入力文字列以外は描画制限がかからず(画面全体からの制約のみで)表示が出来たら・・と思った次第です。 次に入力文字列についてですが、掲示板の過去ログにて関係してそうなものをいくつかざっと読ませていただきましたが、スクロール対応には時間がかかるとのことでしたので、 せめて入力ハンドルがアクティブでないときはToolLibウィンドウのスクロールに準じた表示ができないものか・・・と思い、 全くの妄想レベルですが、キー入力ハンドルがアクティブでなくなる折に入力中文字列を保存して、DrawObtainsString_CharClip的な改行を加えたのち、通常の文字列表示を SetDrawAreaで制限をかけながら行えるといいかなと考えてます。 そこで、もし入力中文字列の描画用の加工がdxlib.hで公開している関数でできうるのであれば、その表示用の文字列加工の流れを教えていただきたいです。 最後に、StringInputやKeyInput関連をいじってて気になったことや疑問、要望を雑列挙させていただきます。 (以下は解答だけ頂ければ十分です・・なにぶん困ってるというわけではないので) @関数RectClippingは具体的にどういうことをしている関数なのか AIMEモード表示について、例えば全角ひらがなにして一度変換→確定を行うと一旦表示が消え、再度入力を再開すると表示されるが これを継続的に表示にするのは難しいか BIMEで変換の際、単語または文節ごとに下線が引かれ、変換中のものには左にカーソルが出現するが、変換中のものの下線はほかの下線より 太く表示し、カーソルは一番右に表示するといったような表示にしてほしい。 CMakeKeyInputで文字数(MaxStrLength)を0に設定し入力しようとすると例外エラーになる。念のため報告 以上、よろしくお願いします。
メンテ

Page: 1 |

Re: ToolLib_StringInput改造 ( No.1 )
名前:管理人 日時:2017/10/18 01:12

> まず、変換ウィンドウ、IME入力モード表示はSetDrawAreaの描画制限領域の設定の影響を受けずに表示できるようにしたいのですが、可能でしょうか。 DrawKeyInputModeString でIME入力モードを描画するサイト同じように自前で SetDrawArea を呼び出して 描画制限領域を解除すれば解決、というわけではないでしょうか? > そこで、もし入力中文字列の描画用の加工がdxlib.hで公開している関数でできうるのであれば、その表示用の文字列加工の流れを教えていただきたいです。 すみません『入力文字列の描画用の加工』とは具体的にはどのようなことでしょうか? とりあえず DrawKeyInputString や DrawObtainsString_CharClip の中で行っていることは DxLib.h に 載っている関数だけで実現していますので、よろしければDXライブラリのソースの DxInputString.cpp の 中にある関数 NS_DrawKeyInputString や DrawObtainsString_CharClip_WCHAR_T のコードをご覧になってみてください > @関数RectClippingは具体的にどういうことをしている関数なのか 引数 Rect が示す矩形が引数 ClippuRect が示す矩形よりはみ出ていたら、はみ出ている部分を ClippuRect が示す 矩形に収まるように補正する、という処理を行う関数です DxMath.cpp に実際の処理が書かれていますので、よろしければご覧ください > AIMEモード表示について、例えば全角ひらがなにして一度変換→確定を行うと一旦表示が消え、再度入力を再開すると表示されるが > これを継続的に表示にするのは難しいか できました ただ、今からDxLib.libファイルを作成すると睡眠時間が危険なことになってしまうので明日修正版をアップします m(_ _;m > BIMEで変換の際、単語または文節ごとに下線が引かれ、変換中のものには左にカーソルが出現するが、変換中のものの下線はほかの下線より > 太く表示し、カーソルは一番右に表示するといったような表示にしてほしい。 カーソルについてですが、あのカーソルは IME入力中の文字列を抜いた文字列の入力位置なので今の位置から動かすことはできません ( IME入力の文字列は、決定した瞬間にその文字列がキー入力された、という体で処理されています ) 変換中のものの下線を太くする事についてですが、色が変わるだけでは不十分でしょうか? (・・; > CMakeKeyInputで文字数(MaxStrLength)を0に設定し入力しようとすると例外エラーになる。念のため報告 ご報告ありがとうございます MaxStrLength に 0 が渡された場合はエラーになる( 戻り値が -1 になる )ようにしました こちらの変更も明日アップする修正版に反映されます m(_ _;m
メンテ
Re: ToolLib_StringInput改造 ( No.2 )
名前:管理人 日時:2017/10/19 00:36

お待たせしました 昨日申し上げていました修正を加えたバージョンをアップしましたので、 よろしければお試しください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.exe // Windows版 C++ Builder 10.1 Berlin 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース ( 中身を既存のライブラリのファイルに上書きして、VisualStudioをお使いの場合は『リビルド』を、  BCCをお使いの場合は『再構築』をして下さい )
メンテ
Re: ToolLib_StringInput改造 ( No.3 )
名前:gmo 日時:2017/10/19 20:37

ご回答およびご対応、ありがとうございます。 テストバージョンにて、MakeKeyInputのエラー処理、およびIME変換モードの継続表示を確認いたしました。 > DrawKeyInputModeString でIME入力モードを描画するサイト同じように自前で SetDrawArea を呼び出して > 描画制限領域を解除すれば解決、というわけではないでしょうか? 一番最初にそのような形にしましたが、入力の時に文字列がウィンドウからはみ出る表示となります。 現状ですと、入力文字列の表示制限を優先して変換ウィンドウは表示自体をやめるか、変換ウィンドウの表示を優先して 入力文字列の表示制限をあきらめるか、という選択肢になってます。 (機能的には後者で問題はないのですが・・) できれば入力文字列以外の表示の制限は、入力文字列の表示制限と別にもできるオプションが欲しいと思った次第です。 > 中にある関数 NS_DrawKeyInputString や DrawObtainsString_CharClip_WCHAR_T のコードをご覧になってみてください はい、ソースを見てできそうなことを探ることにします。 > 引数 Rect が示す矩形が引数 ClippuRect が示す矩形よりはみ出ていたら、はみ出ている部分を ClippuRect が示す > 矩形に収まるように補正する、という処理を行う関数です > DxMath.cpp に実際の処理が書かれていますので、よろしければご覧ください ありがとうございます。 知らなかったので、似たようなものを自分で作ってました・・・ ライブラリで用意されているのならこちらに替えようと思います。 > カーソルについてですが、あのカーソルは IME入力中の文字列を抜いた文字列の入力位置なので今の位置から動かすことはできません > ( IME入力の文字列は、決定した瞬間にその文字列がキー入力された、という体で処理されています ) > 承知しました。 重要な役目を持ってるならおいそれと動かせないですね。 > 変換中のものの下線を太くする事についてですが、色が変わるだけでは不十分でしょうか? (・・; 変換箇所を識別することに関してはもちろん色で十分なのですが、一応は汎用的な使い方ができるように構築しており、 その入力文字の色がらみの設定は、文字色と背景色、文字選択時の文字色と背景色くらいの設定に極力抑えたいと思っています。 というのも、文字色関連の設定は単独の設定で済まない場合も多く、「見やすさ」や「それと区別するためにそれに被らない色」などの 色設定全体を見る調整が出てしまうためです。 (キーインプットを初めて触ったときに、カラフル過ぎるという印象を持ってしまったというのもありますが、) それでキーインプット関連の全体の色数を落として調整をし、入力文字については通常の文字列とIME文字列の差を なくしていったのですが、変換についてはせっかく下線が表示されているのだから、それで変換中とそれ以外の識別ができれば・・・ と思いました。 キーインプットにおいて、細かく色を設定できるのはカラフルにもシンプルにもできるので非常にありがたく、 実際それを多く利用して構築しているのですが、カラフルにした場合の「色に寄せた」表示だけでなく、 色数を少なくした場合の、下線の太さなどでのいわば「形に寄せた」表示もできるようになったらうれしいです。
メンテ
Re: ToolLib_StringInput改造 ( No.4 )
名前:管理人 日時:2017/10/21 00:49

> できれば入力文字列以外の表示の制限は、入力文字列の表示制限と別にもできるオプションが欲しいと思った次第です。 すみません、私も失念していたのですが既にそれを実現するための関数がありました // キー入力ハンドルの入力中文字列を描画する際の描画範囲を設定する int SetKeyInputDrawArea( int x1, int y1, int x2, int y2, int InputHandle ) ; こちらを使用することで入力中の文字列のみ描画範囲を制限することができます ( ただしIME入力中の文字列は描画範囲を無視します ) > キーインプットにおいて、細かく色を設定できるのはカラフルにもシンプルにもできるので非常にありがたく、 > 実際それを多く利用して構築しているのですが、カラフルにした場合の「色に寄せた」表示だけでなく、 > 色数を少なくした場合の、下線の太さなどでのいわば「形に寄せた」表示もできるようになったらうれしいです。 詳しいご説明ありがとうございます、納得しました 変換時の選択中の文節の下線について太く描画されるように処理を変更してみましたので、 よろしければご確認ください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.exe // Windows版 C++ Builder 10.1 Berlin 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース ( 中身を既存のライブラリのファイルに上書きして、VisualStudioをお使いの場合は『リビルド』を、  BCCをお使いの場合は『再構築』をして下さい )
メンテ
Re: ToolLib_StringInput改造 ( No.5 )
名前:gmo(解決) 日時:2017/10/22 13:23

対応ありがとうございます。 > 変換時の選択中の文節の下線について太く描画されるように処理を変更してみましたので、 > よろしければご確認ください m(_ _)m テストバージョンにて変換時の「太線の下線」を確認しました。ありがとうございます! > // キー入力ハンドルの入力中文字列を描画する際の描画範囲を設定する > int SetKeyInputDrawArea( int x1, int y1, int x2, int y2, int InputHandle ) ; > こちらを使用することで入力中の文字列のみ描画範囲を制限することができます > ( ただしIME入力中の文字列は描画範囲を無視します ) ありがとうございます。 この関数を組み込んだところ、表示制限を別個にできることを確認しました。 掲示板でこの関数のトピックをざっと読んだときにもっと深く内容読めばよかったと反省してます・・ 文字列末尾の見切れ対応としか把握してませんでした。 細かいところですがこの関数について、KeyInputに設定してる領域がスクロールの結果実質描画されないようなとき、 (例えばRectClippingの結果矩形の座標が50,50,50,100のようなとき) 描画処理を進めてしまった場合、新たにSetDrawArea(0, 0, 999999, 999999)が呼ばれるまで、(通常の?)描画制限が 残り、ほかのオブジェクトの描画がされないということがありました。 すなわち、上記の状況の時にも問題なく描画を通したい場合は、 // 入力文字列制限の設定 SetKeyInputDrawArea(temp.left, temp.top, temp.right, temp.bottom, inputHandle); // 変換ウィンドウは制限なしにする SetDrawArea(0, 0, 999999, 999999); // 入力中文字列の描画 DrawKeyInputString(temp.left, temp.top, inputHandle); // 設定を元に戻す SetDrawArea(0, 0, 999999, 999999); としなければならないみたいです。 矩形が特殊な状況ですし、SetDrawAreaを同じ設定でDrawKeyInputString前後で呼び出すことに 個人的に少しモヤモヤしただけではありますが、一応報告します。 (構築中のものは矩形がスクロールの結果一定幅の表示領域を持たない場合は描画プロセス自体を通さないように する予定です。負荷の削減や、この関数と関係のない問題もあったので) 対応していただき本当にありがとうございました。 次に進めそうなので解決とさせていただきます。
メンテ
Re: ToolLib_StringInput改造 ( No.6 )
名前:管理人 日時:2017/10/24 00:28

> 細かいところですがこの関数について、KeyInputに設定してる領域がスクロールの結果実質描画されないようなとき、 > (例えばRectClippingの結果矩形の座標が50,50,50,100のようなとき) >  > 描画処理を進めてしまった場合、新たにSetDrawArea(0, 0, 999999, 999999)が呼ばれるまで、(通常の?)描画制限が > 残り、ほかのオブジェクトの描画がされないということがありました。 ご指摘ありがとうございます 面積が 0 になる範囲の引数を SetKeyInputDrawArea に渡した状態で DrawKeyInputString を呼んでも SetDrawArea の設定が変更されたままにならないように修正しましたので、よろしければお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.exe // Windows版 C++ Builder 10.1 Berlin 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース ( 中身を既存のライブラリのファイルに上書きして、VisualStudioをお使いの場合は『リビルド』を、  BCCをお使いの場合は『再構築』をして下さい )
メンテ
Re: ToolLib_StringInput改造 ( No.7 )
名前:gmo(解決) 日時:2017/10/24 19:05

ご対応ありがとうございます。 テストバージョンにて、上記の描画プロセスからDrawKeyInputStringの後のSetDrawArea(0, 0, 999999, 999999)を 削除した状態で実行しても、ほかの描画プロセスには影響がないことを確認しました。
メンテ

Page: 1 |

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

   クッキー保存