MFCプロジェクトでCEditクラスを操作する

今回はMFCアプリで頻繁に使うコントロールの一つ、
CEditクラスの操作方法について。

毎度のことながら、自分がよく使う操作の備忘録です。

準備

プロジェクト作成

プロジェクトの作成方法、コントロールの配置方法は
こちらをご覧ください。

今回のプロジェクト名は「CEditTest」にします。

コントロールID

Edit Controlを配置後、IDを変更します。
変更方法は、以前CStaticの操作時に書いてますのでご参考に。

今回はIDC_EDIT_TESTに変更。

ビルド

一度ビルドしておきます。

テキスト設定

CStaticクラスを操作する時に一度説明しましたが、
今回もGetDlgItem方式で進めていきます。

プロジェクト名をCEditTestで作成したので、
CEditTestDlg.cppを開きます。

テキスト設定

エディットボックスにテキストを設定します。

OnInitDialog内に処理を記述。

BOOL CCEditTestDlg::OnInitDialog()
{
	// 略

	// TODO: 初期化をここに追加します。
	CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT_TEST);
	pEdit->SetWindowText(_T("Edit Controlにテキストを設定します。"));	// テキスト設定

	return TRUE;  // フォーカスをコントロールに設定した場合を除き、TRUE を返します。
}

ポインタ取得は同じです。
スタティックテキストと同様、SetWindowTextで設定します。

これでビルドをし、exeを開くと。

設定できました。

なお取得方法は後で紹介します。

表示・非表示 活性・非活性

こちらについては、CStaticクラスを操作したときと同様です。

一気に書いていきます。

BOOL CCEditTestDlg::OnInitDialog()
{
	// 略

	// TODO: 初期化をここに追加します。
	CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT_TEST);
	pEdit->SetWindowText(_T("Edit Controlにテキストを設定します。"));	// テキスト設定

	pEdit->ShowWindow(SW_HIDE);	// 非表示
	pEdit->ShowWindow(SW_SHOW);	// 表示

	pEdit->EnableWindow(FALSE);	// 非活性
	pEdit->EnableWindow(TRUE);	// 活性

	return TRUE;  // フォーカスをコントロールに設定した場合を除き、TRUE を返します。
}

実際に動かしたい場合は、4つのうち3つをコメントアウトしてそれぞれ動作確認してみてください。
今回は非活性のパターンを試します。

ちょっとわかりづらいですが、
何が起こっているかというと、
エディットボックスが編集できないようになってます

カーソルを当てることすらできません。

ある一定条件の場合は編集できるけど、
それ以外は編集させないようにする、などの処理を作りたいときに便利です。

文字数制限

エディットボックスに入力できる文字数を制限できます。

BOOL CCEditTestDlg::OnInitDialog()
{
	// 略

	// TODO: 初期化をここに追加します。
	CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT_TEST);
	//pEdit->SetWindowText(_T("Edit Controlにテキストを設定します。"));	// テキスト設定
	pEdit->SetLimitText(20);

	return TRUE;  // フォーカスをコントロールに設定した場合を除き、TRUE を返します。
}

初期表示のテキスト設定はひとまずコメントアウト。

これで、20文字までしか入力できません。

ビルドして確認をすると。

半角、全角、どちらも20文字まで入力が可能です。

フォーカス処理

CEditクラス関連ではないですが、
こちらもよく使うので紹介します。

まずリソースから画面を出します。
その後、エディットボックスを選択し、
右クリックから「イベントハンドラーの追加」を選択します。

ここで、イベントが起こった場合に呼ばれる関数を作ることができます。

※先の例で、エディットボックスが非活性になっていたら、
 コメントアウトなどして活性化してください。

チェンジ

メッセージの種類をEN_CHANGEに。
注意なのが、クラスの種類がデフォルトでCAboutDlgになる場合があるので、
適用させるクラス、今回だとCEditTestDlgに変更します。

関数名・ハンドラーの説明はデフォルトで構いません。
関数名は、メッセージ種類とID名から自動で作られます。

すると、CEditTestDlg.cppに関数が作られます。

