通用对话框相关

VC中使用CFileDialog进行文件操作,一般来讲你不需要派生新的类,因为基类已经提供了常用的功能。而且在创建并等待对话框结束后你可以通过成员函数得到用户在对话框中的选择。

CFileDialog文件选择对话框的使用:首先构造一个对象并提供相应的参数,构造函数原型如下:
CFileDialog::CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL );参数意义如下:

bOpenFileDialog 为TRUE则显示打开对话框,为FALSE则显示保存对话文件对话框。
lpszDefExt 指定默认的文件扩展名,如果用户在文件名栏不指定,则该扩展名自动加到文件名中(用于保存的时候吧)
lpszFileName 指定默认的文件名,开始出现在文件名栏中的文件名
dwFlags 指明一些特定风格。
lpszFilter 是最重要的一个参数,它指明可供选择的文件类型和相应的扩展名。参数格式如:
"Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||";文件类型说明和扩展名间用 | 分隔,同种类型文件的扩展名间可以用 ; 分割,每种文件类型间用 | 分隔,末尾用 || 指明。
pParentWnd 为父窗口指针。
创建文件对话框可以使用DoModal(),在返回后可以利用下面的函数得到用户选择:
CString CFileDialog::GetPathName( ) 得到完整的文件名,包括目录名和扩展名如:c:/test/test1.txt
CString CFileDialog::GetFileName( ) 得到完整的文件名,包括扩展名如:test1.txt
CString CFileDialog::GetExtName( ) 得到完整的文件扩展名,如:txt
CString CFileDialog::GetFileTitle ( ) 得到完整的文件名,不包括目录名和扩展名如:test1
POSITION CFileDialog::GetStartPosition( ) 对于选择了多个文件的情况得到第一个文件位置。
CString CFileDialog::GetNextPathName( POSITION& pos ) 对于选择了多个文件的情况得到下一个文件位置,并同时返回当前文件名。但必须已经调用过POSITION CFileDialog::GetStartPosition( )来得到最初的POSITION变量。

 

打开文件对话框的调用:

Void CsimpleDlg::OnFileOpen()
{

CFileDialog *lpszOpenFile;    //定义一个CfileDialog对象
lpszOpenFile = new
CFileDialog(TRUE,””,””,OFN_FILEMUSTEXIST |OFN_HIDEREADONLY , “文件类型(*.yourfiletype)|*.yourfiletype||”);//生成一个对话框
if(lpzsOpenFile->DoModal() == ID_OK)//假如点击对话框确定按钮
{
    CString szGetName;
    szGetName = lpszOpenFile->GetPathName();  //得到打开文件的路径
    SetWindowText(szGetName);            //在窗口标题上显示路径
}
delete lpszOpenfile;  //释放分配的对话框
}

 

对一些函数的解释:

CFileDialog(
   BOOL bOpenFileDialog,   //值为TRUE时表示”打开”对话框,值为FALSE时表”保存”对话框
   LPCTSTR lpszDefExt = NULL, //默认的文件名扩张
   LPCTSTR lpszFileName = NULL,
               //打开对话框时默认出现在文本框里的文件名,为NULL时不显示默认文名
   DWORD dwFlags = OFN_HIDEREADONLY | OFN_FILEMUSTEXIST
            //对文件属性等定义的组合,
   LPCTSTR lpszFilter = NULL,//可以应用的文件类型,如*.MP3
   CWnd* pParentWnd = NULL,
                // A pointer to the file dialog-box object's parent or owner window.
DWORD dwSize = 0
/* The size of the OPENFILENAME structure. This value is dependent on the operating system version, so MFC can determine the appropriate kind of dialog to create (for example, new Windows 2000 dialogs as opposed to NT4 dialogs). */

 );

 

 

//#################################################################################
在MFC中使用CFile类和CFileDialog可以很简单的载入和保存文件……

CFileDialog文件选择对话框的使用:

首先构造一个对象并提供相应的参数,构造函数原型如下:


 CFileDialog::CFileDialog(

BOOL bOpenFileDialog, //为TRUE则显示打开对话框,为FALSE则显示保存对话文件对话框

LPCTSTR lpszDefExt = NULL, //默认的文件扩展名

LPCTSTR lpszFileName = NULL, //默认的文件名

DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, //设定风格

LPCTSTR lpszFilter = NULL, //列出可供选择的文件类型和相应的扩展名

CWnd* pParentWnd = NULL //父窗口句柄指针

);
 

 

    LPCTSTR lpszFilter 参数格式如:/"Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc;*.xls|All Files (*.*)|*.*||/";文件类型说明和扩展名间用 | 分隔,同种类型文件的扩展名间 可以用 ; 分割,每种文件类型间用 | 分隔,末尾用 || 指明。

    创建文件对话框可以使用DoModal(),在返回后可以利用下面的函数得到用户选择: 

    CString CFileDialog::GetPathName( ) 得到完整的文件名,包括目录名和扩展名如:c://test//test1.txt 

    CString CFileDialog::GetFileName( ) 得到完整的文件名,包括扩展名如:

