antenn-a
company profile

MFC航海日記 六日日(ディレクトリ選択ダイアログ)

第3日に挙げた2つの問題の一つである「ディレクトリ選択ダイアログの生成」について、いろいろな書籍やヘルプなどをあさった結果、APIを利用してできるらしいので挑戦してみたいと思う。自分の手で書いてももちろんできるのだが、どうせやるなら簡単なほうがよいし、コモンダイアログがあるのならばそれを使ったほうが100倍楽なので手書きでの作成は次回に回し(本当にやるのか?)今回はAPIを利用して作ってみようと思う。
まず、使用するAPIの関数名だが「SHBrowseForFolder」なる関数を用いることで出来るようだ。この関数には引数を一つ渡さなければならない。その引数は「BROWSEINFO」なる構造体を参照型で渡すのだが、この構造体を使うに当たり一つのヘッダをインクルードしなければならない。ヘッダ名は「shlobj.h」と言うもので、これをインクルードすれば問題ないようだ・・・・・が!しかし!問題発生!使いたい構造体は BROWSEINFO 構造体なのだが、この構造体以外の構造体でエラーが出てしまう。ヘッダをインクルードしただけなのにエラーが出る。なんでだ?わからない・・・・ひとまず「関係ないや!」の一言でそのエラーの出た構造体をコメントアウトしてコンパイルした・・・・・・・・・できた!以後、このコメントアウトした構造体を使う事になったらどうしよう・・・と一瞬思ったが、「使わなければいいんジャン!」と超楽観的に考えてそのままファイルを保存した。いいのかなぁ?以下にその部分のソースを掲載する。

prev

#include <shlobj.h>
void CSelDirectDlg::OnRButtonDown(UINT nFlags, CPoint point) 
{
    // TODO: 
    この位置にメッセージ ハンドラ用のコードを追加するか
    またはデフォルトの処理を呼び出してください

    TCHAR Buffer[1024];
    BROWSEINFO bi;

    bi.hwndOwner = m_hWnd;
    bi.pidlRoot = NULL;
    bi.pszDisplayName = Buffer;
    bi.lpszTitle = _T("フォルダを選択してください");
    bi.ulFlags = BIF_RETURNONLYFSDIRS;
    bi.lpfn = NULL;
    bi.lParam = 0;

    LPITEMIDLIST pList = ::SHBrowseForFolder(&bi);
    if (pList) {
        if (::SHGetPathFromIDList(pList, Buffer)) {
            CString strFileDir  = Buffer;  
            // 選択したフォルダ名が入る 
        }
    }

    CDialog::OnRButtonDown(nFlags, point);
}

prev

これで、ディレクトリ選択ダイアログも出す事が出来るようになった。う〜ん、成せば成るもんだ・・・・このサンプルソースコードはここからダウンロードできる。


antenn-a

prev next


antenn-a