友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
富士康小说网 返回本书目录 加入书签 我的书架 我的书签 TXT全本下载 『收藏到我的浏览器』

VC语言6.0程序设计从入门到精通-第32部分

快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!



标文件后再删除原始文件。  



     技巧:CFile::Remove()函数不能删除目录,而 Windows API 提供了 RemoveDirectory() 函数,用于 



            删除一个空目录,对于目录中的文件需要自行删除。MFC  中提供 CFileFind 类用于枚举目 



            录 中 的 子 文 件 , 使 用 这 个 类 的 功 能 枚 举 出 目 录 中 的 所 有 文 件 并 删 除 , 再 使 用 



            RemoveDirectory()删除空目录即可完成删除目录的功能。  



     下面介绍删除目录的详细过程。首先需要枚举目录文件。枚举目录文件是 Windows 系统 

中一个重要的操作。枚举目录文件是通过 CFileFind 类实现的。CFileFind 是 MFC 中实现本地 

文件搜索的类,包含开始搜索,定位文件,获得的文件信息的成员函数。  

     CFileFind 类的构造函数没有参数 。而开始一个搜索,需要调用 CFileFind::FindFile()函数。 

该函数打开一个文件搜索,原型为:  



     virtual BOOL FindFile(  



           LPCTSTR pstrName = NULL;  



           DWORD dwUnused = 0    



     );  



     o  参数  pstrName :指定文件的搜索路径和搜索类型,即可以使用通配符“*”和“? ”。 

        如果给出 NULL 值,则 FindFile()进行“*。*”的搜索。  

     o  参数 dwUnused :为 CFileFind 的派生类保留,必须为 0 。  

     o  返回值:确定打开搜索是否成功,失败的话可以通过 GetLastError 函数获得失败代码。  

     打开搜索后,就可以使用CFileFind::FindNextFile()函数获得下一个文件。CFileFind::FindNextFile() 

函数原型为:  



     virtual BOOL FindNextFile( );  



     函数返回值用于确定是否还有文件没找到,如果为  FALSE                                       则说明这是最后一个找到的 

文件或者出错,可以用 GetLastError 函数获得出错信息。  



                                                                                                 ·201 ·  


…………………………………………………………Page 213……………………………………………………………

Visual C++ 6。0 程序设计从入门到精通  



     搜索到一个文件时可以用下列一些函数获得文件的信息:  

     o  GetCreationTime() :获得文件创建时间。  

     o  GetFileName() :获得文件名。  

     o  GetFilePath() :获得文件全路径。  

     o  GetFileTitle() :获得文件标题。  

     o  GetLastAccessTime() :获得文件最后一次访问的时间。  

     o  GetLastWriteTime() :获得文件最后一次被写入的时间。  

     o  GetLength() :获得文件字节大小。  

     o  GetRoot() :获得文件的根目录。    

     o  IsArchived() :确定文件是否是存档文件。  

     o  IsDirectory() :确定文件是否是目录。  

     o  IsDots() :确定文件是否是“。”或者“。。”,这种类型的文件表示目录。  

     o  IsHidden() :确定文件是否是隐藏文件。  

     o  IsNormal() :确定文件是否是普通文件。  

     o  IsReadOnly() :确定文件是否是只读文件。  

     o  IsSystem() :确定文件是否是系统文件。  

     o  IsTemporary() :确定文件是否是临时文件。  

     最后用 CFileFind::Close()函数关闭搜索。  

     介绍了  CFileFind  类的使用方法后,可以想到,删除目录可以用递归的方法将目录中的 

所有子目录删除,即在本级目录中如果找到子目录文件,则调用自身删除这个子目录。代码 

