Buttonを作ってアクションを起そう!
プログラムの王道といえば、「Hello!」を表示するプログラムですが、これはOnDraw関数といってDC(デバイスコンテキスト)を本格的に学ぶところまで来てから学習した方がいいと思うので、今回は一番手っ取り早い、DialogでButtonの設置とアクションを行います。と、難しそうですが案外簡単なので気楽に行きましょう。

1.プロジェクトを作る
 VisualC++でソフトを作るにはこの作業を避けることはできません。とはいえ、MFCアプリケーションウィザードというものが、新規プロジェクトを簡単に作ってくれるので楽勝だと思いますよ。

新規作成でプロジェクトを作成します。WIN32 MFC APPWIZARDを選択してください。プロジェクト名はCountにしておきます。(本当はなんでも結構ですけど…)。
後はステップどおり選択していくだけです。
STEP1:作成するアプリケーションの種類-->ダイアログベースにする
STEP2:アプリケーションへ組み込む機能-->変更なし
STEP3:ソースファイルのコメント-->した方がよい :MFCライブラリとのリンク-->共有DLLにする
STEP4:終了
としておきましょう。あとはOKを押していけばよいです。念のため、ビルド-実行をしますと、ダイアログが開かれるはずです。今回はこれにButtonを設置していきます。

2.ダイアログリソースを編集する
メモ帳の製作のところでもメニューをいじりましたが、そこでも出てきたリソースをまた変更します。このリソースはプログラムの「顔」なので奇麗に作りたいものですよね。

 リソースタブをクリックし、ResourceViewを表示します。ここでCountのDialogのなかのIDD_Count_DIALOGを選択します。これが、先ほど実行したときに表示されたダイアログそのものなのです。ここで、OKボタン以外のボタンやメッセージを削除します。削除は、消したいものをクリック(ハイライト)してDELキーを押せばOKです。

ここでダイアログ上に適当な大きさでいいので「エディットボックス」を作成します。このエディットボックスというのは、その名の通り、そのフィールドの中に文字列を書きこむことができるものですが、今回はそこに書く込む必要はなく、読みこむだけの機能にするのでプロパティのスタイルに読み取り専用というチェックボックスをチェックしておきます。IDはIDC_Edit1(ディフォルト)でいいです。すると図のようなものが出来上がりました。

 今度はボタンを作成します。適当な大きさの「ボタン」をボックス内に作成してください。ボタンを右クリックしてプロパティを開きます。(各種コントロールは右クリックでいろんな操作ができるんです。)ここでIDを決めます。ボタンをプログラム中では1つの「もの」として考えられます。だから人間と同じようにID番号を持っているのです。ここでは、IDを見ただけで何か分かるようにしておきたいので、IDはディフォルトのIDC_BUTTON1にしましょう。

次にキャプションを決めます。これは実際に表示される文字で、OKボタンだったらOKです。ここでがキャプションを「Message」とでも書いてください(お好きなように。プログラムには影響しませんから)。ここで実行してもまだMessageのボタンは押しても何にも起こりません。それはまだボタンをプログラムが連携していなからです。

これでダイアログリソースの編集が終了しました。
ここまではインターフェース作りです。これから実装に移ります。といっても全然大変じゃないから大丈夫です。

3.オブジェクト間のメッセージをつくる

 なんか堅苦しいタイトルですが、これがMFCの一番重要なところなんでしっかり勉強しましょう!逆に言えば、これをマスターすればVCの達人も遠くないかもしれません。MFCはオブジェクトに対してメッセージを送り、それに従った動作を別のオブジェクトがアクションを起すというものが基本です。
今回はボタンをクリックした時に、ボタンは「クリックされたよ〜、Editボックスさん、あのコマンド実行してよ」と言い、Editボックスは「分かった、実行! どうでぃ」という感じになります。ではそれをそうやってやるかは下に…。

1.「表示」の中にあるCLASSWIZARDを実行します。
 まず、このEditボックスの名前を決めます。「おいさっきIDC_EDIT1って名前を決めたでしょ!」と言われる方もいるはずです。先ほどのIDはオブジェクトを区別するためにつけられた名前で、銀行でいう口座番号みたいなものです。

でも私たちが銀行で使うのは口座番号じゃないですよね。もちろん暗証番号です?口座番号はプログラムが一括管理するもので、今回つける名前(暗証番号みたいなもの)はプログラム中で私たちプログラマーが使う名前です。これをVCやC++ではメンバ変数と呼びます。以下にその変数の設定法を書きます。

2.メンバ変数の設定方法(Editボックス)
ClassWizardは開いていますか?ここでメンバ変数のタブをクリックします。プロジェクトは今作っているCount、クラス名はCCountDlgにします。そうするとコントロールIDに先ほど見なれたIDが並んでますね。これは先ほど作成したリソースのダイアログの中にあるオブジェクトたちです。

さて問題のエディットボックスIDC_EDIT1をクリックし、「変数の追加」ボタンを押してください。すると「メンバ変数の追加」ウィンドウが出てくるはずです。  メンバ変数をm_editとし、カテゴリをコントロールにします。m_editは値を持たないので。変数のタイプはCEditにしてください。OKを押せば完了です!ね、簡単でしょ。

