当前位置:C++技术网 > 资讯 > 学习心得之五,MFC编程中两种文件对话框的创建

学习心得之五,MFC编程中两种文件对话框的创建

更新时间:2015-09-08 21:04:35浏览次数:1+次

    

    对于“打开”“保存”对话框,我们不陌生,经常用到。今天我们就讲讲如何来创建这两种文件对话框。
    对于那两种文件对话框,C,C++两种语言都有详细的介绍,但我还是觉得C语言相对过于复杂,C++有点复杂,若想学习了解这两种文件对话框,大家可看看相关书籍。我们还是用MFC来实现吧。
    首先我们用VC6.0创建一个单文档项目,命名为File,接下来我们在VC自己给我们创建的菜单中添加项目,首先:
   
    我们按如图在菜单中添加一个“文件”,并在其下拉列表中,增加两个子菜单”写入文件“”读取文件“,ID号分别为IDM_WRITE,IDM_READ,接着我们为他们创建建立类向导,右键点击,选择类向导,就会进入:
   
    我们按照如图步骤操作,VC就会为我们生成两个函数:
    

void CFileView::OnFileWrite() 
{
 // TODO: Add your command handler code here

}

void CFileView::OnFileRead() 
{
 // TODO: Add your command handler code here

}


     第一个函数就是用来响应”保存“对话框,第二个就是响应”打开“对话框,接下来我们添加代码,首先在第一个函数中:


    

void CFileView::OnFileWrite() 
{
 // TODO: Add your command handler code here

 CFileDialog fileDlg(FALSE);//保存对话框
        fileDlg.DoModal();

}


     对于MFC,windows程序员对它进行了类封装,使得众多的函数都封装在类里边,我们可以很方便的调用一个类就能使用一大堆的函数,我们创建文件对话框,就调用CFileDialog类,类名直译过来是不是就是文件对话框?windows程序员,在设计MFC时,就考虑了类名的记忆,因此我们能轻易的从类名理解它的作用。我们看看CFileDialog函数:

    

explicit CFileDialog(
   BOOL bOpenFileDialog,
   LPCTSTR lpszDefExt = NULL,
   LPCTSTR lpszFileName = NULL,
   DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
   LPCTSTR lpszFilter = NULL,
   CWnd* pParentWnd = NULL,
   DWORD dwSize = 0,
   BOOL bVistaStyle = TRUE
);

     我们可以看到,除了第一个参数外,其他的参数都有缺省值,因此我们只需理解第一个参数。它是一个BOOL类型的变量,


就像我们说的,我们用CFiledialog类来创建两种文件对话框,而第一个参数时BOOL值,只有两个值,对应两种文件对话框,因此,当它为FALSE时就是表示保存保存对话框,TRUE就是打开对话框。接下来就是创建对话框了,然后我们就是创建对话框了

    

    我们运行程序后,点击”写入文件“就会跳出这个对话框,标题为”另存为“,接下来我们修改标题,以及文件过滤器。
    

fileDlg.m_ofn.lpstrTitle="我的文件对话框";
fileDlg.m_ofn.lpstrFilter="Text File(*.txt)\0*.txt\0ALL Files(*.*)\0*.*\0\0";  //   过滤器
fileDlg.m_ofn.lpstrDefExt="txt";//默认拓展名

if(IDOK==fileDlg.DoModal())
{
 CFile file(fileDlg.GetFileName(),CFile::modeCreate | CFile::modeWrite);
 file.Write("httpcsdsdv",strlen("httpcsdsdv"));
 file.Close();
}


   fileDlg对象中有个成员函数m_ofn,m_ofn是类型OPENFILENAME的结构,此结构的数据表示cfiledialog的当前状态,我们调用它来修改文件对话框,上述代码中,第一行我们修改文件的名字为“我的文件对话框”,第二行我们创建一个过滤器,删选txt文件(文本文件)和All files(所有文件),然后就是添加默认的后缀拓展名,结构m_ofn的具体成员,有兴趣的查看MSDN,可以深入了解。接下来就是创建文件了,我们利用封装的类CFile,这个函数有五个重载函数:
  
CFile( );
CFile(
   CAtlTransactionManager* pTM
);
CFile(
   HANDLE hFile 
);
CFile(
   LPCTSTR lpszFileName,
   UINT nOpenFlags 
);
CFile(
   LPCTSTR lpszFileName,
   UINT nOpenFlags,
   CAtlTransactionManager* pTM
);
  
    MFC选择第四个重载函数,第一个就是文件的名字,第二个按位组合(或)的文件中指定的文件的访问的选项卡。 为可能的选项参见"备注"节。具体如下:
    
CFile::modeRead

只读取权限。

CFile::modeWrite

请求只写访问权。

CFile::modeReadWrite

读取的请求和写入。

    我们创建的是“保存对话框”,选择写入(cfile::write),因此调用函数write,解析如下:
    
virtual void Write(
   const void* lpBuf,
   UINT nCount 
);


    第一个就是我们写入的字符串,第二个呢就是我们写入字符串的长度,写入文件成功后我们需要关闭文件,调用函数close()。
   
我们可以在文件名框写入文件,保存类型就是我们的过滤器,上述程序我们写入了“httpcsdsdv”,那么接下来就是创建打开文件夹来打开文件了。我们拷贝代码写入到read函数中:
    
void CFile1View::OnRead() 
{
 // TODO: Add your command handler code here
 CFileDialog filedlg(TRUE);
 filedlg.m_ofn.lpstrTitle="我的打开文件";
 filedlg.m_ofn.lpstrFilter="Text File(*.txt)\0*.txt\0All Files(*.*)\0*.*\0\0";
 
 if(IDOK==filedlg.DoModal())
 {
  CFile file(filedlg.GetFileName(),CFile::modeRead);
  char pBuf[100];
  DWORD dwfilelen;
  dwfilelen=file.GetLength();
 
  pBuf[dwfilelen]=0;
  file.Read(pBuf,dwfilelen);
  MessageBox(pBuf);
  file.Close();
 }
}

     我们拷贝代码后加了一些东西,首先,我们将FALSE,改为了TRUE,便是创建打开对话框,然后我们讲解下if语句中的代码,我们往文件中写入的是字符串,我们来读取它,利用read()函数。


    

virtual UINT Read(
   void* lpBuf,
   UINT nCount 
);

     第一个参数就是我们定义的数组来读取我们写入的文件,但是电脑读取字符串直到结束标记\0,否则就会在读取时出现乱码,具体的,我们可以参考相关书籍,过几天我会写篇专门介绍的文章,到时候欢迎观看学习。因此我们在字符串后边加上一个\0,来结束读取。我们调用file的成员函数getlength得到我们写入文件的长度,返回一个32位长度的类型DWORD,DWORD类型就是双字节,我们知道一个字节8位,WORD就是两个字节16位,DWORD就是32位了。


最后结果

我们以MessageBox(),弹出我们写入的文件。过两天,我在详细写篇文章讲解读取字符串的一些细节。并实现读取电脑上的文件,而不是我们自己写入的文件。