エディットボックスの最後に文字列を表示させる方法




マルチラインのエディットボックスを使って、ReplaceSel()関数を使用して、どんどん行を 追加していく場合、通常はそのままで問題はありません。
しかし、キーボードやマウスからエディットボックスに対する操作を行い、カーソル位置が エディットボックスの最終位置から移動してしまった場合、ReplaceSel()関数で表示しよう とした文字列が、変なところに表示されてしまいます。
これはReplaceSel()関数が選択文字またはカーソルのある位置から表示してしまう為です。
これを回避する為には、一度、カーソル位置をエディットボックスの最終位置に移動させて やる必要があります。
しかし、MSDNにはそんな方法はさっぱり書いていません。
なんて、不親切なんだと思いますがMFC関数を使えば可能だったので許してやりましょう。

方法としては、GetLimitText()関数でエディットボックスに表示できる最大バイト数を取得して、 SetSel()関数に先の最大バイト数を渡す事でカーソル位置を最後に移動させる。
この二つの手順で可能です。

(サンプル)
    UINT     EditMax;                           // テキストの最大値
    va_list  ap;                                // 可変パラメータリスト
	char     Msg_Edit[255];                     // ログ編集バッファ

    // ログ編集バッファ初期化
    memset( Msg_Edit,NULL,sizeof(Msg_Edit) );

    // 可変パラメータ編集準備
    va_start( ap, Format );

    // 可変パラメータ編集
    va_arg( ap, char* );
    (void)vsprintf( Msg_Edit,Format,ap );

    // 可変パラメータ編集終了
    va_end( ap );

    // エディットボックスに表示できる最大バイト数を取得する
    EditMax = E_Logging_ptr->GetLimitText();
    // カーソルを最後に移動させる
    E_Logging_ptr->SetSel( EditMax, EditMax, FALSE );
    // エラーログを表示させる
    E_Logging_ptr->ReplaceSel( Msg_Edit );
    E_Logging_ptr->ReplaceSel( "\r\n" );
サンプルではメンバ変数は使わずにオブジェクトのアドレスを取得して、使用している ので、ちょっと分かりにくいかもしれません。
メンバ変数を使用するとGetLimitText()関数の記述は
m_Logging.GetLimitText();
となると思います。





N総研ソフトウェア開発部のTOPに戻る。

このページに関するご意見・質問は
ドンタコスN村 E-mail:wnaka@coco.ned.co.jp
まで送信してください。