今回は、以下の画像のようなファイルを選択させるダイアログを操作する命令を紹介 したいと思います。
ファイル選択ダイアログは次の命令で表示できます。
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で動くので、重要な部分をかいつまんで説明します。
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を使えば良い)
などがありました。気をつけてくださいね。