如下:  



     //CMyFile 是一个自定义功能的文件操作类  



     //DeleteTree 函数用于删除目录,并同时删除目录中的所有子目录和文件  



     //参数 strDir 用于确定要删除的目录名  



     void CMyFile::DeleteTree(CString strDir)  



     {  



         CFileFind finder;   //创建一个目录搜索类  



         CString delFile=strDir;  



         delFile+=〃*。*〃;   //设置搜索目录的通配符  



         //开始搜索,bWorking 用于表示是否搜索到新文件  



         BOOL bWorking = finder。FindFile(delFile);  



         //如果 bWorking 为 TRUE 则继续循环  



             while (bWorking)  



             {  



              //获取下一个文件  



                bWorking = finder。FindNextFile();  



              //获取找到的文件名  



               CString filename=finder。GetFilePath();  



              //如果文件是一个目录,而且不是一个“。”或者“。。”的目录  



              //那么删除这个子目录  



 ·202 ·  


…………………………………………………………Page 214……………………………………………………………

                                                                                          第 8 章    文件操作  



                if(finder。IsDirectory()&&(!finder。IsDots()))  



                {  



                      //递归调用自身删除子目录  



                      Delete(filename);  



                }  



                else if (!finder。IsDots())  //如果文件不是一个“。”或者“。。”的文件则删除该文件  



                {  



                      CFile::Remove(filename);    //删除文件  



                }  



             }  



           //文件查找完毕,所有文件都已经删除,目录清空  



           RemoveDirectory(strDir);    //删除空目录  



      }  



8。3    文件对话框  



      第 4 章已经介绍过文件对话框的基本使用方法。现在介绍一些关于 CFileDialog 的高级使 

用方法,包括多选文件对话框的使用方法和重载文件对话框的方法,使得程序能更灵活地控 

制文件对话框。  



8。3。1    多选文件对话框  



      当构造 CFileDialog 类时指定了 OFN_ALLOWMULTISELECT 的属性,则 CFileDialog 允 

许用户选择多个文件,如图 8…3 所示。  

      当设置允许多选的文件对话框时,与普通使用惟一的区别就是如何获得所有选定的文 

件。这就用到 CFileDialog::GetStartPosition()和 CFileDialog::GetNextPathName()两个函数。  



                                                                                  



                                     图 8…3    可以多选的打开文件对话框  



      CFileDialog::GetStartPosition()函数用于获得选择列表中的第一个文件路径名的位置,其 

原型为:  



     POSITION GetStartPosition( ) const;  



                                                                                                      ·203 ·  


…………………………………………………………Page 215……………………………………………………………

Visual C++ 6。0 程序设计从入门到精通  



     函数返回值用于枚举选择的文件。若为 NULL ,则说明选择列表为空。  

     CFileDialog::GetNextPathName()函数用于获得下一个选择的文件名,其原型为:  



     CString GetNextPathName(  



           POSITION& pos    



     ) const;  



     o  参数 pos :指示前一个 GetNexPathName()或 GetStartPosition()函数设置的 POSITION 值。 

        当 GetNextPathName()调用返回时会修改该参数,如果值为 NULL ,则说明到达列表结 

        尾。  

     o  函数返回值:获得下一个选择的文件路径名。  

     于是可以得到下面的代码:  



     //创建一个可以多选的文件对话框  



     CFileDialog dlg(TRUE; NULL;NULL;OFN_ALLOWMULTISELECT);  



     if (dlg。DoModal()==IDOK)            //如果返回为确定,获得选择的文件名  



     {  



          POSITION pos;  



          pos=  dlg。GetStartPosition(); //开始遍历用户选择列表  



          while (pos!=NULL)         //如果列表中还有新的文件  



          {  



               CString filename=GetNextPathName(pos);   //获得新的被选定的文件  



       



               ……        //对 filename 的文件进行处理  



          }  



     }  



8。3。2    重载文件对话框  



     当用户需要文件对话框有更多的功能,则可以通过重载 CFileDialog 类,并为文件对话框 

添加新的控件完成。  

     本节中以一个重载文件对话框的例子介绍重载的步骤 。该例为文件对话框添加一个“删 

除”按钮,用于删除文件对话框中选定的文件,如图 8…4 所示。  

     实现这个自定义的文件对话框主要分为下列 3 个步骤:  



                                                                        



                                       图 8…4    “打开”对话框  



 ·204 ·  


…………………………………………………………Page 216……………………………………………………………

                                                                        第 8 章    文件操作  



     1.创建一个对话框模板  



    首先向工程的资源文件中创建一个新的对话框模板,将 ID 设为 IDD_MYFILEDIALOG 。 

