今回は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で位置情報も取得しますが、今回は省きます。

コメント