ソフトウェア開発 Win32プログラミング

複数のファイルを一度に「開く」

戻る


複数のファイルを一度に「開く」方法を実現するコードは以下の通り。

#include <windows.h>
#include <shlobj.h>
#include <tchar.h>
#include <string.h>

// ディレクトリ
TCHAR g_szDir[MAX_PATH];
 
// フィルタ
static const TCHAR g_szFilter[] = TEXT("すべてのファイル (*.*)\0*.*\0\0");
 
// ファイルを読み込む
BOOL LoadFile(HWND hWnd, LPCTSTR pszFileName)
{
    // ここにファイルを読み込むコードを記述してください。
    MessageBox(hWnd, pszFileName, TEXT("開く"), MB_ICONINFORMATION);
    return TRUE;
}
 
// 複数のファイルを読み込む
BOOL LoadMultiFiles(HWND hWnd, LPCTSTR pszzMultiFiles)
{
    TCHAR szDir[MAX_PATH], szFile[MAX_PATH];
    LPTSTR pch;
 
    if (GetFileAttributes(pszzMultiFiles) & FILE_ATTRIBUTE_DIRECTORY)
    {
        // 最初の項目がディレクトリの場合
        lstrcpy(szDir, pszzMultiFiles);
        // 文字列の最後に '\\' がなければ '\\' を追加する。
        pch = CharPrev(szDir, szDir + lstrlen(szDir));
        if (*pch != TEXT('\\'))
            lstrcat(szDir, TEXT("\\"));
        pszzMultiFiles += lstrlen(pszzMultiFiles) + 1;
        while(*pszzMultiFiles != TEXT('\0'))
        {
            lstrcpy(szFile, szDir);
            lstrcat(szFile, pszzMultiFiles);
            LoadFile(hWnd, szFile);
            pszzMultiFiles += lstrlen(pszzMultiFiles) + 1;
        }
        return TRUE;
    }
    // 最初の項目が普通のファイルの場合
    return LoadFile(hWnd, pszzMultiFiles);
}
 
// 複数のファイルを「開く」ダイアログ
BOOL DoOpen(HWND hWnd)
{
    OPENFILENAME ofn;
    TCHAR szFileName[256 * MAX_PATH];
 
    szFileName[0] = 0;
    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize         = OPENFILENAME_SIZE_VERSION_400;
    ofn.hwndOwner           = hWnd;
    ofn.lpstrFilter         = g_szFilter;
    ofn.nFilterIndex        = 1;
    ofn.lpstrFile           = szFileName;
    ofn.nMaxFile            = 256 * MAX_PATH;
    ofn.lpstrInitialDir     = g_szDir;
    ofn.Flags = OFN_EXPLORER | OFN_ENABLESIZING | OFN_FILEMUSTEXIST |
                OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_ALLOWMULTISELECT;
    if (GetOpenFileName(&ofn))
    {
        // 開いた場所を覚えておく
        LPTSTR p;
        lstrcpy(g_szDir, ofn.lpstrFile);
        if (!(GetFileAttributes(g_szDir) & FILE_ATTRIBUTE_DIRECTORY))
        {
            p = _tcsrchr(g_szDir, _T('\\'));
            *p = 0;
        }
        return LoadMultiFiles(hWnd, ofn.lpstrFile);
    }
    return FALSE;
}
 
INT WINAPI WinMain(
    HINSTANCE   hInstance,
    HINSTANCE   hPrevInstance,
    LPSTR       pszCmdLine,
    INT         nCmdShow)
{
    LPITEMIDLIST pidl;
 
    // デスクトップ
    SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOP, &pidl);
    SHGetPathFromIDList(pidl, g_szDir); // パスを取得する
    CoTaskMemFree(pidl);    // 解放

    DoOpen(NULL);
 
    return 0;
}

これで「開く」ダイアログが表示されたら、Ctrlキーやドラッグで複数のファイルを選択して開くことができる。

ソース: open3.zip


戻る

©片山博文MZ
katayama.hirofumi.mz@gmail.com

inserted by FC2 system