nprogram’s blog

気ままに、プログラミングのトピックについて書いていきます

MFCで、ファイル選択ダイアログを学習する

MFCで、ファイル選択ダイアログを学習します。 開発環境は、Visual Studio 2015 Communityです。

■単一選択ダイアログと複数選択ダイアログを作成します。

(1) ダイアログベースでプロジェクトを作成し、次のようなダイアログを作成します。 f:id:nprogram:20170612195351p:plain

(2) エディットボックスには、m_xvEditFileの変数を追加します。

f:id:nprogram:20170612194332p:plain

(3) リストボックスには、m_xcListFileの変数を追加します。 f:id:nprogram:20170612200648p:plain

(4) ボタンには、それぞれ、ボタンクリックイベントハンドラを追加します。

単一ファイル参照用のイベントハンドラメソッドには、以下のように記載してください。

void CFileSelectDialogsDlg::OnBnClickedButton1()
{
    CString         filter("JPEG Files (*.jpg;*.jpeg)|*.jpg; *.jpeg||");
    CFileDialog     selDlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, filter);

    if (selDlg.DoModal() == IDOK)
    {
        m_xcListFile= selDlg.GetPathName();
        UpdateData(FALSE);
    }

    return;
}

複数ファイル参照用のイベントハンドラメソッドには、以下のように記載してください。

void CFileSelectDialogsDlg::OnBnClickedButton2()
{
    CString         filter("JPEG Files (*.jpg;*.jpeg)|*.jpg; *.jpeg||");
    CString         filePath, strBuf;
    POSITION        pos = NULL;
    CFileDialog     selDlg(TRUE, NULL, NULL,
        OFN_HIDEREADONLY | OFN_ALLOWMULTISELECT, filter);
    int             err = 0, lbErr = 0;

    // ファイル名リスト用メモリ確保
    if (!err)
    {
        try
        {
            selDlg.GetOFN().lpstrFile = strBuf.GetBuffer(MAX_PATH * 100);
            selDlg.GetOFN().nMaxFile = MAX_PATH * 100;
        }
        catch (...) { err = 1; }
    }
    if (!err) if (selDlg.DoModal() != IDOK) err = 1;
    if (!err) if ((pos = selDlg.GetStartPosition()) == NULL) err = 1;
    if (!err)
    {
        while (pos)
        {
            filePath = selDlg.GetNextPathName(pos);
            if (!err)
            {
                lbErr = m_xcListFile.InsertString(-1, filePath);
                if (lbErr == LB_ERR || lbErr == LB_ERRSPACE) err = 1;
            }
            if (err) break;
        }
        UpdateData(FALSE);
    }
    strBuf.ReleaseBuffer();

    return;
}

以下のように、表示されれば、成功です。

<単一ファイル参照用のダイアログボックス表示>

f:id:nprogram:20170612201325p:plain

<複数ファイル参照用のダイアログボックス表示>

f:id:nprogram:20170612201416p:plain

<ファイル参照結果> f:id:nprogram:20170612201538p:plain

■本ページの記載は、以下のホームページを参考にしました。 ありがとうございます。

http://www.g-ishihara.com/mfc_cd_01.htm

■CFileDialog クラスのドキュメントは、以下でCFileDialogで、検索してください。

https://msdn.microsoft.com/ja-jp/library/