この作業で私たちはエディットを自由に操ることができるようになりました。例えば、
     m_edit . SetWindowText("IDはIDC_EDIT1だよん");
と書くとします。これは「m_editに対して"IDはIDC_EDIT1だよん"を表示させなさい」という命令です。プログラマーの操作が一段と楽になるわけです。
ところで、今までやってきたことは、リソースをいじってプログラムの顔を作って、それぞれのコントロールに名前IDを付けた後、プログラマー用にEditボックスに変数名を与えたことです。ここまでは「したごしらえ」!この次でMFCで一番重要なメッセージを結び付けてボタンを意味のあるものにします。

3.メッセージをバインド(結びつけ)します。
メッセージを渡すといわれてもね・・・。以前僕もこれで頭を痛めました。でも要領さえ分かればこっちのものです。たいていのバイブルにはこのことは書かれていないので、必見(笑)!書いてあったとしても、「BN_CLICKEDをバインドしてコードを記述」としか書いてない本ばっかりですから、ここでばっちり覚えていってください。
メッセージのやり取りを簡単に説明します。
ボタンクリックからアクションまで
①「ボタンがクリックされた」ことを知る
②「ボタンがクリックされたときに実行する関数」を起動します。
③適切な処理をしてからまたボタンが押されるのを待つ
実際の設定は以下のように行います。

クラスウィザードは起動していますよね。メッセージマップのタブをクリックします。プロジェクトはCount、クラス名はCCountDlgでオブジェクトはIDC_BUTTON1にしてください。ここでメッセージの欄のBN_CLICKEDをハイライトして、「関数の追加」ボタンを押します。メンバ関数名は「ON BUTTON1」(ディフォルト)です。すると下のメンバ関数という欄に「ON BUTTON1」という関数が加わります。
このBN_CLICKEDは、「ボタンが押された」ときに関数ON BUTTON1を実行するメッセージなのです。  この関数の追加ボタンをクリックしたあとで、「コード編集」のボタンをクリックしてみてください。そうするとなにやらソースの画面が出てきますよね。これで終了です。あとはここにソースを書込んであげればいいのです。

4. ソースコードを書きこみます。
とりあえず関数OnButton1の中に、
     AfxMessageBox("成功");
と書込んでみてください。これで実行します。さあ、ボタンを押してみて、何やらウィンドウが出てきたら成功です。つまり、「ボタンが押されたというメッセージをうけてOnButton1関数を起動した」ことが確かめられました。これを実行すると以下のようになります。

あとはこの関数でEditBoxに書込む命令を書けばいいのですね。
以下のコードを書きます。
void CCountDlg::OnButton1(){
    static int i = 0;
    CString str,c;
    switch(i){
       case 0:c="w";break;
       case 1:c="we";break;
       case 2:c="wel";break;
       case 3:c="welc";break;
       case 4:c="welco";break;
       case 5:c="welcom";break;
       case 6:c="welcome";break;
       case 7:str.Format("少しずつ勉強しようね");
           m_edit.SetWindowText(str);
           i=0;
           return;
    }     str.Format(c);
    m_edit.SetWindowText(str);
    ++i;
}
プログラムはクリックした回数を覚えていて、クリックした回数によって表示する文字列を変えているだけです。ここはもう普通のプログラミングの世界なので説明は省略しますね。でも大事な関数が2つあります。
SetWindowText( )関数
***指定されたWindowのタイトルバーを引数の文字列などに書きかえたり、指定されたWindowが何かを制御している時、そのオブジェクトのコントロールを変更する***

 m_editというメンバ変数を作ったときを思い出してみてください。たしかカテゴリをコントロールにしましたよね。それがここで反映されているのです。実際はm_edit.SetWindowText(str) は、「m_editコントロールにstrを書きなさい」という命令を送っています。

プログラムでは1回目はstrは"w"なのでEditBoxには"w"が表示され、2回目のクリックでstrが"we"になるのでEditBoxも"we"が表示されていたのです。

Format( )関数
***各引数 が、リソース識別子文字列で指定された対応する書式仕様に従って変換され出力される***
今回はchar*型の変数cを定義し、それに文字列を随時代入してそれをCString型にFormat(初期化)しています。簡単に言うと、MFCの文字列操作はすべてCStringクラスで行っているので、例えばChar型とかChar*型はなるべく使いたくありません。そこでFormatでぜーんぶCStringクラスに変更できてしまいます。

例えば、数字をWindowで表示したい時はこうします。
CString str;
int i = 9;
str.Format("%d",i);
AfxMessageBox(str);
とやれば、"9"と表示されます。
これでソースが完成しました。後はビルドと実行です。実行できるでしょうか?できなかったらソースをよく見なおしてください。実行できたらボタンをクリックしてみてください。何回か押せば表示が変わることが分かるでしょう。今回はEDITボックスとボタンを学習しましたがどうでしたか?そんなに難しくはないと思います。ダイアログベースの基本は上の3つから成り立っているのでよく理解してくださいね!

Back to Index