エディットボックスに文字を追加する

エディットボックスに文字を表示する場合、SetWindowText()等を使って表示できます。
しかしこの関数は一度に全てを更新するので文字を追加する場合は向きません。
そこでキーボードを叩いて書き込むように文字を追加するには文字列を追加したい位置にカレットを移動し
CEdit::ReplaceSel()で文字列を置換えてやることで実現できます。
カレットを移動するにはCEdit::SetSel()を使ってください。

ではエディットボックスの最後に文字を追加するサンプルです。


// エディットボックスの最後に文字を追加
// 引数 lpText 追加する文字列
void CXxxDlg::EditBoxAddText(LPCTSTR lpText)
{
    // IDC_EDITBOX は文字を追加するエディットボックスのID
    CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDITBOX);
    int nLastPos = pEdit->GetWindowTextLength();
    BOOL bFocus = FALSE;

    // フォーカスを一時退避
    if (::GetFocus() == pEdit->m_hWnd)
    {
        bFocus = TRUE;
        GetDlgItem(IDOK)->SetFocus();
    }

    // 文字を追加
    pEdit->SetSel(nLastPos, nLastPos);
    pEdit->ReplaceSel(lpText);

    // フォーカスを戻す
    if (bFocus)
        pEdit->SetFocus();
}

まずはカレットをエディットボックスの最後に移動させる為にGetWindowTextLength()
エディットボックスの文字数(最後の文字の位置)を取得します。
そしてSetSel()で最後に移動しReplaceSel()で文字を追加してやっています。
通常はこれだけで十分なのですがSetSel()を実行した後、ReplaceSel()を実行するまでの
ほんの僅かな時間にユーザの入力でカレット位置を変更されると文字が消る等の問題が生じます。
# タイマー等で自動的に文字を追加するようにして、その間エディットボックス内の文字をマウスのドラッグで
# 選択範囲を高速で変え続けてみて下さい。文字が変な所に追加されたり消えたりするでしょう。
これを回避するには、もし文字を追加する段階でエディットボックスにフォーカスがあった場合
一時的にエディットボックスからフォーカスを移動する事で解決できます。

< 戻る << HOME ©1999-2001 by Akky, All right reserved.