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

「開く」・「名前を付けて保存」ダイアログ

戻る


「開く」ダイアログと「名前を付けて保存」ダイアログを表示する方法は、以下の通り。

//#define NO_REG  // レジストリを使用しない

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

// ファイル名(パスも含む)
TCHAR g_szFileName[MAX_PATH] = TEXT("無題");
// ディレクトリ
TCHAR g_szDir[MAX_PATH];
 
// フィルタ
static const TCHAR g_szFilter[] = 
    TEXT("テキストファイル (*.txt)\0*.txt\0")
    TEXT("すべてのファイル (*.*)\0*.*\0\0");
 
#ifndef NO_REG
static const TCHAR g_szDirValue[] = TEXT("Dir");
static const TCHAR g_szSoftware[] = TEXT("Software");
static const TCHAR g_szCompanyNameInEnglish[] = TEXT("Katayama Hirofumi MZ");
static const TCHAR g_szAppNameInEnglish[] = TEXT("open1");
#endif
 
#ifndef NO_REG
BOOL LoadRegSetting(VOID)
{
    LONG result;
    HKEY hkeySoftware, hkeyCompany, hkeyApp;
    TCHAR szData[MAX_PATH];
    DWORD cb;
    BOOL f;
 
    f = FALSE;
    result = RegOpenKeyEx(HKEY_CURRENT_USER, g_szSoftware, 0, KEY_READ,
                          &hkeySoftware);
    if (result == ERROR_SUCCESS)
    {
        result = RegOpenKeyEx(hkeySoftware, g_szCompanyNameInEnglish, 0,
                              KEY_READ, &hkeyCompany);
        if (result == ERROR_SUCCESS)
        {
            result = RegOpenKeyEx(hkeyCompany, g_szAppNameInEnglish, 0,
                                  KEY_READ, &hkeyApp);
            if (result == ERROR_SUCCESS)
            {
                // ここにレジストリから設定を読み込むコードを記述してください。
                f = TRUE;
                cb = MAX_PATH * sizeof(TCHAR);
                result = RegQueryValueEx(hkeyApp, g_szDirValue, NULL, NULL,
                                         (LPBYTE)szData, &cb);
                if (result == ERROR_SUCCESS)
                {
                    lstrcpy(g_szDir, szData);
                }
                RegCloseKey(hkeyApp);
            }
            RegCloseKey(hkeySoftware);
        }
        RegCloseKey(hkeySoftware);
    }
    return f;
}
#endif  // ndef NO_REG
 
#ifndef NO_REG
BOOL SaveRegSetting(VOID)
{
    LONG result;
    HKEY hkeySoftware, hkeyCompany, hkeyApp;
    DWORD cb, dwDisposition;
    BOOL f;
 
    f = FALSE;
    result = RegOpenKeyEx(HKEY_CURRENT_USER, g_szSoftware, 0, KEY_WRITE,
                          &hkeySoftware);
    if (result == ERROR_SUCCESS)
    {
        result = RegCreateKeyEx(hkeySoftware, g_szCompanyNameInEnglish, 0,
                                NULL, 0, KEY_WRITE, NULL, &hkeyCompany,
                                &dwDisposition);
        if (result == ERROR_SUCCESS)
        {
            result = RegCreateKeyEx(hkeyCompany, g_szAppNameInEnglish, 0,
                                    NULL, 0, KEY_WRITE, NULL, &hkeyApp,
                                    &dwDisposition);
            if (result == ERROR_SUCCESS)
            {
                // ここにレジストリに設定を書き込むコードを記述してください。
                f = TRUE;
                cb = (lstrlen(g_szDir) + 1) * sizeof(TCHAR);
                RegSetValueEx(hkeyApp, g_szDirValue, NULL, REG_SZ,
                              (LPBYTE)g_szDir, cb);
                RegCloseKey(hkeyApp);
            }
            RegCloseKey(hkeySoftware);
        }
        RegCloseKey(hkeySoftware);
    }
    return f;
}
#endif  // ndef NO_REG

// ファイルを読み込む
BOOL LoadFile(HWND hWnd, LPCTSTR pszFileName)
{
    // ここにファイルを読み込むコードを記述してください。
    MessageBox(hWnd, pszFileName, TEXT("開く"), MB_ICONINFORMATION);
    return TRUE;
}
 
// ファイルを保存する
BOOL SaveFile(HWND hWnd, LPCTSTR pszFileName, INT nFileType)
{
    // ここにファイルを保存するコードを記述してください。
    MessageBox(hWnd, pszFileName, TEXT("保存"), MB_ICONINFORMATION);
    return TRUE;
}
 
// 「開く」ダイアログ
BOOL DoOpen(HWND hWnd)
{
    OPENFILENAME ofn;
    TCHAR szFileName[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            = MAX_PATH;
    ofn.lpstrInitialDir     = g_szDir;
    ofn.Flags = OFN_EXPLORER | OFN_ENABLESIZING | OFN_FILEMUSTEXIST |
                OFN_PATHMUSTEXIST | OFN_HIDEREADONLY;
    ofn.lpstrDefExt         = TEXT("txt");
    if (GetOpenFileName(&ofn))
    {
        // 開いた場所を覚えておく
        LPTSTR p;
        lstrcpy(g_szFileName, ofn.lpstrFile);
        lstrcpy(g_szDir, ofn.lpstrFile);
        p = _tcsrchr(g_szDir, _T('\\'));
        *p = 0;
        return LoadFile(hWnd, g_szFileName);
    }
    return FALSE;
}
 
// 「名前を付けて保存」ダイアログ
BOOL DoSaveAs(HWND hWnd)
{
    OPENFILENAME ofn;
    TCHAR szFileName[MAX_PATH];
 
    lstrcpy(szFileName, g_szFileName);
    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            = MAX_PATH;
    ofn.lpstrInitialDir     = g_szDir;
    ofn.Flags = OFN_EXPLORER | OFN_ENABLESIZING | OFN_OVERWRITEPROMPT |
                OFN_PATHMUSTEXIST;
    ofn.lpstrDefExt         = TEXT("txt");
    if (GetSaveFileName(&ofn))
    {
        LPTSTR p;
        // 保存した場所を覚えておく
        lstrcpy(g_szFileName, ofn.lpstrFile);
        lstrcpy(g_szDir, ofn.lpstrFile);
        p = _tcsrchr(g_szDir, _T('\\'));
        *p = 0;
        return SaveFile(hWnd, g_szFileName, ofn.nFilterIndex);
    }
    return FALSE;
}
 
INT WINAPI WinMain(
    HINSTANCE   hInstance,
    HINSTANCE   hPrevInstance,
    LPSTR       pszCmdLine,
    INT         nCmdShow)
{
    LPITEMIDLIST pidl;
 
    // マイ ドキュメント
    if (SHGetSpecialFolderLocation(NULL, CSIDL_PERSONAL, &pidl) != NOERROR)
    {
        // マイ ドキュメントがなければ、デスクトップにする
        SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOP, &pidl);
    }
    SHGetPathFromIDList(pidl, g_szDir); // パスを取得する
    CoTaskMemFree(pidl);    // 解放

#ifndef NO_REG
    LoadRegSetting();
#endif

    DoOpen(NULL);
    DoSaveAs(NULL);
 
#ifndef NO_REG
    SaveRegSetting();
#endif

    return 0;
}

ポイントは、作業の効率のために開いた場所を覚えておくことだ。さもなくば、ユーザーはイライラするかもしれないからである。

ソース: open1.zip


戻る

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

inserted by FC2 system