WindowsCE5.0/EMbeddedVC++4.0SP4/SDK(MFC未使用)にて開発
お世話になります。
複数のEditを配置したダイアログで、Edit毎に制限桁数入力されると
次のEdit,次のEditという具合にEnterキーで確定せずにフォーカスを移したいのですが、
どのようにすればいいのか途方にくれています。
・Editは全部で5つあり、それぞれ指定(制限)桁数が異なります。
・Editの桁数制限方法は設定済みです。
・ダイアログ内には他に複数のプッシュボタン、オプションボタンがあります。
Enterを押された場合、IDOKのコマンド通知があり、その場合のフォーカスの
あるEditは限定できると思いますが、制限桁数分入力されたことが通知される
もしくはチェックの方法が分かりません。
具体的な仕様としては、年月日各2桁と7桁項目と1桁項目の入力パラメータ
を数字キー入力だけ有効桁数入力する毎に各項目を入力していき、
最終的に(全部の項目が入力された時点で)Enterキーで確定したい。
というものです。
よろしくお願い致します。
EM_LIMITTEXTを使って文字数の入力制限を行っていることが前提です。
LRESULT CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_COMMAND:
// エディットの内容が変化した
if (HIWORD(wParam) == EN_CHANGE)
{
HWND hEdit = (HWND)lParam;
// 現在の入力文字数を取得
int length = GetWindowTextLength(hEdit);
// 入力制限文字数を取得
int limit = SendMessage(hEdit, EM_GETLIMITTEXT, 0, 0);
if (length == limit)
{
// 次のコントロールへ
SendMessage(hDlg, WM_NEXTDLGCTL, 0, 0);
}
return TRUE;
}
break;
}
return FALSE;
}
EM_LIMITTEXTしても、特に限界に達したことを報告してもらえないようなので、
WM_COMMANDのEN_CHANGEのタイミングで入力された文字数を取得し、
限界に達しているなら、次のコントロールにフォーカスを移動。
のようにするしかないようですね。
ちなみに、入力された文字数を取得する単一の関数はありません。
おばかな仕様ですよね(笑)。
また、「年月日各2桁」等はデジット数以外にも、範囲の制限が
あるので、サブクラス化して専用コントロール化するのが
良いかもしれません。この場合は当該のコントロールの
WM_CHARタイミングで文字数を制限できる上、親に制限に
達したことを報告できるようにも実装できますよね。
あちゃGetWindowTextLength()があったか。失礼しました。
ありがとうございました。
WM_COMMANDのEN_CHANGEのタイミングでつかまえればよいのですね。
Edit以外のコントロールにフォーカスが移ってしまった場合は、
WM_COMMANDでEditの移るべきコントロールにフォーカスをセットすれば
やりたいことができそうです。
改めまして、みなさまありがとうございます。