八宝书库 > 文学其他电子书 > VC语言6.0程序设计从入门到精通 >

第48部分

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

小说: VC语言6.0程序设计从入门到精通 字数: 每页4000字

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




许用户选择多个文件,如图 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 章    多线程  



         LPDWORD lpThread

返回目录 上一页 下一页 回到顶部 0 0

你可能喜欢的