然后设置模板风格属性如图 8…5 所示。  



                                                                      



                             图 8…5    设置对话框模板的风格属性  



    然后向模板中添加“删除”按钮,ID  设置为 IDC_DEL ,并重新调整对话框的大小,如 

图 8…6 所示。  



                                                                          



                               图 8…6    为对话框模板添加控件  



    注意,在图 8…6  中可以看到,新添加包含“删除”按钮的对话框模板是放在文件对话框 

的底部。因此需要将对话框的模板设置为子窗口而且无边框,更重要的是要复选“Clip  

siblings ”和“Clip children ”两个属性,使得文件对话框的原始控件可以得到恰当的重绘。  



    2 .重载 CFileDialog 类  



    在 ClassWizard 中创建一个CFileDialog 的派生类CMyFileDialog 。然后修改CMyFileDialog 

的构造函数,代码如下:  



    //构造函数创建一个新的打开文件对话框,没有后缀名过滤器和默认的后缀名  



    //参数中设置 OFN_ENABLETEMPLATE 用于从自定义模板中添加新的控件  



    CMyFileDialog::CMyFileDialog() :  



             CFileDialog(TRUE; NULL; NULL;    



                      OFN_FILEMUSTEXIST|OFN_ENABLETEMPLATE; NULL; NULL)  



     {  



         //设置文件对话框的模板为 IDD_MYFILEDIALOG  



         //这里有两个参数分别对应于老版本和新版本的文件对话框  



         //这里将两类版本的文件对话框模板都进行设置  



                                                                                 ·205 ·  


…………………………………………………………Page 217……………………………………………………………

Visual C++ 6。0 程序设计从入门到精通  



         SetTemplate(IDD_MYFILEDIALOG;IDD_MYFILEDIALOG);  



     }  



     然后在 ClassWizard  中为 CMyFileDialog 添加 IDC_DEL 控件的 BN_CLICKED 处理函数 

OnDel(),代码如下:  



     void CMyFileDialog::OnDel()    



     {  



         // TODO: Add your control notification handler code here  



         //  提示用户是否删除文件  



         if (MessageBox(〃确定删除文件?〃;〃提示〃;MB_OKCANCEL)!=IDOK)  



         {  



              //不删除文件则退出  



              return;  



         }  



         CFile::Remove(GetPathName());    //删除选定的文件  



     }  



     3 .使用重载的文件对话框  



     创建好 CMyFileDialog 就可以在程序中使用重载后的对话框,使用方法跟普通的文件对 

话框类似,代码如下:  



     CMyFileDialog dlg;     //创建 CMyFileDialog 对象  



     if (dlg。DoModal()==IDOK)   //打开对话框  



     {  



          ……                     //进行用户选定文件后的处理  



     }  



     这样就能打开如图 8…4 所示的对话框,在选择文件打开的同时还可以通过单击“删除” 

按钮删除一个选定的文件,为文件对话框提供了附加的功能。  

     本小节给出的例子稍加修改就可以添加更多更复杂的功能 。同时 CFileDialog 还提供了一 

些虚函数用于自定义处理文件对话框原有控件产生的消息,重载这些函数就可以为 

CFileDialog 原有的功能进行重新设计,从而大大提高文件对话框的灵活性。  



8。4    本章小结  



     本章主要介绍了在  MFC            中如何对文件进行读写操作和一些管理操作,主要内容包括以 

下几个方面:  

     o  在文档视图结构中对文档进行串行化;  

     o  用 CFile 类和相关类对磁盘文件进行读写和管理;  

     o  文件对话框 CFileDialog 的一些高级使用方法。  

     总之,文件操作是应用程序保存和使用数据的基本方法 。只有熟练使用本章中介绍的各 

种文件操作的类和函数才能在程序中体现出更大的灵活性。  



 ·206 ·  


…………………………………………………………Page 218……………………………………………………………

                 第 9 章    多线程  

                 第 9 章    多线程  



   本章主要介绍 Windows 操作系统下多线程的基本概念、创建管理线程的方法,以及线程 

的同步问题。Windows 提供了大量的线程同步技术,这些技术可以应用于不同的实际情况。 

