C++-MFC基础教程(初学者)_第1页
C++-MFC基础教程(初学者)_第2页
C++-MFC基础教程(初学者)_第3页
C++-MFC基础教程(初学者)_第4页
C++-MFC基础教程(初学者)_第5页
已阅读5页,还剩437页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、ppt简介,共14章、442页,涵盖了vc的基础介绍,以及mfc程序的创建,控件的使用、多线程、多媒体编程、网络编程、动态链接库的使用等等,是那些喜欢MFC但是不知道从何学起的MFC爱好者的最佳的基础教材! 第1章 Visual C+集成开发环境 第2章 MFC与应用程序框架 第3章 C+语言基础 第4章 C+的面向对象 65,第5章 菜单栏、工具栏和状态栏 第六章 对话框 108页始 第七章 控件 134页始 第八章 MFC常用类 171页始 第九章 多媒体类 第10章 DLL的开发与调用 237 第11章 文档和视图 271 第12章 数据库编程 296 第13章 多线程编程 340 第1

2、4章 WinSock网络通信开发 395,第1章 Visual C+集成开发环境,Visual C+是一个功能强大的可视化应用程序开发工具。其凭借强大功能,受大了广大程序员的欢迎。当今流行的Visual C+的开发工具是6.0版本。下面来介绍Visual C+ 6.0的一些基本情况。,1.1 Visual C+ 6.0概述,Visual C+是一种C/C+语言的集成开发环境(IDE)。当最初还处于DOS时代的Borland公司推出了Turbo Pascal和Turbo C,让程序员感受到了把编译器和编辑器集成在一起使用时的方便。Microsoft公司也看到了这一点,于是,两个公司开始合作,推出

3、了Quick C和Microsoft C/C+等多个DOS版本的C/C+集成开发环境。 随着Windows的不断成熟,于是Microsoft开始开发Windows下的Visual C+。经过多次版本的修订与更新,现在大多数程序员使用的是Visual C+ 6.0版本。 Visual C+是一个可视化的C+的集成开发环境。在使用Visual C+时,开发人员可以通过鼠标拖动方便地设计程序的界面,相应的代码系统会自动生成。MFC(Microsoft Fundermental Classes)是微软提供的Visual C+可以调用的类库,其中封装了开发人员常用的类。使用MFC可以大大提高编程人员的工

4、作效率。,1.2 Visual C+6.0界面介绍,安装好Visual C+开发环境后,桌面上并没有其快捷图标,需读者自己修改。选择“开始”菜单,从所有程序中,找到Microsoft Visual Studio 6.0级联菜单下的Microsoft Visual C+菜单项。选择该菜单项,并将其拖动到桌面上,则在桌面上创建了Microsoft Visual Studio的快捷图标。 双击快捷图标,即可启动Visual C+6.0集成开发环境。每次运行Visual C+6.0时,会弹出一个【Tip of the day】对话框,如下图所示。,1.2 Visual C+6.0界面介绍,技巧:【Ti

5、p of the day】对话框中介绍了很多关于开发环境的使用方法以及编程方面的小技巧。如果想在下次启动Visual C+ 6.0时不再显示该提示对话框,可以选择下一次启动时不再显示它。,1.2 Visual C+6.0界面介绍,为了便于说明,首先创建一个IDE的MFC项目(具体创建步骤,后面会详细介绍),如下图所示。,1.2 Visual C+6.0界面介绍,从上图中可以看出,Visual C+的界面被分成了7部分。上面依次标题栏、菜单栏和工具栏。中间左侧部分是工作区窗口,右侧部分是编辑区。最下方是输出窗口和状态栏。,1.2.1 工作区窗口和输出窗口,工作区窗口和输出窗口是在一个程序编译时使

6、用最多的停靠式窗口。工作区窗口中显示了当前程序中的所有类、资源和文件信息。工作区窗口分为3个部分:Class View(类视图)、Resource View(资源视图)和File View(文件视图)。 Class View:显示当前工作区中所有工程定义的C+类。双击某个类名,Visual C+会自动打开这个类的文件,并将编辑区定位到该类的定义处。双击类中的成员函数和变量,编辑区则定位到该成员函数或变量的定义处。,1.2.1 工作区窗口和输出窗口,Resource View:显示当前工作区中所有的资源。这些资源包括快捷键、对话框、图标、菜单、字符条编辑器、工具栏和版本信息。双击其中的ID号,会

7、显示相应的资源信息。 File View:显示属于当前工程的所有文件,包括C/C+源文件、头文件、资源文件等。 输出窗口与工作区一样,分为多个选择卡。其中最常用的选项卡被放在了最外面,分别为Build、Debug、Find in Files 1和Find in Files 2。,1.2.1 工作区窗口和输出窗口,Build:Build显示工程在创建中,经过的每一个步骤及相应信息。如果出现编译链接错误,那么出现错误的文件、原因、行号等内容会显示在Build中。双击该错误信息行,编辑区则定位在该错误出现的行。 Debug:工程通过编译后,运行调试版本时,Debug选项卡中会显示具体的调试信息。,1

