EditBoxとStaticの使い方
前々回に、Dialogのコーナーで簡単なButtonとUpdateDataによるダイアログとプログラム間でのデータ通信、背景色の変更などちょっと目を引くものをやりましたが、肝心のコントロールそのものについてはあんまり深く触れてきませんでした。そこで、今回はコントロールの使い方を伝授?します。

1. とりあえず使ってみる
始めにこの2つのコントロールの説明をしておきますね。EditBoxは、ユーザが入力したり、結果を表示できる枠みたいなもので、よくホームページのアンケートにE-mailのアドレスを書き込むようなやつです。説明では分かりにくいですが、見たことがない人は多分いないでしょう。Static とは、ダイアログ上に書かれる文字列のことです。ここではStaticについては特に説明しません。ただ、スタティックのプロパティのキャプションを変更するだけだからです。

とりあえず、「EditBoxを配置し、そこに文字列を表示する」程度から始めてみます。新規作成で
1.プロジェクトでMFC AppWizard(exe)を選択し、プロジェクト名は、DlgTestとしておく
2.「作成するアプリケーションの種類」はダイアログベースを選択
3.Step 2/4で、ダイアログのタイトルを変更したい人はしておく
ダイアログのタイトルは、後でも変更ができるので別に気にしなくてOK。別にこだわらない人は、ここはSkipしていいです。ちなみにこのタイトル記入欄がEditBoxです。
4.終了してOK
さて、ダイアログを編集します。この作業はリソースを変更すると言ったのですね。
1.ワークスペースのリソースタブをクリック
2.DlgTestリソースのDialogフォルダをダブルクリック
3.IDD_DIALOG1を開く
4.以下の図のように編集する。
OKボタンは残しておいて、キャンセルボタンと”Todo:ダイアログのコントロールをここに配置”というスタティックは消す。「選択してDeleteキー」でコントロールは消去できます。EditBoxのIDはIDC_EDIT1です。
5.ビルド--実行を行う
実行結果も図にしておきました。まだEditBoxに何も書かれていないことに気付きます。ここに命令を書く方法を次に述べます。
<--(編集内容)<--(実行結果)

2.EditBoxに文字を表示する方法
今度は文字を表示させる方法について述べます。方法はいろいろありますが、ここでは簡単な2通りの方法を説明します。1つは、「汎用性が少なく、ただ文字を出力する」タイプのもの。もう1つは、EditBoxに対応したある変数(メンバ変数)を定めて、その変数に対して文字を割り当て、EditBoxを通して表示させる方法。前者がダイレクトなのに対して、後者はワンテンポ置いていると言ったところです。後者は変数の方によって、文字を表示させたり、数字を表示させたりできる点で、多少汎用性があるかな?と思うわけです。

とはいえ、どのタイミングで表示させるかも重要です。この場合、プログラムが開始し、ダイアログが表示される前に、EditBoxに文字を割り当てなくてはなりません。(あくまでこの場合ですけどね)
言わば、EditBoxの初期化として文字を出力させるのですから、初期化をする関数内で表示作業を行えば◎です。この初期関数は、OnInitDialogと言う関数です。長い説明はよしとして、さっさとコードを説明することにします。

1.SetDlgItemText関数を使う方法
DlgTestDlg.cpp内部(OnInitDialog関数)
BOOL  CDlgTestDlg::OnInitDialog( )
{
CDialog::OnInitDialog( );

・・・

// このダイアログ用のアイコンを設定します。フレームワークはアプリケーションのメイン
// ウィンドウがダイアログでない時は自動的に設定しません。


SetIcon(m_hIcon, TRUE); // 大きいアイコンを設定
SetIcon(m_hIcon, FALSE); // 小さいアイコンを設定

// TODO: 特別な初期化を行う時はこの場所に追加してください。
SetDlgItemText(IDC_EDIT1,"VisualC++");//これを挿入

return  TRUE; // TRUE を返すとコントロールに設定したフォーカスは失われません。
}
ここで、SetDlgItemText関数の解説を簡単にしておきます。
SetDlgItemText関数
この関数は、指定されたダイアログ ボックス内のコントロールのキャプションまたはテキストを設定するものです。コントロールはID指定するので、キャプションやテキストを変更したいIDとその文字列を引数として送ればOKです。簡単でしょ!さっきは、EditBoxのテキストを設定したのです。でも定義に書いてある通り、キャプションも変更できるので、先ほどの変更点の直後に、
// TODO: 特別な初期化を行う時はこの場所に追加してください。
SetDlgItemText(IDC_EDIT1,"VisualC++");
SetDlgItemText(IDOK,"Control");//IDOKはOKボタンのID
と書くと、ボタンのキャプションもしっかり変更されていることが分かります。

ボタンがOKからControlに!


