問題タブ [editcontrol]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 選択したブラシで完全に再描画されない編集コントロール
背景色がユーザー入力の有効性に依存する編集コントロールがあります。
入力が有効な場合、編集コントロールはデフォルトの外観を維持する必要があります。そうでない場合、背景色は明るい灰色に変更されます。
ハンドラーで有効性をチェックしています。EN_UPDATE
無効な場合はHWND
、編集コントロールをに保存しvector
ます。
ビジュアル スタイルが有効になっています。
問題は、マウス ポインターの位置を変更したときに発生します。それを説明しましょう:
編集コントロールをクリックして、無効な入力を入力します。
マウス ポインターを別の場所に移動しましたが、編集コントロールにはまだフォーカスがあります。
を押して無効な入力を削除しますbackspace。
入力が有効になるとすぐに色が適切に変わりますが、境界線が太くなったり暗くなったりします。
これらの図は、問題を示しています。
データを入力する前にコントロールを編集します。
ユーザーが無効なデータを貼り付けたときの編集コントロール (マウス ポインターが灰色の領域にある):
最後の文字はr
.
マウス ポインターが編集コントロールのクライアント領域 (たとえば、ダイアログのクライアント領域) の外にあり、ユーザーがここを削除すると、次のようになります。r
太い境界線に注目してください。
マウス ポインタが編集コントロールの上に置かれると、適切に再描画されます。
関連するコード スニペットを次に示します (必要に応じて、小さなSSCCEを送信できます)。
どうすればこれを修正できますか?
c++ - エディット コントロールで無効な入力に関するツールチップを表示する
浮動小数点数のみを受け入れるようにエディット コントロールをサブクラス化しました。ユーザーが無効な入力をしたときにツールチップをポップしたいと思います。私がターゲットとする動作は、次の 1 つの編集コントロールのようなものですES_NUMBER
。
これまでのところ、追跡ツールチップを実装し、ユーザーが無効な入力を行ったときに表示することができました。
ただし、ツールチップの場所が間違っています。これを使用ScreenToClient
しClientToScreen
て修正しようとしましたが、失敗しました。
SCCEを作成する手順は次のとおりです。
1) Visual Studio でデフォルトの Win32 プロジェクトを作成します。
stdafx.h
2) 次のインクルードを のすぐ下に追加します#include <windows.h>
。
3) 次のグローバル変数を追加します。
4) エディット コントロールの簡単なサブクラス プロシージャを次に示します (テスト目的のみ)。
WM_CREATE
5) 次のハンドラーを追加します。
6) (ステートメントのMyRegisterClass
前に)で共通コントロールを初期化します。return
SSCCEについては以上です。
私の質問は次のとおりです。
メイン ウィンドウにツールチップを正しく配置するにはどうすればよいですか? キャレット座標を操作するにはどうすればよいですか?
ツールチップ ハンドルとツール情報構造をグローバルにしない方法はありますか?
お時間をいただきありがとうございます。
よろしくお願いします。
編集#1:
ScreenToClient
サブクラス プロシージャの呼び出しを削除することで、かなりの改善を達成することができました。x座標は良好ですが、y座標はわずかに低くなる可能性があります。どうにかしてグローバル変数を削除したいのですが...
編集#2:
メッセージを使用しEM_GETRECT
、y 座標を書式設定用の四角形の下部に設定することで、 y 座標を調整できました。
これで、最終結果ははるかに良くなりました。あとはグローバル変数を削除するだけです...
編集#3:
割れちゃったみたい!解決策はメッセージにEM_SHOWBALLOONTIP
ありEM_HIDEBALLOONTIP
ます!ツールチップはキャレットの位置に配置され、バルーンの形状は写真と同じで、適切に自動終了します。そして最高のことは、グローバル変数が必要ないことです!
これが私のサブクラス プロシージャ スニペットです。
c++ - 浮動小数点数のみを受け入れるようにサブクラス化されたエディット コントロールの入力検証
私の現在のプロジェクトでは、ここ数日、編集ボックスのサブクラス化に苦労しています。ここまでで、編集ボックスのサブクラス化に成功し、数字、コンマ、マイナス記号、およびキーボード コマンドのみを受け入れるように入力を検証しました。
しかし、かなり長い間、入力検証の改良に行き詰まっています。編集ボックスを次のように動作させたい:
- 最初の位置でのみマイナス記号を受け入れる
- 先行ゼロを 1 つだけ受け入れる
- コンマを 1 つだけ受け入れます
- 先行ゼロの後にコンマを強制する
- 「戻る」、「削除」、すべて選択を介して単一の文字またはテキストの選択を削除し、その上に何かを貼り付ける場合のこれらのケースを管理します
現在の形式での私のコードは次のようになり、上記で指定した高度な検証要件はほとんど提供されません。
この問題をアルゴリズム的に解決する方法についてのアイデアは非常に高く評価されています。
アップデート
David Heffernan と IInspectable の提案のおかげで、編集コントロールをサブクラス化せずに (ほぼ) 問題を解決することができました。
ダイアログ プロシージャ (編集コントロールを含む) で:
onEditChange の場合:
そして isFloat():
ユーザーに視覚的なフィードバックを追加する予定ですが、現時点では重要ではありません。
しかし、質問はまだ答えられていません。私の意図は、可能な小数点として「、」を許可することでした。
c++ - ユーザーが MFC を入力している間にエディット コントロールのテキストを検証する
質問/問題:ユーザーがユーザー名を入力する編集コントロール (テキスト ボックス) があります。入力したユーザー名とリスト コントロールにリストされているユーザー名を比較しようとしています。指定されたユーザー名が一致する場合、ボタンのテキストは からCreate User
に変わりますUpdate User
。
私の問題は、無限ループを作成せずに、文字列を比較するための正しいイベント/時間を見つけることです。
私が試したこと: エディット コントロール イベントEN_CHANGE
とEN_UPDATE
. これらのイベントは両方とも、スタック オーバーフロー例外または無限ループを引き起こします。これらのイベントの 1 つは、編集コントロール内で何かが入力されるかバックスペースが使用されるたびに呼び出されると考えていました。
私のEN_CHANGE
/EN_UPDATE
イベントでは、ユーザー名の文字列を比較し、ボタンのテキストを設定します。どちらのイベントでも、無限回と呼ばれます。
.
赤色のテキストが一致する場合は、青色で強調表示されたボタンのテキストを変更します。
ユーザーが入力した文字列をリアルタイムで検証するために、別のイベントを使用する必要がありますか?