何時もお世話になっております、宜しくお願いします。
プログラムは、①~③の状態で遷移をします
① 親ダイアログ上で、キー入力(0~9)あり
② DoModal()でエディトボックス(サブクラス有り)を持つ、子ダイアログが起動
③ 最初に入力した、数字にフォーカスを当て、キー入力状態となる
【環境】
Windows XP SP-2 / VisualStudio2005 / MFC
【問題点】
最初に入力した一文字に、フォーカスが、かかってしまい、実際に文字が、
入力されるのは二文字目以降となってしまいます。
【このようにしたい】
最初に入力した、一文字目にフォーカスを与えず、且つ、カーソル位置は、
一文字の直後におき、即二文字目を入力可能な状態にしたい。
このように動作させることは、可能でしょうか?
もし可能であれば、方法をご教示願えないでしょうか。
【訂正】
フォーカスと表現していますが、正しくは文字が反転した状態のことです、
上手く説明できなくてごめんなさい。
EM_SETSEL (CEdit::SetSel) でできます。
RAPTさん、いつもお世話になっております。
エディットボックスをサブクラス化した部分の、メッセージハンドラを受ける部分で、
下記の様に実装しましたら、一文字目は反転表示されていますが、
続けてキー入力を行うと、一文字目の反転が解除されて、
直後に二文字目を入力することが、できました。
先に【このようにしたい】で書きました、振舞いとは若干異なりますが、
十分に目的を果たすことができました、どうもありがとうございました。
// コンストラクタ
CNumberEditBox::CNumberEditBox() : dwSelection(-1), bNoScroll(FALSE)
{
}
// CNumberEditBox メッセージ ハンドラ
void CNumberEditBox::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) {
CEdit::SetSel(dwSelection, bNoScroll);
SetLimitText( 4 );
if( nChar == VK_BACK ||
nChar == VK_DELETE ||
nChar == VK_TAB )
{
CEdit::OnChar(nChar, nRepCnt, nFlags);
return;
}
// 0~9以外の場合は、何も行わずに終了。
// 0~9までは、既存のハンドラ呼び出し。
if( !( nChar >= '0' && nChar <= '9') )
{
return;
}
CEdit::OnChar(nChar, nRepCnt, nFlags);
}
SetSel で開始位置、終了位置ともに、現在入力されてる文字の長さを与えてやる
ことで、選択範囲なし・カーソルは末尾、という状態を実現できます。
たとえば、現在入力されている文字が1文字であれば、SetSel( 1, 1, TRUE ); とか。