test1.txt 

    CString CFileDialog::GetExtName( ) 得到完整的文件扩展名,如:txt 

    CString CFileDialog::GetFileTitle ( ) 得到完整的文件名,不包括目录名和扩展名如:test1 

    POSITION CFileDialog::GetStartPosition( ) 对于选择了多个文件的情况得到第一个文件位置。 

    CString CFileDialog::GetNextPathName( POSITION& pos ) 对于选择了多个文件的情况得到下一个文件位置,并同时返回当前文件名。但必须已经调用过

POSITION CFileDialog::GetStartPosition( )来得到最初的POSITION变量。

 

    下面是实现代码:

 //打开文件
//创建文件名缓存(fileBuffer)和文件读取缓存(rBuffer)

//此处如果不把缓存置0,在后面的设定中就会出错,如果是动态申请的,请用memset或者for循环把数组清零

char fileBuffer[5010] = {0}, rBuffer[5010] = {0};

int rBSize;

//定义一个CFile类,用来处理文件

CFile in;

 //定义一个CFileDialog类,用来显示标准的打开文件对话框

CFileDialog inDlg(FALSE, NULL, NULL, NULL, _T(/"自定义文件类型 (*.xxx)|*.xxx|所有文件 (*.*)|*.*||/"), NULL);

inDlg.m_ofn.lpstrTitle = _T(/"打开自定义文件/");

//设定一个文件名缓存,因为CFileDialog内置的文件名缓存长度只有200,但是很多时候,文件的路径远大于这个数,为了保险起见,所以要自己设定一个文件名缓存

inDlg.m_ofn.lpstrFile = fileBuffer;

//设定缓存长度

inDlg.m_ofn.nMaxFile = 5000;

//显示对话框,并处理按了确定按钮的事件
 
if(inDlg.DoModal() == IDOK) {

 //以只读方式打开文件

 if(in.Open(inDlg.GetPathName(), CFile::modeRead)) {

  //得到文件长度,从而确定读取缓存的大小

  rBSize = in.GetLength();

  //避免数组越界,当然在这里也可以动态申请缓存空间

  if(rBSize > 5000) rBSize = 5000;

  //读入数据

  n.Read(rBuffer, rBSize);

  //关闭文件

  in.Close();

  MessageBox(/"打开文件成功/", /"搞定了/", MB_ICONEXCLAMATION | MB_OK);

 } else {

  MessageBox(/"打开文件失败/", /"失败了/", MB_ICONSTOP | MB_OK);

 }

}

//保存文件

//创建文件名缓存(fileBuffer)和文件写入缓存(wBuffer)

//此处如果不把缓存置0,在后面的设定中就会出错,如果是动态申请的,请用memset或者for循环把数组清零

char fileBuffer[5010] = {0}, wBuffer[5010] = {0};

int wBSize;

CFile out;

CFileDialog outDlg(FALSE, NULL, NULL, NULL, _T(/"自定义文件类型 (*.xxx)|*.xxx|所有文件 (*.*)|*.*||/"), NULL);

//设定保存对话框标题

outDlg.m_ofn.lpstrTitle = _T(/"保存自定义文件/");

//使用自定义的文件名缓存

outDlg.m_ofn.lpstrFile = fileBuffer;

//设定保存文件的默认后缀,如果自己有输入后缀,则时候输入的后缀

outDlg.m_ofn.lpstrDefExt = /"xxx/";

//设定缓存大小

outDlg.m_ofn.nMaxFile = 5000;

//显示对话框

if(outDlg.DoModal() == IDOK) {

 //得到文件名,并用创建和写入方式打开

 if(out.Open(outDlg.GetPathName(), CFile::modeWrite | CFile::modeCreate)) {

  //在这里把你要写入文件的内容写入缓存,如果写入的内容过长,可以分次写入

  //得到写入当前缓存中内容的长度

  wBSize = strlen(wBuffer);

  //写入文件

  out.Write(wBuffer, wBSize);

  //关闭文件

  out.Close();

  MessageBox(/"保存文件成功/", /"搞定了/", MB_ICONEXCLAMATION | MB_OK);

 } else {  MessageBox(/"保存文件失败/", /"失败了/", MB_ICONSTOP | MB_OK);

 }

}

你可能感兴趣的:(通用对话框相关)