符号付きの 10 進数を符号付き区切り記号edit control
の形式で受け入れるを作成しようとしています(例: )。-1.5
インターネットで広範囲にわたる調査を行った結果、マスクされたエディット コントロールの満足のいく例はほとんど見つかりませんでしたが、MFC
.
を知らないのでMFC
、そのコードを純粋な に変換するのに苦労するWin32 API
ので、ゼロから自分のやり方でやってみることにしました。
例を注意深く調べた結果、メッセージMFC
に応答するときにテキスト検証を実行すると結論付けましたEN_UPDATE
。
同じことをしようとすると、プログラムは警告やエラーメッセージなしですぐに終了します。私の問題は再帰に違いないと結論付けました。
これを確認するために、メイン ウィンドウのプロシージャに小さなハンドラを記述して、これをテストしました。
case WM_COMMAND:
switch( HIWORD( wParam ) )
{
case EN_UPDATE:
if( LOWORD(wParam) == IDC_OF_MY_EDIT_CONTROL)
{
static int counter = 0; // increment it each time we get EN_UPDATE
// after we receive EN_UPDATE 4 times stop testing
if( ( counter++) < 4 )
{
wchar_t text[10]; // get sample text
GetWindowText( (HWND)lParam, text, 10 );
// change current char to char + 1
// which means A will be B, B will be C and so on...
for( int i = 0; i < wcslen(text); i++ )
text[i] = (wchar_t)( 1 + text[i] );
SetWindowText( (HWND)lParam, text ); // show changed text
}
}
break;
}
break;
case WM_CLOSE: // WM_CLOSE and other handlers...
Debug
モードでプログラムを起動すると、次のようになります。
文字a
を入力すると、編集コントロールのテキストが に変わりますe
。
これは、再帰に関する私の結論を裏付けています。押すa
と、 に変換されb
、次に別のEN_UPDATE
発射が行われ、変数に到達して結果がになるまでプロセスが繰り返され、b
に変わりました。c
static
4
e
私の質問は簡単です:
EN_UPDATE
この種の再帰を回避するには、プログラムをどのように処理または変更すればよいですか?
編集 (2014 年 2 月 18 日):
メンバーJonathan Potterの指示に従って、上記のEN_UPDATE
ハンドラーを変更しました。
再帰の問題はなくなりましたが、出力は私が望んでいたものではありません。
簡単なコンソール アプリケーションで文字を後継者に置き換えるコードの正確性を確認し、ボタンをクリックするときに同じことを行いました (ボタンとそれをクリックするためのハンドラーをすばやく追加することは難しくありませんでした)。 )。
したがって、問題は指定された指示の実装にあるに違いないため、誰かが私が間違ったことを指摘してくれることを期待して、修正したコードを送信します。
case EN_UPDATE:
if( LOWORD(wParam) == IDC_OF_MY_EDIT_CONTROL)
{
static bool OK_to_process_text = true;
if( OK_to_process_text )
{
OK_to_process_text = false;
wchar_t text[10];
memset( text, L'0', sizeof(text) );
GetWindowText( (HWND)lParam, text, 10 );
for( size_t i = 0; i < wcslen(text); i++ )
text[i] = (wchar_t)( 1 + text[i] );
SetWindowText( (HWND)lParam, text );
OK_to_process_text = true;
}
}
break;
}
break;
さて、a
正しく押すと に変わりますがb
、押した後b
は期待した結果が得られませんbc
がcc
.
ユーザーがキーを押した後、EN_UPDATE
テキストを表示するためにキーが生成されるため、これは予期されることです。
したがって、押すa
と に変換されb
ます。b
後でEN_UPDATE
押すと、新しいメッセージが生成されるため、ハンドラーが最初からやり直します。つまり、新しい文字列bb
を取得して適切に変換しcc
ます。
EN_UPDATE
現在のテキストを操作しているときに新しいメッセージの作成を一時的に抑制する方法はありますか?上記の例では、次に押すbc
代わりに結果が得られますか?cc
a
b
編集の終わり
お時間をいただき、ありがとうございました。
よろしくお願いします。