キー入力状態のエディトボックスからフォーカスを奪いたい

[戻る]
ソイレントグリーン 2008/02/06(水) 20:58:32
何時もお世話になっております、宜しくお願いします。

プログラムは、@〜Bの状態で遷移をします
@ 親ダイアログ上で、キー入力(0〜9)あり
A DoModal()でエディトボックス(サブクラス有り)を持つ、子ダイアログが起動
B 最初に入力した、数字にフォーカスを当て、キー入力状態となる

【環境】
Windows XP SP-2 / VisualStudio2005 / MFC

【問題点】
最初に入力した一文字に、フォーカスが、かかってしまい、実際に文字が、
入力されるのは二文字目以降となってしまいます。

【このようにしたい】
最初に入力した、一文字目にフォーカスを与えず、且つ、カーソル位置は、
一文字の直後におき、即二文字目を入力可能な状態にしたい。

このように動作させることは、可能でしょうか?
もし可能であれば、方法をご教示願えないでしょうか。

ソイレントグリーン 2008/02/06(水) 21:05:15
【訂正】
フォーカスと表現していますが、正しくは文字が反転した状態のことです、
上手く説明できなくてごめんなさい。

RAPT [HomePage] 2008/02/06(水) 23:16:28
EM_SETSEL (CEdit::SetSel) でできます。

ソイレントグリーン 2008/02/07(木) 01:18:03
[[解決]]
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);
}

RAPT [HomePage] 2008/02/07(木) 13:08:38
SetSel で開始位置、終了位置ともに、現在入力されてる文字の長さを与えてやる
ことで、選択範囲なし・カーソルは末尾、という状態を実現できます。

たとえば、現在入力されている文字が1文字であれば、SetSel( 1, 1, TRUE ); とか。

古いスレッドには追加発言できません。