« 父の釣果 | トップページ | プログラム試行錯誤(続) »

2006-02-20

プログラム試行錯誤

忘れないうちにメモ。

フォルダ選択ダイアログボックスを表示するときのやり方。

VOID MySusie(HWND hWnd)
{
    BROWSEINFO bi;
    TCHAR szPath[MAX_FILE + 1];
    LPITEMIDLIST pidl;

    // BROWSEINFO構造体設定
    ZeroMemory(&bi, sizeof(BROWSEINFO));
    bi.hwndOwner = hWnd;
    bi.lpfn = BrowseCallbackProc;
    bi.pszDisplayName = szPath;
    bi.lpszTitle = "Susie Plug-in 格納フォルダを選択して下さい";
    bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_DONTGOBELOWDOMAIN | BIF_STATUSTEXT |
                 BIF_RETURNFSANCESTORS | BIF_VALIDATE | BIF_USENEWUI | BIF_NONEWFOLDERBUTTON;

    // フォルダ選択ダイアログ表示
    if((pidl = SHBrowseForFolder(&bi)) == NULL)
        return;

    // ITEMIDLISTからパス取得
    if(SHGetPathFromIDList(pidl, szPath) == TRUE) {
        lstrcpy(szSpiPath, szPath);
    } else
        Edit_AddMessage(hEdit, TEXT("error:SHGetPathFromIDList"), TRUE, TRUE);

    CoTaskMemFree(pidl);

    return;
}

INT CALLBACK BrowseCallbackProc(HWND hWnd, UINT msg, LPARAM lp1, LPARAM lp2)
{
    TCHAR szDir[MAX_FILE + 1];
    LPITEMIDLIST lpid;

    switch(msg) {
        case BFFM_INITIALIZED:
            if(lstrlen(szSpiPath) > 0)
                SendMessage(hWnd, BFFM_SETSELECTION, (WPARAM)TRUE, (LPARAM)szSpiPath);
            else if(GetCurrentDirectory(sizeof(szDir), szDir))
                SendMessage(hWnd, BFFM_SETSELECTION, (WPARAM)TRUE, (LPARAM)szDir);
            break;

        case BFFM_SELCHANGED:
            lpid = (LPITEMIDLIST)lp1;
            SHGetPathFromIDList(lpid, szDir);
            SendMessage(hWnd, BFFM_SETSTATUSTEXT, (WPARAM)0, (LPARAM)szDir);
            break;

        case BFFM_VALIDATEFAILED:
            MessageBox(hWnd, TEXT("不正なフォルダです"), NULL, MB_OK);
            return 1;
    }

    return 0;
}

例によって自作関数や外部変数を多用しているので、その辺は脳内補完のこと。

注意!このソースコードには足りない部分がかなりある。

  • BIF_NEWDIALOGSTYLEBIF_USENEWUI を指定する際は、COMの初期化を行わなければならないようだ(VBの場合はアプリケーション側で行ってくれるらしいが)が、ここではまだ組み込んでいない。
  • このままだと、BIF_STATUSTEXT を指定しているにも関わらず、ステータステキストが表示されない(BIF_NEWDIALOGSTYLEBIF_USENEWUI を指定しないときは問題なく表示される)。
  • BCCでは BIF_NONEWFOLDERBUTTON が定義されていないので、別途定義する必要がある(定義値は0x0200)。

追記:
続きは「プログラム試行錯誤(続)」。

|

« 父の釣果 | トップページ | プログラム試行錯誤(続) »

コンピュータ・プログラム」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/1757/8746395

この記事へのトラックバック一覧です: プログラム試行錯誤:

« 父の釣果 | トップページ | プログラム試行錯誤(続) »