Windowsコード集 上のページ

#0015 簡易ファイルダイアログクラス

何も考えずにファイルダイアログを使いたい人向けのファイルダイアログクラスです。
マニアックに事を進めたい人は、それなりに改造してみるのも良いでしょうね。

//----------------------------------------------------------------------------
// filedialog.h
//----------------------------------------------------------------------------

#ifndef _INC_FILEDIALOG_H_
#define _INC_FILEDIALOG_H_

class CFileDialog{
protected:
    OPENFILENAME m_of;
    CHAR m_filename[MAX_PATH],m_filetitle[MAX_PATH];
public:
    CFileDialog(){;}
    CFileDialog(HWND hwnd,LPSTR filter,LPSTR filename,LPSTR initdir = NULL,LPSTR title = NULL){
        Init(hwnd,filter,filename,initdir,title);
    }
    void Init(HWND hwnd,LPSTR filter,LPSTR filename,LPSTR initdir = NULL,LPSTR title = NULL){
        lstrcpy(m_filename,filename);
        ::GetFileTitle(m_filename,m_filetitle,sizeof(m_filetitle));

        ZeroMemory(&m_of,sizeof(m_of));
        m_of.lStructSize = sizeof(m_of);
        m_of.hwndOwner = hwnd;
        m_of.hInstance = GetModuleHandle(NULL);
        m_of.lpstrFilter = filter;
        m_of.nFilterIndex = 1;
        m_of.lpstrFile = m_filename;
        m_of.nMaxFile = sizeof(m_filename);
        m_of.lpstrFileTitle = m_filetitle;
        m_of.nMaxFileTitle = sizeof(m_filetitle);
        m_of.lpstrInitialDir = initdir;
        m_of.lpstrTitle = title;
    }
    BOOL GetSave(){
        m_of.Flags = OFN_CREATEPROMPT|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_PATHMUSTEXIST;
        return GetSaveFileName(&m_of);
    }
    BOOL GetOpen(){
        m_of.Flags = OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_PATHMUSTEXIST;
        return GetOpenFileName(&m_of);
    }
    LPSTR GetFileName(){return m_filename;}
    LPSTR GetFileTitle(){return m_filetitle;}
};



//
// 読み込み用のファイル名を取得する方法です
// 以下は、適当な画像を例に取っています。
//
CFileDialog dlg(hwnd,"BITMAPファイル(*.bmp)\0*.bmp;\0JPEGファイル(*.jpg,*,jpeg)\0*jpg;*.jpeg;\0\0",
                "",NULL,"画像ファイルをオープンする");
if(dlg.GetOpen()){
    // OKボタンが押された場合
    HFILE fp = HFILE_ERROR;
    if((fp = _lopen(dlg.GetFileName(),OF_READ)) != HFILE_ERROR){
            :
        // 読込みルーチン
            :
        _lclose(fp);
    }
}


//
// 書き出し用のファイル名を取得する方法です
//
CFileDialog dlg(hwnd,"テキストファイル(*.txt)\0*.txt;\0\0","新規文章.txt",NULL,"文章保存先");
if(dlg.GetSave()){
    // OKボタンが押された場合
    HFILE fp = HFILE_ERROR;
    if((fp = _lcreat(dlg.GetFileName(),0)) != HFILE_ERROR){
            :
        // 書き出しルーチン
            :
        _lclose(fp);
    }
}
#endif
恐らく、フィルター文字列の書き方がポイントになってくると思います。
以下を参考にしてみてください。

■フォーマット
"拡張子説明"+"\0"+"拡張子(*.abc;*.bcd)"+"\0"+"拡張子説明"+"\0"+"拡張子(*.abc;*.bcd)"+"\0"+"\0"

各色が1項目のデータです。"\0"でそれぞれの項目を区切り、拡張子は"*.txt"や"*.bmp;*.jpg"等といった風に指定します。

サンプルコードで使っているフィルター文字列を色別に分けると、以下のようになります。

"BITMAPファイル(*.bmp)\0*.bmp;\0JPEGファイル(*.jpg,*,jpeg)\0*jpg;*.jpeg;\0\0"


上のページ