MFCプログラマーの「MFC」ってなんですか?


Visual C++ によって実装された Microsoft のクラスライブラリ Microsoft Foundation Class です。

要点をまとめてみると、

  1. (過去).NET Framework 登場前は Windows アプリ開発の主役
  2. (現在) MFC の新規開発はもうないでしょう
  3. (未来)古いアプリを流用したり、保守したりということはときどきある
  4. .NET での開発が主流となって、 MFC を扱える人もどんどん減っている

MFC に長く触れていると、「C++ 開発者です!」と言い切れない歯がゆさがあったりします。(ラッパークラスばかり使うことになるので、標準C++へのキャッチアップが疎くなるような気がするからです)

ダイアログベースアプリのイニシャライズの例
BOOL CMFCApplicationDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        BOOL bNameValid;
        CString strAboutMenu;
        bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
        ASSERT(bNameValid);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }

    SetIcon(m_hIcon, TRUE);
    SetIcon(m_hIcon, FALSE);
    return TRUE;
}

CDialogCMenuCString など、Cxxxx クラスの prefix をもったものを扱いながら開発をすすめていきます。

MFC の良き

Document View アーキテクチャーを採用していて、メッセージパッシングでビューとドキュメントがやり取りするようになっています。
MFCの作法にしたがうかぎり、ビューとドキュメントが疎結合で見通しのよいコードベースになります。

MFC のツラみ

CObject から派生したクラスの学習サンクコストの高さ