Win32 APIを使用して簡単に使えます。
今回もちゃんとリファレンスを読まなかったからこその落とし穴にはまったので
そのあたりを強調して行きます。
「GetOpenFileName」というAPIが用意されていますのでこれを使用します。
「OPENFILENAME」という構造体の内容を設定して渡すと結果が返ってきます。
OPENFILENAMEのメンバのlpstrFileに結果のパスを返すバッファのポインタを渡す
のですが、これがダイアログの初期化用の値もかねているので初期化の必要が
なければヌル文字を指定しないといけません。
これに気がつかないおバカは僕は何で使えねーんだとしばしもがいてました。
(でも個人の解説サイトさんでそんなこと書いてなかったんだー。と、言い訳。)
このあたりに気をつけながら構造体を設定して渡せば問題なく使用できます。
サンプルです。
int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,LPSTR lpsCmdLine, int nCmdShow)
{
{
HWND hWnd = NULL;
char path[MAX_PATH+1];
char title[129];
OPENFILENAME openfile;
//構造体を0で埋める
memset(&openfile, 0, sizeof(OPENFILENAME));
//結果を格納するバッファの先頭をヌル文字にする(かなり重要)
path[0] = '\0';
//構造体のサイズの指定
openfile.lStructSize = sizeof(OPENFILENAME);
//親ウインドウのハンドル(NULL可)
openfile.hwndOwner = hWnd;
//フィルタの指定
openfile.lpstrFilter = "プログラム(*.exe)\0*.exe\0全て(*.*)\0*.*\0\0";
//結果が格納されるバッファの指定
openfile.lpstrFile = path;
//バッファのサイズ
openfile.nMaxFile = MAX_PATH;
//各種設定フラグ
//今回は順に、「正しいパスのみ入力可」「正しいファイル名のみ入力可」「読み取り専用チェックを消す」
openfile.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
//標準の拡張子の指定
openfile.lpstrDefExt = "exe";
//選択されたファイル名が格納される
openfile.lpstrFileTitle = title;
//バッファのサイズを指定
openfile.nMaxFileTitle = 128;
//ダイアログのタイトル
openfile.lpstrTitle = "プログラムの選択";
//ダイアログを開く
if(GetOpenFileName(&openfile)){
return 0;
}
char path[MAX_PATH+1];
char title[129];
OPENFILENAME openfile;
//構造体を0で埋める
memset(&openfile, 0, sizeof(OPENFILENAME));
//結果を格納するバッファの先頭をヌル文字にする(かなり重要)
path[0] = '\0';
//構造体のサイズの指定
openfile.lStructSize = sizeof(OPENFILENAME);
//親ウインドウのハンドル(NULL可)
openfile.hwndOwner = hWnd;
//フィルタの指定
openfile.lpstrFilter = "プログラム(*.exe)\0*.exe\0全て(*.*)\0*.*\0\0";
//結果が格納されるバッファの指定
openfile.lpstrFile = path;
//バッファのサイズ
openfile.nMaxFile = MAX_PATH;
//各種設定フラグ
//今回は順に、「正しいパスのみ入力可」「正しいファイル名のみ入力可」「読み取り専用チェックを消す」
openfile.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
//標準の拡張子の指定
openfile.lpstrDefExt = "exe";
//選択されたファイル名が格納される
openfile.lpstrFileTitle = title;
//バッファのサイズを指定
openfile.nMaxFileTitle = 128;
//ダイアログのタイトル
openfile.lpstrTitle = "プログラムの選択";
//ダイアログを開く
if(GetOpenFileName(&openfile)){
MessageBox(hWnd, (LPCTSTR)path,(LPCTSTR)"フルパス",MB_OK);
MessageBox(hWnd, (LPCTSTR)title,(LPCTSTR)"ファイル名",MB_OK);
}else{MessageBox(hWnd, (LPCTSTR)title,(LPCTSTR)"ファイル名",MB_OK);
MessageBox(hWnd, (LPCTSTR)"キャンセルされました。",(LPCTSTR)"キャンセル",MB_OK);
}return 0;