2.メンバ変数に文字を割り当てる方法
この方法は、「EditBoxにある型の変数(メンバ変数)を指定し、その変数に値を代入してあげる」と言う方法です。これも実践してみます。
1.ClassWizardを実行する。
2.以下のように選択する
プロジェクト:DlgTest
クラス名:CDlgTest
オブジェクトID:IDC_EDIT1
3.メンバ変数のタブをクリック
4.IDC_EDIT1を選択し変数の追加を押す
「メンバ変数の追加」ダイアログが開いたら成功です。
5.以下のように設定してあげればOK
メンバ変数:m_edit
カテゴリ:値
変数のタイプ:CString
「m_editはCStirng型の値をもつ変数ですよ」と宣言したことになるのです。
6.OKボタンを押す。
あとはプログラム中で、m_editに文字を代入すればいいので、全体のコードはこんな感じになるでしょう。
DlgTestDlg.cpp内部(OnInitDialog関数)
BOOL  CDlgTestDlg::OnInitDialog( )
{
CDialog::OnInitDialog( );

・・・

// このダイアログ用のアイコンを設定します。フレームワークはアプリケーションのメイン
// ウィンドウがダイアログでない時は自動的に設定しません。


SetIcon(m_hIcon, TRUE); // 大きいアイコンを設定
SetIcon(m_hIcon, FALSE); // 小さいアイコンを設定

// TODO: 特別な初期化を行う時はこの場所に追加してください。
m_edit="Hello!!";//以下2行を挿入
UpdateData(false);

return  TRUE; // TRUE を返すとコントロールに設定したフォーカスは失われません。
}
2行目のUpdateData(false);は、メンバ変数の値をダイアログに反映する関数です。この関数の引数をtrueにすれば、ダイアログの値をメンバ変数に書き込むことができます。このことは前回もやりましたよね。実行したら、やはり以下のような期待した結果になりました。

Editコントロールへの各種アクセス
さっきの2つは、「ダイレクトに文字を書き込む方法」と「メンバ変数に代入する方法」でした。でもMFCにはもう1つのアクセス方法があります。(今回はEditに対してアクセスしたい時を前提としてお話ししていきます)それは、Editコントロールの「型」である、CEditクラスのポインタ(居場所)を定義して、そのポインタにEditのIDを結び付ける手法です。なんかとてつもなく難しそうな気がしてきますが、別にどうってことではないですよ。とりあえず実践あるのみです。(さきほどと同じくOnInitDialog関数内でのお話になります。)
実際その宣言はこれだけで終わります。

CEdit* pedt = (CEdit*)GetDlgItem(IDC_EDIT1);//IDC_EDIT1はポインタpedtで指定できるようになった

これは定石です。GetDlgItem関数は、ダイアログから引数のIDのコントロールを引き出す関数です。今、IDC_EDIT1はCEdit型なので上のような指定を行いました。

この方法を使用しておけば、あとはCEdit型のメンバ関数をフルに活用できるのです。何故か?それはメンバ関数を使う時に、先ほどのポインタpedtを使用して、

pedt->メンバ関数

と書いてあげるだけで、IDC_EDIT1の操作が可能になるからです。今回はCEdit型のメンバ関数の一部とその使い方を紹介します。


LimitText(int n);
テキストに入力できる文字数を制限できる。制限文字数を引数とする。
--使用例--
半角10文字以降の入力は禁止
CEdit* pedt = (CEdit*)GetDlgItem(IDC_EDIT1);
pedt->LimitText(10);//10文字以上入力できなくした

SetSel(int n,int m,FALSE);
n文字目からm文字目までを選択する。(ただし始めの文字を0文字目をカウントする) 最後まではmを-1にすればよい。ただし、選択されたと言っても、ダイアログには何も表示されないのでご了承を。

ReplaceSel(CString  str, FALSE);
SetSel関数で文字列が選択されているならば、選択されている文字列とstrを置換する。
--使用例--
2文字目から最後まで選択し、ReplaceSel関数を使って置換
CEdit* pedt = (CEdit*)GetDlgItem(IDC_EDIT1);
m_edit="Hello!!";//Helloと出力しておく
UpdateData(false);//Dialogの更新

pedt->SetSel(2,-1,FALSE);//2文字目前から最後まで選択
pedt->ReplaceSel("aven",FALSE);//Helloの"llo"の部分をavenに変更する
出力がHeaven(天国)になったらOKです。

Clear( );
SetSel関数で文字列が選択されているならば、その文字列を消去する。
--使用例--
最初から最後まで選択し、Clear関数を使って削除
CEdit* pedt = (CEdit*)GetDlgItem(IDC_EDIT1);
m_edit="Hello!!";//Helloと出力しておく
UpdateData(false);//Dialogの更新

pedt->SetSel(0,-1,FALSE);//最初から最後まで選択
pedt->Clear( );//削除
何も表示されなくなったらOKです

SetReadOnly(TRUE);
Editコントロールを読み取り専用にする。引数をFALSEにすると「読み取り専用解除」になる。
--使用例--
Editコントロールを読み取り専用にする
CEdit* pedt = (CEdit*)GetDlgItem(IDC_EDIT1);
pedt->SetReadOnly(TRUE);//読み取り専用
(読み取り専用はこんな感じ)

今回はEditコントロールについて学びました。メンバ関数はまだ腐るほどあるので、VisualC++のCD-ROMについているチュートリアルを熟読されれば、もっとたくさんのメンバ関数を入手できます。次回はButtonです。Buttonを使ってアクションを起す一連の流れや、ButtonをBitmapにする方法など、情報いっぱいでお送りしたいと思います。

Back to Index