MFC
もっともシンプルなウィンドウを持つ MFC アプリの雛形を作る


HomeProgramming TipsMFC Tips[MFC-011]

MFC は便利ですが、ウィザードで吐き出されるソースは、色々なお節介が付いていて面倒です。
今回は MFC の良さを生かすことが出来る最小限度のプログラムを作ってみます。

 ダウンロード : シンプルな MFC ウィンドウプログラムサンプル(2005/04/26) 

■ 新規作成

まず、新しいプロジェクトを作ります。このとき注意することは以下の点です。

これでアプリケーションとダイアログの二つのクラスが出来ます。


■ 不要なモノを削除する

ここから、まず、不要なモノを外していきます。

1.ソリューションエクスプローラ

以下の該当するファイルを削除します。
これらはソリューションエクスプローラから外した上に、実際のファイルも削除します。

    xxxDlg.cpp
    xxxDlg.h



2.リソースビュー

以下の該当するリソースを削除します。

    IDD_XXX_DIALOG
    IDR_MAINFRAME ※ファイルも消す



3.xxx.cpp (アプリケーションクラスの cpp ファイル)

ダイアログクラスをインクルードしているので、それを削除します。

    #include "xxxDlg.h"



次に CxxxDlg dlg; 関連の記述がありますので、それを削除します。
InitInstance の返り値は TRUE としてください。
レジストリを使わないのであれば、SetRegistryKey() の記述も消します。
すると InitInstance は、おそらく、以下のようなシンプルな関数になるはずです。

BOOL CxxxApp::InitInstance()
{
    InitCommonControls();
    CWinApp::InitInstance();
    return TRUE;
}

※ とりあえずここでコンパイルしてエラーが出ないことを確認します。


■ 自分の Window を作成する

1.新規作成

追加、クラスの追加、MFC クラスを選択して [開く] とします。
クラス名を指定します。ここでは、とりあえず、CMyWnd とします。
基本クラスが CWnd であることを確認して [完了] を押します。

2.組み込み
xxx.cpp にインクルードを記述します。

    #include "MyWnd.h"


InitInstance に CmyWnd の動的生成を記述します。


BOOL CxxxApp::InitInstance()
{
    InitCommonControls();
    CWinApp::InitInstance();
    m_pMainWnd = new CMyWnd();
    return TRUE;
}


3.CMyWnd に処理を追加

まず、コンストラクタで Window を生成します。
Create() または CreateEx() を使います。
ここでは、クライアント領域しか存在しないウィンドウを作ろうと思いますので、CreateEx() を使います。

IMPLEMENT_DYNAMIC(CMyWnd, CWnd)
CMyWnd::CMyWnd()
{
    LPCTSTR lpszClassName = AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW);
    DWORD dwExS = WS_EX_TOOLWINDOW;
    CreateEx(dwExS, lpszClassName, NULL, WS_POPUP, 0,0,100,100, NULL, NULL, NULL);
    ShowWindow(SW_SHOWDEFAULT);
    UpdateWindow();
    SetCursor(LoadCursor(NULL, IDC_ARROW));
}



MFC では、m_pMainWnd に動的生成のポインタを格納することになるのですが、
ウィンドウが閉じられると、ExitInstance 時点で m_pMainWnd は NULL になっています。
そのため、ウィンドウが閉じるタイミングでなんとかしてオブジェクトを破棄しなければいけません。
そのための仕組みが PostNcDestroy です。
ここに自分を抹消するためのコードを記載すればウィンドウが閉じるタイミングでオブジェクトを破棄できます。

void CMyWnd::PostNcDestroy()
{
    CWnd::PostNcDestroy();
    delete this;
}


これで必要最小限のウィンドウを持つ MFC アプリができました。
OnPaint で描画を受け持ち OnIdle で処理を行えば、MFC ベースの DirectX ゲームなどが作れるわけです。
また、ウィンドウは不要だが、ウィンドウプロシージャが必要というようなプログラムにも最適です。



 Copyright 2005 VALGUS. All Rights Reserved.