8、.2.1 工作区窗口和输出窗口,Find in Files 1和Find in Files 2:两个选项卡的作用相同,用于显示从多个文件中查找字符串的结果。当用户想要查看某个函数或变量出现在哪些文件中,单击【Edit】|【Find in Files】命令,弹出【Find in Files】对话框,如下图所示。在【Find in Files】对话框中的【Find what】后的编辑框中,输入想要查找的内容,单击【Find】按钮即可。查找到的内容会输出到Find in Files选项卡中。,1.2.2 菜单栏和工具栏,菜单栏位于集成开发环境的顶部。菜单栏由9个菜单项组成:File(文件)、Edit

9、(编辑)、View(视图)、Insert(插入)、Project(工程)、Build(编译)、Tools(工具)、Windows(窗口)、Help(帮助)。每一个菜单项都有一个下拉式菜单,其中的菜单项用于完成特定的功能。 工具栏位于菜单栏的下面。工具栏可以称作是美化的菜单栏,其由许多按钮构成。其中的按钮用于完成特定的功能。工具栏可以任意拖动,也可以成为一个浮动窗口。,1.2.3 编辑区,在Visual C+中,编写应用程序代码的位置就是编辑区。该编辑区的功能十分强大,智能化程度也非常高。在编辑区内,除了能编写C/C+语言外,还能编写SQL、HTML和VBScript等其他编程语言。如下图所示。

10、,1.2.4 联机帮助,Visual C+6.0不像其他集成开发环境一样把帮助系统集成在开发环境内部,而是提供了一个专门为Visual C+设计的MSDN类库。MSDN虽然是一个独立的帮助系统,但却能很好地和Visual C+6.0集成在一起。 MSDN的使用方式有以下几种: 单击【Help】|【Contents】命令; 单击【Help】|【Search】命令; 单击【Help】|【Index】命令; 按下【F2】键。 通过上述几种命令方式,即可运行MSDN。,1.2.4 Visual C+中的文件扩展名,打开程序Hello World所在的文件夹,看到该文件夹自动生成了许多扩展名不同的文件,

11、如下图所示。,1.2.6 Visual C+中的文件扩展名,了解这些不同的扩展名文件,对于理解Visual C+6.0如何组织和管理项目文件是很有必要的。有关这些文件扩展名及其说明,如下表所示。,第2章 MFC与应用程序框架,在Visual C+集成开发环境下,使用微软基础类库MFC,可以开发出功能强大的Windows应用程序。另外,通过MFC AppWizard自动生成的MFC应用程序框架,还可以很方便地开发自己想要实现的功能。本章将先介绍有关MFC的基础知识,然后对MFC应用程序框架作具体介绍。,2.1 微软基础类库MFC,MFC是一种重要的编程方法,它是微软公司的特定的应用程序包装接口。

12、本节将讲解MFC概述及其类库结构。,2.1.1 MFC概述,MFC的英文全称是Microsoft Foundation Classes,即微软的基础类库。MFC的本质就是一个包含了许多微软公司已经定义好的对象的类库。 虽然开发人员要编写的程序在功能上各有不同,但是从结构上讲,都可以化分为对用户界面的设计、对文件的操作、对数据库的访问及对多媒体的使用等一些最主要的方面。这一点正是微软提出MFC类库最重要的原因。 在MFC类库中,大约有200个类。在进行程序设计时,只需简单地调用已有的类及类中的方法即可。另外,还可以利用“继承”方法从已有类中派生出自己想要的类。这时,派生出来的类不但拥有父类中的方

13、法和属性,还可以根据自己的需求,自定义一些特殊的属性和方法,使得派生类功能更加强大。MFC有较好的移植性,可应用于众多平台。,2.1.2 MFC类库结构,MFC中类可划分为基类、应用程序结构类、窗口类、OLE类、数据库类等10大类,而且在其中的一些大类的基础上又派生出许多子类。MFC的类库结构的层次图如下图所示。,2.1.2 MFC类库结构,从上图中可以看出,CObject是一个原始基类。绝大多数MFC类的最终基类都是CObject。原始基类下面,主要包括以下几种类:MFC应用程序结构类,窗口、对话框和控件类,输出(设备文本)和绘图类,简单数据类型类,数组、列表和映射类,文件和数据库类,Int

14、ernet和网络类,OLE类以及高度和异常类。 MFC的应用程序结构类分为CWinApp和CWinThread。使用MFC创建的每一个应用程序都包含一个由类CWinApp派生而来的应用程序对象。该对象是一个全局对象。应用程序对象主要用于处理应用程序的初始化,同时也处理应用程序事件的消息循环。 CCmdTarget和CCmdUI为MFC中常用的有关发送命令的类。CDocument为MFC中常用的应用程序文档的基类。CDocTemplate为文档模版类,通常是应用程序的单文档或多文档的基类。CView类是常用的视图类。,2.2 MFC应用程序框架分析,在前面介绍过如何创建一个基于单文档的应用程序。