void CCEditTestDlg::OnEnChangeEditTest()
{
	// TODO: これが RICHEDIT コントロールの場合、このコントロールが
	// この通知を送信するには、CDialogEx::OnInitDialog() 関数をオーバーライドし、
	// CRichEditCtrl().SetEventMask() を関数し呼び出します。
	// OR 状態の ENM_CHANGE フラグをマスクに入れて呼び出す必要があります。

	// TODO: ここにコントロール通知ハンドラー コードを追加してください。
}

この関数は、
エディットボックスの中身が変更されるたびに呼ばれる関数です。

試しに、メッセージボックスを入れてみます。
不要コメントは削除しておきます。

void CCEditTestDlg::OnEnChangeEditTest()
{
	AfxMessageBox(_T("Change関数が呼ばれました"));
}

一度ビルドします。

この状態でエディットボックスにカーソルエディットボックスの中身を編集します。

文字を一文字消去したので、メッセージが出てきました。
文字を挿入しても同じくメッセージが出てきます。

このように、編集の度に呼ばれるイベントがEn_CHANGEです。

以降の処理、メッセージ出現が煩わしい人は、
今作ったメッセージボックスをコメントアウト推奨です。

補足

exeを開くとき、一番最初にメッセージボックスが出るときがありますが、
OnInitDialogでテキストを設定している場合、最初にチェンジ関数が働く場合があります。

セットフォーカス

今度はセットフォーカス処理を作ります。

イベントハンドラーから、EN_SETFOCUSを選択。
クラスを変更するのを忘れずに。

このイベントは、
エディットボックスにカーソルがセットされると呼ばれる関数です。

メッセージボックスを入れて、確認です。

void CCEditTestDlg::OnEnSetfocusEditTest()
{
	AfxMessageBox(_T("Set Focus関数が呼ばれました"));
}

エディットボックスにカーソルセットすると。

関数が呼ばれていることが確認できます。

キルフォーカス

フォーカスを当てたときに呼ばれる関数があるなら、
フォーカスを外したときに呼ばれる関数もあるのでは?
と思った方、大正解です。

イベントハンドラーからEN_KILLFOCUSを選択します。
クラス種類を要チェック

同じくOKボタンを押し、
関数内にメッセージを追加します。

void CCEditTestDlg::OnEnKillfocusEditTest()
{
	AfxMessageBox(_T("Kill Focus関数が呼ばれました"));
}

このイベントは、
エディットボックスからカーソル外れると呼ばれる関数です。

エディットボックスにカーソルが当たっています。
この状態でカーソルを外す(TABキーやOKボタンを押す)と。

キルフォーカス関数が呼ばれました。

テキスト取得

これを後回しにした理由ですが、
OnInitDialogだけでは取得している処理が分かりづらいので、
イベントが欲しかったのです。

今回、キルフォーカスイベントを使って確認します。

フォーカス処理で作ったメッセージ3つはひとまずコメントアウトです。

キルフォーカス関数内に、次を記述。

void CCEditTestDlg::OnEnKillfocusEditTest()
{
	//AfxMessageBox(_T("Kill Focus関数が呼ばれました"));

	CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT_TEST);
	CString strText;	// テキストを格納します
	pEdit->GetWindowText(strText);	// テキスト取得
	AfxMessageBox(strText);	// ちゃんと取得できてるか確認
}

GetWindowTextを使い、引数のstrTextに情報を渡します。

取得した情報は、メッセージボックスで表示させます。

注意なのが、
昔自分がよくやっていたミスとして

CString strText = pEdit->GetWindowText();  // これは違う

ではありません。
コンパイルエラーになるので、おかしいとすぐに気づけます。

ビルドして確認します。

exeを開き、エディットボックスの中身を編集します。

この状態でフォーカスを外すと。

エディットボックスの中身を取得できています。

終わりに

今回は、自分がよく使うCEdit関連の処理をまとめてみました。

エディットボックスを使用する際は基本的に、
今回述べたものをメインに使います。

たまに、Rectで位置情報も取得しますが、今回は省きます。

SampleSrc/CPlusPlus/ControlOpeartion/ControlTest at main ?? Tatsumath/SampleSrc
Various sources, mostly C++. Contribute to Tatsumath/SampleSrc development by creating an account on GitHub.

コメント

タイトルとURLをコピーしました