あかすくぱるふぇ

同人サークル「あかすくぱるふぇ」のブログです。

MFC

今回は、下図に示すようなタブコントロールの最小構成です。
画面
ソースコードは以下の通り。
Dlg_h
Dlg_cpp
App_h
App_cpp

やっていることは主に以下の2つです。

1. メインダイアログ(CMainDlgクラス)にタブコントロールをつけ、各タブの子ウィンドウとしてCTabDlg1とCTabDlg2クラスのインスタンスを生成。

2. 選択タブが変化した場合のイベントハンドラ(OnTcnSelchangeTab1)をオーバーライドし、選択タブに応じて表示を切り替える。

以下のページに書いてることですが、ググってもすぐにはヒットしないようなので、備忘録として残しておきます。
http://www.geocities.co.jp/Hollywood/2358/mfc_2.html

MFCでは、ユーザー定義のクラスをnewする必要があります。
しかし、MFC内部ではユーザーが定義したクラスの名前は分かりようがないので、newするための関数をユーザーが用意する必要があります。
ただし、newの処理をユーザーが直書きするのはめんどくさい。
そこで用意されたのが、DECLARE_DYNAMICとIMPLEMENT_DYNAMICマクロです(と上記ページでは予想しています)。

DECLARE_DYNAMICは、new処理を行う関数の宣言。
IMPLEMENT_DYNAMICは、その関数の定義。

今回はダイアログの最小構成。

無題

このソースコードを書くのとは別に、以下の作業が必要です。
➀リソースファイル > 追加 > リソース > Dialog > 新規作成
➁リソースビューで、ダイアログにボタン貼り付け

以上です。
「ここからは複雑になるんだろうなぁ」と思っていたら、とっても簡単でした。
Visual Studioが自動生成するMFCプロジェクトは色々と余計なものがくっついているようですね。

前回の最小構成にボタンを付けてみました。
リソースビューからしか付けたことなかったけど、意外と簡単。

header

source

やったことは以下の通り。
➀ボタン(CButton型変数)をウィンドウクラスのメンバ変数に追加。
➁ウィンドウクラスのコンストラクタでボタンを生成。
③ボタンのイベントハンドラをウィンドウクラスのメンバ関数に追加。
④メッセージマップにボタンのイベントハンドラを追加。

MFCって、すごくごちゃごちゃしてるイメージがありましたが、最小構成だけ見ると、すごくすっきりしているように見えますね。

今までブラックボックスとして使っていたMFCを解析してみることにしました。
とりあえず、「最小構成はどうなるんだろ」ってとこを解析してみました。
以下の画像が最小構成コード。「1日でわかるMFC」さんを参考にさせていただきました。
http://hp.vector.co.jp/authors/VA011804/mfc_a0.htm

無題

Debugで追っていくと分かりますが、以下のような処理をしています。
➀MFC内で定義されている_tWinMain()関数が実行される。
➁その中で、アプリケーションクラスのInitInstance()関数が実行される。
③その中で、ウィンドウクラスのインスタンスが生成される。
④ウィンドウクラスのコンストラクタでCreate()関数が実行され、ウィンドウの登録と生成が成される。
  ←その過程で、PreCreateWindow()関数が実行されている。
⑤ShowWindow()関数でウィンドウを可視化する。

ここまでだと、ウィンドウやアプリケーションがクラス化されただけで、いまいちMFCのメリットが分かりませんね。

↑このページのトップヘ