15、对于如何选择性地创建基于多文档或是基于对话框的应用程序,将会在后续章节详细介绍。本节主要对MFC应用程序框进行简单的概括,使读者了解MFC应用程序框架的结构与工作机制。,2.2.1 入口函数,入口函数就是指一个程序的入口点。WinMain函数是Windows程序的入口函数。为了便于讲解,首先要创建一个MFC应用程序,程序名命名为sample0201。具体创建步骤不再详细介绍。 从创建好的sample0201程序中,并不能找到WinMain函数。这是因为典型Windows程序的大部分初始化工作都是标准化的,因此把WinMain函数隐藏在应用程序的框架中。当一个程序编译时,会自动将该函数链接到程序

16、中。 在计算机中找到Visual C+的安装目录,笔者安装在F盘,则按照下面这个路径依次打开文件夹,“F:Program FilesMicrosoft Visual StudioVC98MFCSRC”。打开后,会发现一个源文件“WinMain.cpp”。该文件中则定义了MFC应用程序的入口函数AfxWinMain。文件的源代码如下:,2.2.1 入口函数, ,2.2.1 入口函数,当一个应用程序启动时,会自动调用应用程序框架内部的AfxWinMain函数。根据其前缀Afx就知道WinMain是一个全局的MFC函数。从上述代码中可以看出,WinMain函数会查找该应用程序的一个全局构造对象。该对

17、象是由CWinApp的派生类创建,因此有程序启动时,它就被创建好了。然后WinMain对该应用程序进行初始化,在此过程调用的是该程序全局构造对象的InitApplication()和InitInstance()函数。完成初始化后,WinMain调用Run()函数,运行应用程序的消息循环。最后结束应用程序时,WinMain调用AfxWinTerm()函数,做一些清理工作。,2.2.2 InitInstance()函数,InitInstance()函数的作用是初始化程序。每次启动一个应用程序时,Winmain函数会自动调用InitInstance()函数。打开创建的程序sample0201,在该程

18、序的CSample0201App类中,可以看到该程序对InitInstance()函数进行了重载。该重载代码如下: ,2.2.2 InitInstance()函数,从上述代码中可以看出,在ShowWindow和UpdateWindos之前,程序要做两个动作,一个是注册窗口类,另一个是构建窗口类。InitInstance()函数规定了生成的应用程序是基于单文档的、基于多文档的或是基于对话框的。因此在CWinApp中必须重载InitInstance()函数。,2.2.3 应用类Run()函数,与查找WinMain函数类似,在Visual C+的安装目录下,按照下面这个路径依次打开文件夹,“F:Pr

