『ながっちゃん』のページ

気まぐれ兄ちゃんの独り言

#7[CPP]テキストボックスに文字列を追加する

内容

テキストボックスに文字列を追加するする方法です。

解説

  長時間の処理を行う時に処理の途中経過を画面に表示して進行状況をわかるようにすることがあります。表示する文字列が短い場合はスタティクコントロールに表示してもいいのですが、一画面に表示しきれないような行数が多くて長いメッセージを表示するような場合にはテキストボックス(エディットコントロール)に表示するとスクロールできて便利です。
 サンプルでは、まずダイアログにエディットコントロール(IDC_EDIT1)を配置し、プロパティの垂直スクロールバー(Vertical Scroll)を表示し読み取り専用(Read Only)にします。また、必要に応じて水平スクロールバー(Horizontal Scroll)も表示します。更に、複数行(MultiLine)を表示できるようにします。
 次に、何らかの処理が行われている途中でメッセージを表示するようにします。サンプルでは「実行(R)」ボタンがクリックされた時にメッセージを表示するようにしています。表示するにはエディットコントロール(CEdit)のメンバー関数、SetSel( )ReplaceSel( )を使います。SetSel( )でエディットコントロール内の文字列を選択します。1番目の引数から2番目の引数までの範囲の文字列が選択されます。1番目と2番目の引数に実際に入力されている文字数よりも大きい値を設定することが文字列の一番最後を選択することができます。3番目の引数はカレット(文字入力用カーソル)をビュー内をスクロールするかどうかの指定で、FALSEはスクロールします。つまり、FALSEにしておけば表示する行数が増えて1画面に収まらない時にスクロールして文字列の一番最後を表示させることができます。ReplaceSel( )で選択範囲の文字列を1番目の文字列で置き換えます。サンプルの場合SetSel( )で文字列の一番最後が選択されているので置き換えではなく最後に文字列が追加されます。ReplaceSel( )の2番目の引数はUndoできるようにするかどうかの指定で、サンプルの場合はメッセージを表示するだけなのでUndoできないようにしています。
 なお、エディットコントロールに文字列を追加したり置き換えたりするのではなく、全部の文字列を置き換える場合はCWnd::SetWindowText ( )を使います。

サンプル

< ダイアログボックスの例>
テキストボックスを配置したダイアログサンプル

// CDiaglogTextBox メッセージ ハンドラ

void CDiaglogTextBox::OnBnClickedButton1()
{
	// TODO : ここにコントロール通知ハンドラ コードを追加します。
	CEdit*       pMyEdit = (CEdit*)GetDlgItem( IDC_EDIT1 );
	COleDateTime dtNow;
	CString      strMsg;

	// 処理開始
	dtNow = COleDateTime::GetCurrentTime();
	strMsg.Format( _T("処理開始:%s\r\n"), dtNow.Format( _T("%Y/%m/%d %H:%M:%S") ) );
	pMyEdit->SetSel( 999999999, 999999999, FALSE );
	pMyEdit->ReplaceSel( (LPCTSTR)strMsg, FALSE  );
	this->RedrawWindow();

	// 各種処理
	for ( int i = 1; i < 21; i++ )
	{
		strMsg.Format( _T("フェーズ%d\r\n"), i );
		pMyEdit->SetSel( 999999999, 999999999, FALSE );
		pMyEdit->ReplaceSel( (LPCTSTR)strMsg, FALSE  );
		this->RedrawWindow();
	}

	// 処理終了
	dtNow = COleDateTime::GetCurrentTime();
	strMsg.Format( _T("処理終了:%s\r\n"), dtNow.Format( _T("%Y/%m/%d %H:%M:%S") ) );
	pMyEdit->SetSel( 999999999, 999999999, FALSE );
	pMyEdit->ReplaceSel( (LPCTSTR)strMsg, FALSE  );
	this->RedrawWindow();
}