ファイル選択ダイアログの表示

今回は、以下の画像のようなファイルを選択させるダイアログを操作する命令を紹介 したいと思います。

ファイル選択ダイアログは次の命令で表示できます。
BOOL GetOpenFileName(LPOPENFILENAME)
BOOL GetSaveFileName(LPOPENFILENAME)

2つありますが、ファイルを開くために使うものと、ファイルに保存するために使われるものに 分かれているだけで、それほど変わりありません。

OPENFILENAMEの中身は以下のようになっています。

typedef struct tagOFN { // ofn 
    DWORD         lStructSize; 
    HWND          hwndOwner; 
    HINSTANCE     hInstance; 
    LPCTSTR       lpstrFilter; 
    LPTSTR        lpstrCustomFilter; 
    DWORD         nMaxCustFilter; 
    DWORD         nFilterIndex; 
    LPTSTR        lpstrFile; 
    DWORD         nMaxFile; 
    LPTSTR        lpstrFileTitle; 
    DWORD         nMaxFileTitle; 
    LPCTSTR       lpstrInitialDir; 
    LPCTSTR       lpstrTitle; 
    DWORD         Flags; 
    WORD          nFileOffset; 
    WORD          nFileExtension; 
    LPCTSTR       lpstrDefExt; 
    DWORD         lCustData; 
    LPOFNHOOKPROC lpfnHook; 
    LPCTSTR       lpTemplateName; 
} OPENFILENAME; 
大体の変数は0やNULLで動くので、重要な部分をかいつまんで説明します。

lpstrFilter
ファイルの種類を限定して選択させるための変数です。NULL文字で区切って以下のように使います
texファイル(*.tex)\0*.tex\0その他(*.*)\0*.*\0\0

lpstrFile
選択されたファイルのフルパス(ファイル名を含む)を返します。サイズが小さすぎるとエラーになります

nMaxFile
lpstrFileのサイズ

lpstrFileTitle
選択されたファイルのファイル名を返します

nMaxFileTitle
lpstrFileTitleに格納できる文字列のサイズ

lpstrTitle
ダイアログボックスのタイトル文字列を指定します
Flags
OFN_OVERWRITEPROMPT:指定したファイルが存在していたら>確認のダイアログボックスを表示します(保存のとき)

OFN_FILEMUSTEXIST:指定したファイルが存在していない場合は警告を表示します(開くとき)

などがあります

ファイルダイアログを簡単に呼び出す関数を作ってみたので、よかったら使ってください。

#include<windows.h>
#include<stdlib.h>

BOOL FileDialog(HWND,char,char*,char*,char*,char*);

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpszCmdLine,int nCmdShow)

{
    char path[MAX_PATH],filename[MAX_PATH];
    char mes[1024];
    if(FileDialog(NULL,'s',path,filename,"開け","txt(*.txt)\0*.txt\0all(*.*)\0*.*\0\0"))
    {
        wsprintf(mes,"選択されたファイルのフルパス%s\r\n選択されたファイル名%s",path,filename);
        MessageBox(NULL,mes,"結果",MB_OK);
    }

	return 1;
}


BOOL FileDialog(HWND hwnd,char mode,char* path,char* name,char* title,char* filter)
{
    //文字列にヌル文字を代入しておく
    memset(path,'\0',sizeof path);
    memset(name,'\0',sizeof name);

    
    OPENFILENAME ofn;
    memset(&ofn,0,sizeof(OPENFILENAME));    
    ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.hwndOwner = hwnd;
    ofn.lpstrFile =path;     //選択されたファイル名を受け取る(フルパス)
    ofn.nMaxFile =MAX_PATH;
    ofn.lpstrFileTitle =name;//選択されたファイル名
    ofn.nMaxFileTitle=MAX_PATH;
    
    ofn.lpstrFilter=filter;//フィルタ
    ofn.lpstrTitle=title;//ダイアログボックスのタイトル
    
    if(mode=='g')
    {
        ofn.Flags = OFN_FILEMUSTEXIST;
        if(GetOpenFileName(&ofn)==FALSE) 
            return FALSE;
    }
    else if(mode=='s')
    {
        ofn.Flags=OFN_OVERWRITEPROMPT;
        if(GetSaveFileName(&ofn)==FALSE) 
            return FALSE;
    }
    else 
        return FALSE;
 
    return TRUE;
}
ファイル選択ダイアログを表示するにあたって、私が失敗した事例をいくつかあげますと

lpstrFileとlpstrFileTitleのサイズを十分に取らなかった
lpstrFilter文字列を設定するのにstrcpyを使ったら1回目のNULL文字の所で切れてしまった(memcpyを使えば良い)

などがありました。気をつけてくださいね。

戻る