まずはダイアログベースのアプリで・・・2.クラスの編集


■ ダイアログクラスの編集
まずプロジェクトワークスペース上の[Class View]のページからdlgtestクラスを展開してみましょう。すると、既に三つのクラスが存在していますね。これらがダイアログベースのアプリのスケルトンです。通常MFCのプログラミングは、このスケルトンに肉ずけをしていくことにより行います。
では、ダイアログエディターで編集したダイアログのクラス(CDlgtestDlg)を編集しましょう。
このクラスを展開すると、右の図のように数個のメンバーファンクションと一つのメンバー変数が見れます。次にCDlgtestDlgを左ダブルクリックで選択してみましょう。ソースウィンドウ上にこの関数が表示されるはずです。
■ クラスウィザードを使ったコントロール変数の追加
まず、ClassWizardを開いてみましょう。[表示]メニューの下か、ソースウィンドウ上でマウスの右クリックでも開くことができます。
まず、前回作成したダイアログ上のスタティックテキストをCStringの変数に割り当ててみましょう。[メンバ変数]のページを開いてください。するとダイアログ上のコントロールが表示されます。その中のIDC_STATIC1をクリックして[変数の追加]ボタンを押してください。IDC_STATIC1をダブルクリックしても同じです。すると、[メンバ変数の追加]ダイアログが表示されるので名前を割り当てて下さい。ここではm_msgとしました。

[OK]ボタンで登録されます。
■ クラスウィザードを使ったメッセージ処理ルーチンの作成
ClassWizardを開いたまま、次は[メッセージ マップ]のページを開いてみてください。[オブジェクトID]のIDC_BUTTON1、[メッセージ]のBN_CLICKEDを選択して、[関数の追加]ボタンを押しましょう。[メンバ関数の追加]ダイアログが表示されます。ここで関数名を変更できますが、ここでは名前を変えずに[OK]で関数を登録されます。なお、各メッセージの意味はダイアログの下のほうの説明の部分に表示されます。

登録されると、BN_CLICEDが太字に変わりましたね。これが、このメッセージは登録されていることを示しています。
[OK]ボタンでClassWizardの処理を終了します。(ここで、[キャンセル]ボタンを押すと今までの全てのクラスウィザードの処理を無効にできます。)
■ メンバ関数の追加
いよいよプログラミングに入ります。ここでは、上記で作成したボタンの処理(OnButto1)を作成します。

今回の例は、ボタンが押されたらボタンが押された回数をスタティックテキストに表示する処理を追加してみましょう。

実際はOnButton1の中だけで十分なのですが、練習の為にサブルーチンを作成してそれをボタン処理から呼び出してみましょう。

クラスの中にメンバ関数を追加するには、冒頭でも説明したプロジェクトワークスペースを使うと便利です。
CDlgtestDlgを右クリックするとポップアップメニューが表示されるので、その中の[メンバ関数の追加]を選択しましょう。
すると[メンバ関数の追加]ダイアログが表示されます。
まず[関数の型]ですが、これは関数の戻り値のタイプを指定します。ここでは戻り値は要らないので"void"と入力します。
次に[関数の宣言]ですが、これは関数名とパラメータを指定します。通常のコーディングと同様に入力します。ここではパラメータ無しの"Counter()"としましょう。その他の設定はデフォルトのままで良いです。
[OK]を押すと関数が追加さ、その部分のソースが表示されましたね。
■ 通常のメンバ変数の追加
コーディングをする前に、メンバ変数を一つ追加して見ましょう。
これは、今回の例ではボタンを押した回数を記憶するため整数の変数です。
変数の追加も前項のメンバ関数の追加と同様に、ワークスペースを使うと便利です。やり方も、関数の追加と同様にマウスの右クリックでクラスを指定し、[メンバ変数の追加]を選択します。
[メンバ変数の追加]ダイアログが表示されるので、変数のタイプと名前を指定します。
ここでは、タイプは"int"変数名は"m_nCount"としましょう。メンバ変数はダイアログのコントロールのメンバ変数と同様に、通常先頭に"m_"をつけると他のローカル変数と区別がつき安全かつ便利です。後は、好みで名前を付けて下さい。
[OK]を押すと変数が追加されます。

変数は、単に宣言がされるだけで初期化は行われません。変数の初期化を行いましょう。
変数の初期化は、ダイアログの場合コンストラクタか、OnInitDialog内で行います。ここでは、コンストラクタで行いましょう。
コンストラクタとは、C++の仕様で、クラスの作成時に呼び出される関数で、クラスの初期化を行います。関数名はクラス名と同じになります。反対にデストラクタは、クラスの終了時に呼び出されるもので、作成したメモリの消去等、クラスの終了処理を行います。関数名はクラス名の先頭に~が付きます。
では、ワークスペースで~CDlgtestDlg(CWnd* pParent /*=NULL*/)"をダブルクリックしてコンストラクタを呼び出しましょう。
ここには、既に作成したコントロール変数の初期化等のコードが入っています。一番最後にm_nCountの初期化を追加しまょう。
ついでに、m_msgの初期値も変更してみましょう。
        CDlgtestDlg::CDlgtestDlg(CWnd* pParent /*=NULL*/)
                : CDialog(CDlgtestDlg::IDD, pParent)
        {
                //{{AFX_DATA_INIT(CDlgtestDlg)
                m_msg = _T("ボタンは押されていません");
                //}}AFX_DATA_INIT
                // メモ: LoadIcon は Win32 の DestroyIcon のサブシーケンスを要求しません。
                m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
                m_nCount = 0;
        }
■ ボタン処理の追加
先ほど作成した、Counter()を以下のように編集しましょう。
        void CDlgtestDlg::Counter()
        {
                m_nCount ++;
                m_msg.Format( "%d回ボタンが押されました", m_nCount);
        }
最後に、ボタン処理です。OnButton1()を同様に変更しましょう。
        void CDlgtestDlg::OnButton1() 
        {
                // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
                Counter();
                UpdateData( FALSE);
        }
UpdateDataに注意してください。これは、ヘルプを見れば分かりますが。ダイアログのコントロールの表示を更新する関数です。これがないとコントロール変数の内容は更新されても表示は更新されません。
これで、完成です!!実行してみましょう。

簡単な例でしたが、実際のプログラミングはこれらの積み重ね、繰り返しだと思います。いろいろと試してみてください。
■ サンプルプロジェクトファイルのダウンロード
サンプルは、1章と同じです。