0%

通用对话框

通用对话框

通用对话框其实还是比较常用的,这里主要分为获取文件目录和获取文件夹目录两种对话框形式,并且获取文件目录的对话框还分为打开文件和写入文件两种对话框形式。

获取文件目录

这个相对而言是比较简单的,主要的牵扯到GetOpenFileName()和GetSaveFileName()这两个函数,这两个函数需要一个同样的参数,这个参数也就是一个OPENFILENAME类型的指针,这个类型在MSDN中的定义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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;

这里面比较重要的也就是

  • lpstrFile
  • nMaxFile
  • lpstrFilter
  • nFilterIndex
    这四个字段比较重要,第一个保存我们文件目录的一个char类型指针变量,NMaxFile应该是一个最大长度的限制,这里我们用MAX_PATH这个就可以了。lpstrFilter这个是过滤器的一个字符串,\0代表一个结束,支持正则,\0\0代表过滤器终止。nFilterIndex过滤器首选第几个。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //示例代码:
    char szFileName[MAX_PATH] = "";
    OPENFILENAME file = {0};
    file.lStructSize = sizeof(file);

    //设置对话框的属性
    file.lpstrFile = szFileName;
    file.nMaxFile = MAX_PATH;
    file.lpstrFilter = "Text Files(*.txt)\0*.txt\0All Files\0*.*\0\0";//最后的兩個\0是代表結束
    file.nFilterIndex = 1; //這個應該是代表哪個過濾器顯示在第一個得把。
    if (GetOpenFileName(&file))//GetSaveFileName這個是用來保存文件的,參數一樣,返回值代表了我們點擊的是不是確定
    {
    MessageBox(NULL,szFileName,"打開的文件",MB_OK);
    }
    不要忘记导入Windows.h这个头文件,【GetSaveFileName类似】。

    获取文件夹目录

    这个就稍微有一点点麻烦,所以我们写一个类,支持我们以后进行编写:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    #ifndef __DIRDIALOG_H__
    #define __DIRDIALOG_H__
    #include <ShlObj.h>

    class CDirDialog
    {
    public:
    CDirDialog();
    BOOL DoBrowse(HWND hWndParent,LPCTSTR pszTitle = NULL);
    LPCTSTR GetDirPath(){return m_szPath;}
    protected:
    BROWSEINFOA m_bi;
    //用來接收用戶選擇目錄的緩衝區
    char m_szPath[MAX_PATH];
    char m_szDisplay[MAX_PATH];
    private:
    };
    CDirDialog::CDirDialog()
    {
    memset(&m_bi,0,sizeof(m_bi));//先清空一下這個變量
    m_bi.hwndOwner = NULL;//對話框父窗口
    m_bi.pidlRoot = NULL;//用來接收起始目錄的那個結構
    m_bi.pszDisplayName = m_szDisplay;//接受緩衝區的
    m_bi.lpszTitle = NULL;//對話框中定義的文字
    m_bi.ulFlags = BIF_RETURNONLYFSDIRS;//我們只接受文件系統中的目錄
    m_szPath[0] = '\0';
    }
    BOOL CDirDialog::DoBrowse(HWND hWndParent,LPCTSTR pszTitle)
    {
    if(pszTitle == NULL)
    {
    m_bi.lpszTitle = "選擇目標文件夾";
    }else
    {
    m_bi.lpszTitle = pszTitle;
    }
    m_bi.hwndOwner = hWndParent;
    LPITEMIDLIST pItem = SHBrowseForFolder(&m_bi);
    if (pItem !=0)
    {
    SHGetPathFromIDList(pItem,m_szPath);
    return TRUE;
    }
    return FALSE;
    }
    #endif //__DIRDIALOG_H__結束
    简单说明一下SHGetPathFromIDList这个函数,LPITEMIDLIST这个结构体比较复杂,但是我们通过这个函数我们就可以简单的获取到我们输入的内容。
    如果我们要用的话呢我们只需要
    1
    2
    3
    4
    5
    6
    #include "CDirDialog.h"
    CDirDialog dir;
    if(dir.DoBrowse(NULL))
    {
    MessageBox(NULL,dir.GetDirPath(),"打開的文件",MB_OK);
    }
    这样就可以打开一个文件目录了。