19、ogram FilesMicrosoft Visual StudioVC98MFCSRC”。打开后,会发现一个源文件“THRDCORE.CPP”。该文件中定义了应用类Run()函数,源代码如下: ,2.2.3 应用类Run()函数,从上述代码中可以看出,如果消息队列没有消息,则调用OnIdle( )函数,并递增iIdleCount计数标志,该计数标志表示在两次消息处理过程只共调用了多少次OnIdle()函数。bIdle是消息队列空闲的标志,当消息队列有消息时,则调用PumpMessage()函数,进行消息翻译和消息派发。其中PreTranslateMessage( 如果想要全部清除组合框中的内

20、容,可以使用ResetContent()函数。ResetContent()函数的原型如下: void ResetContent( ); 在组合框的使用中,最常用的操作就是获取当前选项的内容。该操作需要用到以下几个函数。 GetDlogItem():获取组合框的指针。 GetCurSel():获取组合框当前选项的索引值。 GetLBText():获取组合框当前选项的字符串。,7.5 树形控件与列表视图控件,树形控件(Tree Control)通常与列表视图控件(List Control)结合使用。二者通过不同的方式向使用者显示信息。下面对这两个控件进行详细介绍。,7.5.1 树形控件,树形控件(

21、Tree Control)用于显示具有层次结构的数据。该控件有一个根结点(Root),根结点下面有许多子结点。每个子结点又可以作为父结点拥有自己的子结点。 树形控件的风格可以通过其属性对话框的【Styles】和【More Styles】选项卡进行设置。树形控件的属性对话框如下图所示。,7.5.1 树形控件,【Styles】和【More Styles】选择卡常用属性及其含义如下表所示。,7.5.1 树形控件,树形控件对应的MFC类为CTreeCtrl。CTreeCtrl类封装了对树形控件的大量操作。如果想要获取一个树形控件中的选项的项目,可以使用GetCount()函数。GetCount()函数

22、的原型如下: UINT GetCount( ) const; 如果想要查看一个结点是否存在子结点,可以使用ItemHasChildren()函数。ItemHasChildren()函数的原型如下: Bool ItemHasChildren ( HTREEITEM hItem ); 如果想要获取一个树形控件指定项的子项,可以使用GetChildItem()函数。GetChildItem()函数的原型如下: HTREEITEM GetChildItem ( HTREEITEM hItem ) const; 如果想要获取一个树形控件指定项的父项,可以使用GetParentItem()函数。GetPa

23、rentItem()函数的原型如下: HTREEITEM GetParentItem ( HTREEITEM hItem ) const;,7.5.1 树形控件,如果想要获取一个树形控件的当前项,可以使用GetSelectItem()函数。GetSelectItem()函数的原型如下: HTREEITEM GetSelectedItem( ) const; 如果想要获取获取一个树形控件指定项的根结点,可以使用GetRootItem()函数。GetRootItem()函数的原型如下: HTREEITEM GetRootItem( ) const; 如果想要获取一个树形控件指定项的文本信息,可以使

24、用GetItemText()函数。GetItemText()函数的原型如下: CString GetItemText ( HTREEITEM hItem ) const; 如果想要设置一个树形控件指定项的文本信息,可以使用SetItemText()函数。SetItemText()函数的原型如下: BOOL SetItemText ( HTREEITEM hItem,LPCTSTR lpszItem );,7.5.1 树形控件,如果想要在一个树形控件中插入一个新项,可以使用InsertItem()函数。InsertItem()函数的原型如下: HTREEITEM InsertItem ( LPT

25、VINSERTSTRUCT lpInsertStruct ); 如果想要从一个树形控件中删除一个项,可以使用DeleteItem()函数。DeleteItem()函数的原型如下: BOOL DeleteItem ( HTREEITEM hItem ); 如果想要从一个树形控件中删除所有的项,可以使用DeleteAllItems()函数。DeleteAllItems()函数的原型如下: BOOL DeleteAllItems( ); 如果想要一个树形控件在生成时,将所有的结点都展开,可以使用Expand()函数。Expand()函数的原型如下: BOOL Expand ( HTREEITEM h

26、Item,UINT nCode );,7.5.2 列表视图控件,列表视图控件(List Control)以列表的形式显示数据。通常情况下,在显示数据库中的记录时会用到该控件。列表视图控件的风格可以通过其属性对话框进行设置。列表视图控件的属性对话框如下图所示。,7.5.2 列表视图控件,列表视图控件中常用属性及其各属性的说明如下表所示。,7.5.2 列表视图控件,列表视图控件对应的MFC类为CListCtrl。CListCtrl类中封装了大量对列表视图控件的操作。 如果想要获取一个条目的状态,可以使用GetItemState()函数。该函数的原型如下: UINT GetItemState ( i

27、nt nItem , UINT nMask ) const; 如果想要改变一个条目的状态,可以使用SetItemState()函数。该函数的原型如下: BOOL SetItemState ( int nItem , LVITEM* pItem ); BOOL SetItemState ( int nItem , UINT nState , UINT nMask ); 如果想要获取一个条目的文本,可以使用GetItemText()函数。该函数的原型如下: int GetItemText ( int nItem , int nSubItem , LPTSTR lpszText , int nLen

28、 ) const; CString GetItemText ( int nItem , int nSubItem ) const; 如果想要改变一个条目的文本,可以使用SetItemText()函数。该函数的原型如下: BOOL SetItemText ( int nItem , int nSubItem , LPCTSTR lpszText );,7.5.2 列表视图控件,如果想要查找具有特定字符的条目,可以使用FindItem()函数。该函数的原型如下: int FindItem ( LVFINDINFO* pFindInfo,int nStart = -1 ) const; 如果想要将所

29、有的条目排序,可以使用SortItems()函数。该函数的原型如下: BOOL SortItems ( PFNLVCOMPARE pfnCompare , DWORD_PTR dwData ); 如果想要插入新的一列,可以使用InsertColumn()函数。该函数的原型如下: int InsertColumn(int nCol,const LVCOLUMN* pColumn); int InsertColumn ( int nCol,LPCTSTR lpszColumnHeading,int nFormat = LVCFMT_LEFT, int nWidth = -1 , int nSubI

30、tem = -1 ); 如果想要删除一列,可以使用DeleteColumn()函数。该函数的作用如下: BOOL DeleteColumn ( int nCol );,7.5.2 列表视图控件,如果想要准备一个列表视图控件以添加大量的项,可以使用SetItemCount函数。该函数的原型如下: void SetItemCount ( int nItems ); 如果想要添加一个新的条目,可以使用InsertItem()函数。该函数的原型如下: int InsertItem ( const LVITEM* pItem ); int InsertItem ( int nItem , LPCTSTR

31、 lpszItem ); int InsertItem ( int nItem , LPCTSTR lpszItem , int nImage ); int InsertItem(UINT nMask,int nItem,LPCTSTR lpszItem,UINT nState, UINT nStateMask,int nImage,LPARAM lParam); 如果想要删除一个条目,可以使用DeleteItem()函数。该函数的原型如下: BOOL DeleteItem ( int nItem ); 如果想要将全部的条目删除,可以使用DeleteAllItems()函数。该函数的原型如下;

32、 BOOL DeleteAllItems( );,7.6 滑块控件与进度条控件,滑块控件和进度条控件都是向用户显示某种事物的变化。但不同的是,滑块控件是通过手工拖动的方式来改变数据的大小,而进度条是自动向用户展示程序的进度。下面就对这两种控件进行详细介绍。,7.6.1 滑块控件,滑块控件(Slider)由刻度和“滑块”组成。用户可以通过鼠标或是键盘手动对其进行控制。滑块控件的风格可以通过其属性对话框进行设置。滑块控件的属性对话框如下图所示。,7.6.1 滑块控件,滑块控件中的常用属性及其说明如下表所示。,7.6.1 滑块控件,滑块控件对应的MFC类为CSliderCtrl。CSliderCtr

33、l类封装了大量对滑块控件的操作。 如果想要获取滑块移动一格时改变的数值大小,可以使用GetLineSize()函数。该函数的原型如下: int GetLineSize( ) const; 如果想要设置滑块移动一格时改变的数值大小,可以使用GetPageSize()函数。该函数的原型如下: int GetPageSize( ) const; 如果想要获取滑块上表示的数值范围,可以使用GetRange()函数。该函数的原型如下: void GetRange ( int,7.6.1 滑块控件,如果想要设置滑块上刻度的最小值,可以使用SetRangeMin()函数。该函数的原型如下: void Set

34、RangeMin ( int nMin , BOOL bRedraw = FALSE ); 如果想要获取滑块上刻度的最大值,可以使用GetRangeMax()函数。该函数的原型如下: int GetRangeMax( ) const; 如果想要设置滑块上刻度的最大值,可以使用SetRangeMax()函数。该函数的原型如下: void SetRangeMax ( int nMax , BOOL bRedraw = FALSE ); 如果想要获取滑块上选择部分的范围,可以使用GetSelection()函数。该函数的原型如下: void GetSelection ( int,7.6.2 进度条控

35、件,进度条控件(Progress)用于显示程序的进度。进度条由一个范围和一个当前位置组成。进度条控件的风格可以通过其属性对话框进行设置。进度条控件的属性对话框如下图所示。,7.6.2 进度条控件,进度条控件对应的类为CProgressCtrl。CProgressCtrl类封装了大量对进度条控件的操作。 如果想要获取进度条的范围,可以使用GetRange()函数。该函数的原型如下: void GetRange ( int,7.6.2 进度条控件,如果想要设置进度条当前的位置,可以使用SetPos()函数。该函数的原型如下: int SetPos ( int nPos ); 如果想要在进度条上偏移

36、一定的位置,可以使用OffsetPos()函数。该函数的原型如下: int OffsetPos ( int nPos ); 如果想要设置进度条的步长,可以使用SetStep()函数。该函数的原型如下: int SetStep ( int nStep ); 如果想要进度条以设置的步长为单位向前进展,可以使用StepIt()函数。该函数的原型如下: int StepIt( );,第8章 MFC常用类,MFC提供了大量封装好的类,其中有一些类不经常使用,但有一些类使用的频率要高一些。这些类用于处理字符串、日期和时间、文件操作以及异常等。本章将分别介绍这些类,通过本章的学习,读者可以熟悉MFC的常用类

37、,并熟练使用这些MFC常用类。,8.1 字符串类(CString),CString类是一种用途广泛的数据类型。CString类简化了MFC中的许多操作,使得操作字符串更加方便。下面将详细介绍CString类对字符串的具体操作。,8.1.1 创建字符串对象,CString对象采用了动态分配内存的机制。也就是说,在创建CString对象时,不需对该对象指明内存大小,CString会根据实际情况动态地进行分配。创建一个CString类对象并为其赋值的方法有以下几种方法。 第一种方法是先构造一个CString类的对象,然后再使用赋值语句为其赋值。 第二种方法是在构造CString类对象的同时,直接为其

38、赋值。 第三种方法是在构造CString类对象的同时,利用引用来的值为其赋值。 第四种方法是在构造CString类对象的同时,采用单字符为其赋值。 第五种方法是在构造CString类对象的同时,产生了一个字符串。,8.1.2 CString类的成员函数,在CString类中,存在大量对字符串进行各种操作的函数。CSting类中常用函数及其说明如下表所示。,8.1.3 字符串的大小写转换,在实际操作中,经常会将字符串进行大小写的转换。CString类中进行大小写转换的函数分别是:MakeUpper()和MakeLower()函数。其中,MakeUpper()是大写转化函数,MakeLower()

39、小写转化函数。 【示例8-1】将指定字符串进行大写转换。 运行程序,输出结果为“HELLO!”。 【示例8-2】将指定字符串进行小写转换。 运行程序,输出结果为“hello!”。 由上述两个输出结果看出,MakeUpper()和MakeLower()函数只对字母进行相应的转换,其他字符不会受到任何影响。,8.1.4 字符串的连接,进行字符串的连接有两种方法:一是直接使用“+”进行直接连接,二是使用Insert()函数进行特殊的插入。下面通过实例对这两种方法进行具体介绍。,1“+”连接字符串,使用“+”连接字符串是最常用的连接字符串的方法。 【示例8-3】使用“+”连接字符串。 运行程序,输出结

40、果str3为Hello,而str4为lloHe。由程序结果可以看出,使用“+”进行字符串连接时,是在“+”前面字符串的末尾加上“+”后面的字符串。,2Insert()函数,在连接字符串时,并不一定都是在字符串的末尾进行连接。此时,应该使用Insert函数。Insert()函数有两种原型。 (1)第一种原型如下: 其中,nIndex用来表示插入字符串的位置,ch表示将要插入的字符串。该函数的返回值int,表示改变后的字符串的长度。 (2)第二种原型如下: 其中,其中,nIndex用来表示插入字符串的位置,pstr表示需要插入的子链的指针。该函数的返回值int,表示改变后的字符串的长度。,8.1.

41、5 字符串的比较,字符串的比较是根据字母对应的ASCII值。当两个字符串进行进行比较时,首先从第一个字符开始进行比较。如果两个字符串的第一个字母的ASCII值相同,则比较第二个字母。依此类推,直到比较完为止。 在CString类中,比较字符串的函数有两个,分别如下: 和 其中,Compare()函数在比较时区分大小写,而CompareNoCase()函数则不区分大小写。,8.1.6 字符串的提取,在CString类中,提取字符串可以使用Left()、Mid()、Right()3种函数。三者分别从左边、中间和右边开始提取字符串。3种函数的原型分别如下: 其中,nCount表示开始提取字符串的长度

42、,nFirst代表要提取的开始索引位置。,8.1.7 字符串的查找,在CString中,Find()和ReverseFind()函数用于字符串指定位置的查找。Find()函数是从一个字符串中查找字符串。Find()函数的原型有几中,分别如下: 其中,ch表示要查找的字符串,nStart表示开始查找的索引值。Find()函数返回查找到的字符串的位置。 ReverseFind()函数是从一个字符串的末尾开始查找字符。ReverseFind()函数的原型如下: 其中,ch表示要查找的字符。该函数的返回值是查找到的字符串的索引值。,8.1.8 字符串的移除,在CString类中,想要移除字符串可以调用

43、Remove()和Delete()函数。其中,Remove()用于从字符串中移除特定的字符。Remove()函数的原型如下: 其中,ch表示想要移除的字符。该函数的返回值是返回从字符串中移走的字符数。如果字符串没有变化,则返回0。,8.1.9 CString类的格式化,在前面几个例子中,已经用到过Format()函数。该函数就是用于实现字符串的格式化。Format()函数的原型如下: 其中,fromat用于表示格式化字符串,args表示输出文本。 从上述代码分析,格式化字符串由三部分组成:、前的表述性文字和后各种格式字符。 在Visual C+中,后的格式字符有以下几种,如下表所示。,8.1.

44、10 CString类的类型转换,CString类型的数据可以转换成其他类型的数据。,1CString类型转换成整型,如果将CString类型的数据转换成整型数据,可以使用atoi()函数。atoi()函数的原型如下: 【示例8-14】CString类型转换成整型。 运行程序,输出转换后的整型数据114。,2CString类型转换成char*类型,如果将CString类型的数据转换成char*odga,可以有多种方法。 使用GetBuffer()函数。GetBuffer()函数的原型如下: 【示例8-15】使用GetBuffer()函数将CString类型转换类型。 使用memcpy()函数。

45、memcpy()函数的原型如下: 【示例8-16】使用memcpy()函数将CString类型转换类型。,8.2 日期、时间类,在Visual C+中,有关日期和时间的类有两个:CTime类和CTimeSpan类。CTime表示是的绝对时间,而CTimeSpan表示的是时间差。本节将分别对这个两个类进行详细介绍。,8.2.1 CTime类,CTime类计算的时间是从1970年1月1日之后的秒数。由于CTime类没有基类,因此它可以在程序中任意位置调用。通常情况下,构造一个CTime对象采用如下方式: 【示例8-18】构造一个CTime类对象。 上述内容表示的时间是2008年5月19日22时18

46、分33秒。 如果想要获取当时系统时间,可以使用GetCurrentTime()函数,代码如下:,8.2.1 CTime类,在CTime类中,还有许多和GetCurrentTime()类似的函数,如表8.3所示。 使用CTime类获取的当前系统时间可以转化成字符串,此时可以使用CTime类的Format函数。Format函数的原型有以下两种:,8.2.2 CTimeSpan类,CTimeSpan类主要用于保存两个时间之间的间隔。CTimeSpan类的构造函数有以下三种: 其中,常用的是第三种方法。 【示例8-20】构造一个CTimeSpan类的对象。,8.2.1 CTime类,在CTimeSpa

47、n类中,有一些常用的函数,如下表所示。,8.2.3 计时器,计时器的作用就是用于计时,当到达规定的时间点时,会触发事先设置好的动作。SetTimer函数用于创建一个计时器,KillTimer函数用于销毁一个计时器。计时器属于系统资源,使用完应及时销毁。 SetTimer函数的原型如下: nIDEvent:表示计时器的ID。由于一个程序中可能存在多个计时器,因此用此ID号进行标记。 nElapse:表示时间间隔,单位是ms(毫秒)。 第三个参数看起来很复杂,一般情况下,设置其为NULL。,8.2.3 计时器,【示例8-24】使用SetTime函数创建一个计时器。 由于计时器属于系统资源,因此在使

48、用完应该及时地销毁。在Visual C+中,使用KillTimer函数来销毁所创建的计时器。KillTimer函数的原型如下: 【示例8-25】使用KillTimer函数销毁上例所创建的计时器。 读者通过阅读上面的内容可以发现,程序只是创建了计时器,而并没有说明计时器到达规定时间所做的操作。此时,应该使用OnTimer函数对计时器进行消息处理。,8.3 文件操作类(CFile),Visual C+提供的CFile类封装了对文件打开和关闭、读写和定位、删除、获取文件信息等操作。CFile类是最基本的文件操作类,它的派生类是CObject。本节将具体介绍CFile如何对文件进行操作。,8.3.1

49、文件的打开和关闭,CFile类有两种构造函数,使用默认的构造函数创建一个CFile对象后,还需要使用Open()函数将文件打开。使用带参数的构造函数创建一个CFile对象的同时,就将该文件打开了。下面对这两种打开文件的方式分别进行介绍。,1使用默认的构造函数打开文件,CFile类默认的构造函数原型如下: 如果在构造CFile类的对象采用这个默认的构造函数,那么仅仅创建了一个对象,而并没有打开文件。此时,需要用到Open()函数。Open()函数的原型如下: lpszFileName:用于指定文件名。 nOpenFlags:指定打开文件的方式。该参数可以几个值的组合,以“”进行分隔。该参数的取值

50、如下表所示。 pError:指向CFileException对象,用于异常操作。,1使用默认的构造函数打开文件,2使用带有一个参数的构造函数打开文件,CFile类有两个带参数的构造函数。其中,带一个参数的构造函数的原型如下: 该构造函数已经打开了一个文件,参数hFile就是打开文件的文件句柄。该函数将新创建的CFile对象绑定到一个已经打开的文件句柄上。HFile可以赋值给CFile的成员变量m_hFile。HFile也可以使用CreateFile()函数打开。CreateFile()函数的原型如下:,2使用带有一个参数的构造函数打开文件,hTemplateFile:为GENERIC_READ

51、访问的模式指定一个句柄到模板文件。 lpFileName:指向一个空结尾字符串。该参数指定了用于创建或打开句柄的对象。 dwDesiredAccess:指定对象的访问方式。程序可以获得读访问权,写访问权,读写访问权或者是询问设备(device query)访问权。 dwShareMode:设置共享模式。 lpSecurityAttributes:指向一个SECURITY_ATTRIBUTES结构的指针用于确定如何在子进程中继承这个句柄。如果这个参数是NULL,则该句柄不可继承。 dwCreationDisposition:指定当文件存在或者不存在时如何动作。 dwFlagsAndAttribu

52、tes:为文件指定属性和标志位。,3使用带有两个参数的构造函数打开文件,CFile类的第二个带有参数的构造函数有两个参数,其原型如下: lpszFileName:表示将要打开的文件的路径名。 nOpenFlags:表示文件的共享和存取模式。该参数与Open()函数的nOpenFlags参数完全相同。 【示例8-29】使用带有两个参数的构造函数打开文件。,8.3.3 文件的读写,在CFile类中,有专门对文件进行读写操作的函数Read()和Write()。其中,Read()函数的原型如下: lpBuf:表示接收数据缓冲区的指针。 nCount:指定读操作的字节数。 Write()函数的原型如下:

53、 lpBuf:表示接收数据缓冲区的指针。 nCount:指定写操作的字节数。,8.3.3 文件的读写,【示例8-30】对文件进行读写操作。,8.3.4 文件的定位,使用CFile类对文件进行读写操作时,可以进行随机读写。调用CFile类的Seek()函数,可以定位文件指针定位的位置,而调用SeekToBegin()和SeekToEnd()函数可以来回移动文件指针。Seek()函数的原型如下: lOff:指定从nForm位置开始的字节偏移量。 nForm:指定文件的定位方式。 nForm的取值有以下几种。 CFile:begin:文件的开始位置。 CFile:current:文件的当前位置。 C

54、File:end:文件的末尾位置。 函数的返回值是文件定位后指针的绝对位置。,8.3.4 文件的定位,SeekToBegin()函数的作用是将文件的定位指针移动到文件的开始位置,其函数原型如下: SeekToEnd()函数的作用是将文件的定位指针移动到文件的开始位置,其函数原型如下: 如果想要获取文件的定位指针所指向的位置,可以使用GetPosition()函数。GetPosition()函数的原型如下: 如果想要获取文件的大小,可以使用GetLength()函数。GetLength()函数的原型如下: 如果想要设置文件的大小,可以使用SetLength()函数。SetLength()函数的原

55、型如下:,8.3.5 文件的状态,使用CFile类的成员函数,可以对文件的状态进行相关操作。如果想要获取文件的状态,可以使用GetStatus()函数。GetStatus()函数有两种原型,第一种函数原型如下: rStatus:指向CFileStatus结构的指针。 CFileStatus结构成员如下表所示。,8.3.5 文件的状态,第二种函数原型如下: lpszFileName:指定文件名。 rStatus:指向CFileStatus结构的指针。 【示例8-31】对文件进行读写操作。,8.4 异常类,在编写程序时,往往会发生一些意想不到的错误,这些错误被称为异常(Exception)。在Vi

56、sual C+中,MFC封装了异常类CException。CException类是所有异常类的基类。,8.4.1 异常类简介,在程序执行过程中,可能会产生3种情况:正常执行、错误执行和非正常执行。 正常执行:在正常执行的情况下,函数会正常执行并返回。 错误执行:在错误执行的情况下,函数可能会在参数的传递过程中发生错误,或是在不适当的上下文中引用。 非正常执行:在非正常执行的情况下,会超过程序的控件范围,从而影响函数的执行情况。此时,所产生的非正常执行就是异常,应该将其进行捕获或是抛出。,8.4.2 文件异常操作,在进行文件操作时,经常会出现一些意外情况,如文件拒绝访问、未找到文件等,这些意外情

57、况就被称作是文件操作异常。在Visual C+中,MFC提供了专门用于处理文件操作异常的类CFileException。 CFileException类定义了3个成员变量用于描述异常原因,分别如下: m_cause:int类型,用于记录异常的原因。该成员变量的取值及其说明如表8.7所示。 m_IOsError:long类型,用于记录操作系统I/O异常原因。 m_strFileName:CString类型,用于记录出错的文件名。,8.4.3 捕获异常,在进行异常捕获时,经常使用的语句是trycatch语句。该语句的语法格式如下:,第9章 多媒体技术,多媒体技术是一种迅速发展的综合性电子信息技术,

58、它给传统的计算机系统、音频和视频设备带来了方向性的变革,将对大众传媒产生深远的影响。由于在现代人们的日常生活中,图文、音频和视频文件发挥着越来越重要的作用。在应用程序中,也经常需要处理各种各样的多媒体文件。本章主要介绍多媒体技术的使用,内容包括:图像处理技术、音频处理技术、视频处理技术。通过本章的学习,读者可以了解各种多媒体技术,而且还会对多媒体资源进行简单处理。,9.1 图像处理技术,图像是多媒体的一个重要类型,其无处不在。在Windows中,有许多的图像文件。为了方便用户查看图像内容,系统提供了Windows图片和传真查看器。在计算机中,图像以多种形式进行存储,常见的图像格式有BMP、JP

59、G、GIF和WMF等。本节介绍的图像处理技术,主要是以BMP文件为例。,9.1.1 BMP文件结构,位图(BMP)文件是Windows中采用的图形文件格式,其扩展名为bmp、dib或rle。位图实际上是一个像素点的集合,它将图像中的每个像素的颜色进行存储,所以文件本身比较大。 在Visual C+中,位图文件由4部分组成:位图文件头、位图信息头、颜色信息表和位图像素数据。下面对这4部分分别进行介绍。,1位图文件头,位图文件头主要用于识别位图文件,其数据结构如下: bfType:表示文件类型,必须为BM。 bfSize:表示文件大小。 bfReserved1:保留,必须是0。 bfReserved2:保留,必须是0 bfOffBits:表示从文件头开始到图像数据的偏移字节数。,2位图信息头,位图信息头的数据结构如下: biSize:表示结构的字节数。 biWidth:表示位图的宽度(像素数)。 biHeight:表示位图的高度(像素数)。 biPlanes:表示位面数,该参数必须设置为1。 biBitCount:表示每个像素的位数。 biCompression:表示图像数据压缩的类型。 biSizeImage:表示图像大小(字节数)。 biXPelsPerMeter

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论