同时,MFC 对线程操作进行了封装,提供了支持线程操作的类库。本章主要讨论这些技术, 

并且给出相应的实例。主要包括以下几个方面的内容:  

   o  Windows 下多线程的基本概念;  

   o  用户界面线程和工作者线程;  

   o  线程的管理操作;  

   o  线程的同步;  

   o  多线程编程实例。  



9。1    多线程的基本概念  



   在 Win32 下,一个应用程序由一个或多个进程组成。一个进程由一个或多个线程以及代 

码、数据和其他内存中的程序资源组成。典型的程序资源包括打开的文件、信号量、动态分 

配的内存等。线程在进程空间中执行。  

   线程是操作系统分配处理器时间的最小单位 。每个线程有自己的堆栈,CPU 寄存器,以 

及程序入口。每个线程共享所有处理器的资源。  

   进程中的每个线程都独立执行,不会影响该进程中的其他线程。所有线程共享公共的资 

源。因此必须采用信号量或者其他进程间通信方法来调整线程的工作。  



9。2    两种重要的线程  



   Windows 提供了两种线程,用户界面线程和工作者线程。用户界面线程通常用来处理消 

息循环、与用户交互,工作者线程用来处理后台的计算。下面分别介绍这两种线程。  



9。2。1    用户界面线程  



   每一个 Windows 应用程序都有一个主线程 。这里的用户界面线程是指用来和用户进行交 

互的线程。接收用户传送的数据,并且做出响应。用户界面线程通常包含自己的窗口,有自 

己的消息循环,独立于应用程序的其他部分。  

   创建一个用户界面线程需要首先继承线程类 CWinThread,重载它的成员函数,如表 9…1 

所示。最后调用 AfxBeginThread 创建线程对象。  


…………………………………………………………Page 219……………………………………………………………

Visual C++ 6。0 程序设计从入门到精通  



    表 9…1                  需要重载的 CWinThread 的成员函数  



                 函数名称                                     作用  

 InitInstance                            线程的初始化,通常需要重载  

 ExitInstance                            释放线程占用的资源,通常需要重载  

 OnIdle                                  空闲时间的处理,不一定重载  

 PreTranslateMessage                     过滤消息,不一定重载  

 ProcessWndProcException                 处理线程抛出的意外  

 Run                                     线程控制函数,通常不重载  



9。2。2    工作者线程  



    工作者线程通常用来处理后台运行的任务 。在后台任务运行的同时,用户可进行其他操 

作,不必等待后台任务的结束 。例如一个三维模型编辑软件,用户要对两个模型做布尔运算。 

在进行计算的同时,用户希望可以观察两个模型,对模型进行旋转,缩放的操作。再如文本 

浏览软件的打印功能,在打印文本的工程中,用户仍然会继续浏览文本内容。这些都属于工 

作者线程。  

    创建一个工作者线程只需要两个步骤 。首先实现工作者线程的功能函数,然后启动线程 

即可。可以调用 Win32 提供的 API 函数 CreateThread 创建一个线程,MFC 对 Win32  的线程 

操作做了封装,也可以通过调用 AfxBeginThread 创建一个线程对象 。这些函数及其调用方法 

将在下一节详细介绍。  



9。3    线程的操作  



    本小节介绍 Windows 线程的操作方法,包括线程的创建、线程的管理、线程的同步、线 

程的终止等。  



9。3。1    线程的创建  



    线程的创建方法有 3 种,分别介绍如下:  



    1.调用 Win32API 函数 CreateThread 和 CreateRemoteThread  



    (1)CreateThread  

    函数 CreateThread 用来创建线程。如果调用成功则返回非 0,否则返回 0 。它的函数原型 

如下:  



    HANDLE CreateThread(  



        LPSECURITY_ATTRIBUTES lpThreadAttributes;    



        SIZE_T dwStackSize;               



        LPTHREAD_START_ROUTINE lpStartAddress;   



        LPVOID lpParameter;                                              



        DWORD dwCreationFlags;                                      



 ·208 ·  


…………………………………………………………Page 220……………………………………………………………

                                                                               第 9 章    多线程  



         
返回目录 上一页 下一页 回到顶部 0 0
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!