第二讲wince软件开发基础old

上传人:汽*** 文档编号:577894531 上传时间:2024-08-23 格式:PPT 页数:83 大小:1.58MB
返回 下载 相关 举报
第二讲wince软件开发基础old_第1页
第1页 / 共83页
第二讲wince软件开发基础old_第2页
第2页 / 共83页
第二讲wince软件开发基础old_第3页
第3页 / 共83页
第二讲wince软件开发基础old_第4页
第4页 / 共83页
第二讲wince软件开发基础old_第5页
第5页 / 共83页
点击查看更多>>
资源描述

《第二讲wince软件开发基础old》由会员分享,可在线阅读,更多相关《第二讲wince软件开发基础old(83页珍藏版)》请在金锄头文库上搜索。

1、T01.WinCE的开发软件基础的开发软件基础Windows CE 选修课2008-10-05u推荐的资源推荐的资源1u推荐的资源推荐的资源2u推荐的资源推荐的资源3u教科书教科书4u教科教科书书5u推荐的参考书推荐的参考书6u推荐的参考书推荐的参考书7本书分为三个大部分,从本书分为三个大部分,从嵌入式系统开发嵌入式系统开发的基础开始,的基础开始,先让读者对嵌入式开发有一个大局观。接着通过一些应先让读者对嵌入式开发有一个大局观。接着通过一些应用开发让读者学习开发的基本认识,最后通过一些具有用开发让读者学习开发的基本认识,最后通过一些具有实践意义的例子来强化开发能力。本书适合对嵌入式系实践意义的

2、例子来强化开发能力。本书适合对嵌入式系统开发感兴趣的初中级读者阅读,也可供相关工程技术统开发感兴趣的初中级读者阅读,也可供相关工程技术人员作为参考用书使用。人员作为参考用书使用。采用最新的采用最新的WindowsEmbeddedCE6.0写作。全写作。全书通俗易懂,立足于书通俗易懂,立足于WindowsCE嵌入式移动领域软件嵌入式移动领域软件开发,站在入门和转型者的角度,从嵌入式系统基础开开发,站在入门和转型者的角度,从嵌入式系统基础开始,逐渐深入始,逐渐深入WindowsCE开发的一些理论,并结合相开发的一些理论,并结合相应的实践,达到应的实践,达到“喻理于境喻理于境”的效果。内容丰富,涉及

3、的效果。内容丰富,涉及嵌入式操作系统嵌入式操作系统,WindowsCE体系结构,进程与线程,体系结构,进程与线程,存储系统,开发环境与参考文档,应用编程接口,映像存储系统,开发环境与参考文档,应用编程接口,映像创建过程,创建过程,PlatformBuilderforCE6.0,定制,定制WindowsEmbeddedCE,应用程序应用程序的开发、诊断、调的开发、诊断、调试与发布,试与发布,BSP开发,开发,数据库开发数据库开发,SQLServerCompactMobile,网络与通信网络与通信,国际化与本地化,国际化与本地化,C编程基础等相关知识。编程基础等相关知识。8工程应用实践,带有身份证

4、号码工程应用实践,带有身份证号码验证系统和日历转换系统两个项目案验证系统和日历转换系统两个项目案例,帮助读者全面总结所学知识,快例,帮助读者全面总结所学知识,快速积累项目实战经验。网络互动,在速积累项目实战经验。网络互动,在线辅导。本书在希赛网和学赛网上为线辅导。本书在希赛网和学赛网上为读者提供与作者的互动活动、在线答读者提供与作者的互动活动、在线答疑、疑、源代码源代码下载等服务。超值服务。下载等服务。超值服务。购买此书即可获得购买此书即可获得1000希赛积分,希赛积分,可用于在希赛网和学赛网接受全方位可用于在希赛网和学赛网接受全方位的学习辅导,还将得到超值学习资源。的学习辅导,还将得到超值学

5、习资源。9u推荐的参考书推荐的参考书10u推荐的参考书推荐的参考书11u推荐的参考书推荐的参考书12u推荐的参考书推荐的参考书13u消息消息14WinCE的的EVBWinCE的的EVCWinCE的的APIWinCE的的MFCWinCE的的ATL15u1.窗口管理窗口管理WindowsCE支持大量的窗口样式支持大量的窗口样式,包括层叠包括层叠窗口窗口,但但WindowsCE不支持窗口的最大最小不支持窗口的最大最小化按钮化按钮不支持隐藏任务栏不支持隐藏任务栏不支持不支持MDI(多文多文档界面档界面)不支持不支持DDE.(DDE=DynamicDataExchange,是,是16位位Windows时

6、代实现不同应用程序之间互相时代实现不同应用程序之间互相交换数据和控制的技术,现在用得很少了,交换数据和控制的技术,现在用得很少了,WindowsShell外壳打开某些文件类型还用到外壳打开某些文件类型还用到DDE.)16u窗口是做什么窗口是做什么?应用程序需要应用程序需要窗口窗口.以便以便WindowsCE接收信接收信息息,同时窗口也是同时窗口也是应用程序接收用户输入信息和应用程序接收用户输入信息和显示信息的区域显示信息的区域.处理处理WindowsCE的消息传送的消息传送用的是两个最基本的函数用的是两个最基本的函数:SendMessage和和PostMessage.SendMessage采用

7、同步消息传送机制采用同步消息传送机制.而而PostMessage.采用异步消息传送机制采用异步消息传送机制.消息对列消息对列和线程是一一对应的关系和线程是一一对应的关系.而每一个都和一个特而每一个都和一个特定线程相关的消息对列联系在一起定线程相关的消息对列联系在一起.窗口是消息窗口是消息传送的目的地传送的目的地.消息对列消息对列线程线程窗口窗口窗口处窗口处理函数之间的关系是理函数之间的关系是:窗口拥有自己的线程窗口拥有自己的线程自自己的消息对列和响应的窗口处理函数己的消息对列和响应的窗口处理函数17u是是Win32程序设计中的程序设计中的Windows消息机制消息机制消息就是一个用户对电脑的消

8、息就是一个用户对电脑的请求请求。我想放。我想放CD(音乐音乐),我只能选择按鼠标或者敲键盘,于是,我只能选择按鼠标或者敲键盘,于是消息便从这里产生了。消息便从这里产生了。消息结果导致了某些特定电信号,电信号再到消息结果导致了某些特定电信号,电信号再到达计算机电路系统,系统再将信号反应到操作系达计算机电路系统,系统再将信号反应到操作系统,操作系统再将信号变成消息形式发到线程,统,操作系统再将信号变成消息形式发到线程,到线程的消息再进入消息队列排队,最终到达消到线程的消息再进入消息队列排队,最终到达消息处理函数,此时电脑就明白你的请求是什么意息处理函数,此时电脑就明白你的请求是什么意思了,再通过消

9、息处理函数进行工作思了,再通过消息处理函数进行工作.消息是发到电脑,还不如说是发到了线程消息是发到电脑,还不如说是发到了线程.18uWindows消息机制消息机制线程如何接收到消息的呢线程如何接收到消息的呢?,还得从,还得从GUI入口函数说起。入口函数说起。一个一个GUI用户程序的入口函数将不是用户程序的入口函数将不是main(),而是,而是WinMain(),原形是:,原形是:intAPIENTRYWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow)APIENTRY是是_stdcall的宏,

10、意思是用的宏,意思是用Windows标准调标准调用方式,用方式,hInstance是本身的实例句柄,是本身的实例句柄,lpCmdLine是命是命令行参数令行参数19uWindows消息机制消息机制仅仅一个仅仅一个WinMain()是不会等待消息的,我可是不会等待消息的,我可以加入一个以加入一个MessageBox();简单的弹一个窗口出来,简单的弹一个窗口出来,然后结束。然后结束。问题是我们需要先建一个窗口问题是我们需要先建一个窗口(体体)出来,建主窗口出来,建主窗口的过程比较复杂,详细的情况我们后面要看到。过的过程比较复杂,详细的情况我们后面要看到。过程大致是,先设置窗体句柄的参数,然后建立

11、窗体,程大致是,先设置窗体句柄的参数,然后建立窗体,然后注册窗体,最后刷新窗体。然后注册窗体,最后刷新窗体。ShowWindow(ghWnd,nCmdShow); /显示窗口显示窗口UpdateWindow(ghWnd);/更新窗口更新窗口完了之后这个窗体就会完了之后这个窗体就会挂挂在桌面上,等待用户发在桌面上,等待用户发消息。消息。20uWindows消息机制消息机制所以必须让主线程工作起来,同时等待消息的到达。所以必须让主线程工作起来,同时等待消息的到达。接下来就创建接下来就创建无限无限的的消息循环消息循环:代码像这样:代码像这样:MSGmsg;while(GetMessage(&msg,

12、NULL,0,0)TranslateMessage(&msg);/将虚拟键消息转为字符消息将虚拟键消息转为字符消息DispatchMessage(&msg);/处理消息处理消息这里的无限循环,不是说这段代码将一直运行,事实上这里的无限循环,不是说这段代码将一直运行,事实上GetMessage()将使这个线程挂起,只有当消息到来时再被再次激活。将使这个线程挂起,只有当消息到来时再被再次激活。21u2.菜单菜单对话框和控件对话框和控件菜单菜单对话框和控件是为用户提供的一种选对话框和控件是为用户提供的一种选择对象择对象执行命令执行命令执行输入执行输入/输出任务的标准输出任务的标准方法方法.Windo

13、wsCE支持滚动菜单在菜单超出屏幕支持滚动菜单在菜单超出屏幕时自动添加滚动箭头时自动添加滚动箭头.WindowsCE不支持菜不支持菜单栏单栏.但支持命令栏但支持命令栏,在一个控件中结合了菜单在一个控件中结合了菜单栏栏工具栏工具栏命令栏命令栏.WindowsCE支持的菜单支持的菜单对话框和控件有对话框和控件有:菜单菜单:WindowsCE支持滚动菜单支持滚动菜单级联菜单级联菜单下拉下拉菜单和弹出菜单菜单和弹出菜单.22u2.菜单菜单对话框和控件对话框和控件(续续)命令栏命令栏:WindowsCE独有独有,它结合了菜单栏它结合了菜单栏,工具栏工具栏.工具栏工具栏:WindowsCE工具栏工具栏包含

14、按扭的控件包含按扭的控件.ReBar(双栏双栏):可以重新定位可以重新定位包含一个或多个带区的容器控件包含一个或多个带区的容器控件.23u为什么我们选用为什么我们选用eVC?MFC是是Visualc+编程的核心编程的核心,在在MFC程序中程序中,我们并不经常直接调用我们并不经常直接调用WindowsAPI,而是从而是从MFC类创建对象并调用属类创建对象并调用属于这些对象的成员函数于这些对象的成员函数.也就是说也就是说MFC封装了封装了WindowsAPI.这样就使开发人员绕开复杂的这样就使开发人员绕开复杂的API函数的调用函数的调用.从而快速的进行程序开发从而快速的进行程序开发.24uMFC的

15、类的类MFC提供数百个类,最重要的、也是编写任提供数百个类,最重要的、也是编写任何何VC+应用程序都必不可少的两个类应用程序都必不可少的两个类CWinApp和和CFrameWnd,这两个类是编写复杂这两个类是编写复杂庞大应用程序的基石。庞大应用程序的基石。1.封装特性:封装特性:构成构成MFC框架的是框架的是MFC类库而类库而MFC类库又是类库又是C+的一个类库。这些类封装的一个类库。这些类封装WIN32应用程序应用程序编程接口编程接口,OLE(ObjectLinkEmbed对象链接对象链接嵌入嵌入)特性,特性,ODBC和和DAO数据访问的功能。数据访问的功能。25u继承特性继承特性MFC抽象

16、出了众多类的共同特性,并设计出抽象出了众多类的共同特性,并设计出一些基类作为实现其他类的基础,这些类中最一些基类作为实现其他类的基础,这些类中最重要的类是重要的类是CObject类和类和CCmdTarget类,程序类,程序员可以从适当的员可以从适当的MFC类中派生出自己的类,实类中派生出自己的类,实现特定的功能达到编程的目的。现特定的功能达到编程的目的。26u虚拟和消息映射虚拟和消息映射MFC是以是以C+为基础,当然支持虚函数,但为基础,当然支持虚函数,但作为一个编程框架必须要解决的是效率问题:作为一个编程框架必须要解决的是效率问题:如果如果MFC仅仅通过虚函数来支持动态约束必然仅仅通过虚函数

17、来支持动态约束必然会产生大量的虚函数表这样编程框架过于臃肿会产生大量的虚函数表这样编程框架过于臃肿而且消耗更多的内存。但是而且消耗更多的内存。但是MFC建立了消息映建立了消息映射机制这样降低了内存的使用却大大提高了效射机制这样降低了内存的使用却大大提高了效率率27u消息映射消息映射 消息映射是一个将消息和成员函数相互关联的消息映射是一个将消息和成员函数相互关联的表表,当应用程序的框架窗口接收到一个消息时当应用程序的框架窗口接收到一个消息时,MFC将搜索该窗口的消息映射将搜索该窗口的消息映射,如果存在一个处理消息如果存在一个处理消息的处理程序的处理程序,那么就调用该处理程序那么就调用该处理程序.

18、它通过宏来实现消息到成员函数的映射,而且这些它通过宏来实现消息到成员函数的映射,而且这些函数不必是虚拟的成员函数,这样不需要为消息映函数不必是虚拟的成员函数,这样不需要为消息映射函数生成一个很大的虚拟函数表射函数生成一个很大的虚拟函数表(V表表),节省内,节省内存。存。28u与桌面与桌面MFC的异同的异同 为了适应嵌入式和为了适应嵌入式和WindowsCE的要求的要求.WindowsCE中的中的MFC对桌面的作了一定的改动对桌面的作了一定的改动.增加了一些增加了一些WindowsCE特有的类特有的类,并删除了对其并删除了对其它一些类的支持它一些类的支持.WindowsCE并不支持桌面所有并不支

19、持桌面所有Windows中的类中的类,例如例如:WindowsCE中的中的MFC数据库连接中的数据库连接中的DataAccessObjects(DAO)与与OpenDatabaseConnectivity(ODBC);也不支持也不支持Multiple-DocumentInterface(MDI)多文档用户界面等等多文档用户界面等等.29uATL 什么是ATL 自从自从1993年年Microsoft首次公布了首次公布了COM技术以技术以后,后,Windows平台上的开发模式发生了巨大的变平台上的开发模式发生了巨大的变化,以化,以COM为基础的一系列软件组件化技术将为基础的一系列软件组件化技术将W

20、indows编程带入了组件化时代。广大的开发人编程带入了组件化时代。广大的开发人员在为员在为COM带来的软件组件化趋势欢欣鼓舞的同带来的软件组件化趋势欢欣鼓舞的同时,时,对于对于COM开发技术的难度和烦琐的细节也感开发技术的难度和烦琐的细节也感到极其的不便到极其的不便。COM编程一度被视为一种高不可编程一度被视为一种高不可攀的技术,令人望而却步。攀的技术,令人望而却步。开发人员希望能够有一开发人员希望能够有一种方便快捷的种方便快捷的COM开发工具,提高开发效率,更开发工具,提高开发效率,更好地利用这项技术。好地利用这项技术。30uATL(续续1) 针对这种情况,针对这种情况,Microsoft

21、公司在推出公司在推出COMSDK以后,为简化以后,为简化COM编程,提高开发效率,采编程,提高开发效率,采取了许多方案,特别是在取了许多方案,特别是在MFC(MicrosoftFoundationClass)中加入了对)中加入了对COM和和OLE的支的支持。但是随着持。但是随着Internet的发展,分布式的组件技术的发展,分布式的组件技术要求要求COM组件能够在网络上传输,而又尽量节约组件能够在网络上传输,而又尽量节约宝贵的网络带宽资源。采用宝贵的网络带宽资源。采用MFC开发的开发的COM组件组件由于种种限制不能很好地满足这种需求,因此由于种种限制不能很好地满足这种需求,因此Microsof

22、t在在1995年又推出了一种全新的年又推出了一种全新的COM开发开发工具工具ATL。31uATL(续续2) ATL是是ActiveXTemplateLibrary的缩写,它的缩写,它是一套是一套C+模板库。使用模板库。使用ATL能够快速地开发出高能够快速地开发出高效、简洁的代码(效、简洁的代码(EffectiveandSlimcode),),同时对同时对COM组件的开发提供最大限度的代码自动组件的开发提供最大限度的代码自动生成以及可视化支持。为了方便使用,从生成以及可视化支持。为了方便使用,从MicrosoftVisualC+5.0版本开始,版本开始,Microsoft把把ATL集成到集成到V

23、isualC+开发环境中。开发环境中。1998年年9月推月推出的出的VisualStudio6.0集成了集成了ATL3.0版本。目前,版本。目前,ATL已经成为已经成为Microsoft标准开发工具中的一个重标准开发工具中的一个重要成员,日益受到要成员,日益受到C+开发人员的重视。开发人员的重视。32uATL(续续3) 作为作为ATL最核心的实现技术的模板是对标准最核心的实现技术的模板是对标准C+语言的扩展,但是在大多数的语言的扩展,但是在大多数的C+编程环境中,编程环境中,人们很少使用它,这是因为模板的功能虽然很强,人们很少使用它,这是因为模板的功能虽然很强,但是它内部机制比较复杂,需要比较

24、多的但是它内部机制比较复杂,需要比较多的C+知识知识和经验才能灵活地使用它。在和经验才能灵活地使用它。在MFC中的中的CObjectArray等功能类就是由模板来定义的。完等功能类就是由模板来定义的。完全通过模板来定义程序的整体类结构,全通过模板来定义程序的整体类结构,ATL是迄今是迄今为止做得最为成功的。为止做得最为成功的。33uATL(续续3) 所谓模板类简单地说是对类的抽象。我所谓模板类简单地说是对类的抽象。我们知道们知道C+语言用类定义了构造对象语言用类定义了构造对象(这里指这里指C+对象而不是对象而不是COM对象对象)的方式,对象是的方式,对象是类的实例,而模板类定义的是类的构造方式

25、,类的实例,而模板类定义的是类的构造方式,使用模板类定义实例化的结果产生的是不同使用模板类定义实例化的结果产生的是不同的类。因此可以说模板类是的类。因此可以说模板类是“类的类类的类”。34u.NETCompactFramework 微软给出的微软给出的.NETFramework概念。概念。.NETFramework是是Microsoft为开发应用程序创为开发应用程序创建的个富有革命性的新平台。建的个富有革命性的新平台。这句话最有趣的地方是它的含糊不清,但这是有这句话最有趣的地方是它的含糊不清,但这是有原因的。原因的。1)注意这句话没有说)注意这句话没有说在在Windows操作系统上开操作系统上

26、开发应用程序发应用程序。尽管。尽管.NETFramework发布的第一个发布的第一个版本是运行在版本是运行在Windows操作系统上,但是以后将操作系统上,但是以后将推出运行在其它操作系统上的版本,这些操作系统推出运行在其它操作系统上的版本,这些操作系统包括包括FreeBSD,LinuxMacintosh,甚至个人数字,甚至个人数字助手类设备。(可移植性)助手类设备。(可移植性)35u.NETCompactFramework 2).NETFramework定义并没有限制应用定义并没有限制应用程序的类型。程序的类型。.NETFramework可以创建可以创建Windows应用程序、应用程序、We

27、b应用程序、应用程序、Web服务和其他各种类型的应用程序。服务和其他各种类型的应用程序。36u.NETCompactFramework 什么是什么是Microsoft.NETCompactFramework?Microsoft.NETCompactFramework是针对是针对Microsoft.NET计划的智能设备开发框架,是实计划的智能设备开发框架,是实现现Microsoft随时随地在任何设备上为客户提供良随时随地在任何设备上为客户提供良好体验的目标的关键所在。好体验的目标的关键所在。.NETCompactFramework将托管代码和将托管代码和Web服务带给了智能服务带给了智能设备,它

28、允许安全的、可下载的应用程序在诸如个设备,它允许安全的、可下载的应用程序在诸如个人数字助理人数字助理(PDA)、移动电话和机顶盒等设备上运、移动电话和机顶盒等设备上运行。行。37公共语言运行时公共语言运行时(库库)CLR(CommonLanguageRuntime)公共语公共语言运行时是整个言运行时是整个.netframework构建的基础构建的基础,是实现,是实现.Net跨平台,跨语言,代码安全等跨平台,跨语言,代码安全等核心特性的关键。核心特性的关键。CLR和和Java虚拟机一样也是一个运行时环境,虚拟机一样也是一个运行时环境,它负责资源管理(内存分配和垃圾收集),它负责资源管理(内存分配

29、和垃圾收集),并保证应用和底层操作系统之间必要的分离。并保证应用和底层操作系统之间必要的分离。38公共语言运行时公共语言运行时公共语言运行时是公共语言运行时是.NETCompactFramework的基础的基础.公共语言运行库是公共语言运行库是.netframework的基础。的基础。它运行代码并提供使开发过程更轻松的服务。它运行代码并提供使开发过程更轻松的服务。托管代码托管代码:以公共语言运行库为目标的代以公共语言运行库为目标的代码称为托管代码。(以码称为托管代码。(以.net为基础)为基础)clr功能:功能:1.管理内存管理内存2。线程执行。线程执行。39公共语言运行时公共语言运行时托管执

30、行过程:选择编译器。把代码编译为中间语托管执行过程:选择编译器。把代码编译为中间语言(言(msil)。将)。将msil编译为本机代码。运行代码。编译为本机代码。运行代码。microsoft中间语言(中间语言(msil)一组可以有效的转换为本机代码且独立于一组可以有效的转换为本机代码且独立于cpu的指的指令。令。当编译为托管代码时,编译器将源代码翻译为当编译为托管代码时,编译器将源代码翻译为microsoft中间语言(中间语言(msil)。)。40在编程时,变量、函数的命名是一个极在编程时,变量、函数的命名是一个极其重要的问题。好的命名方法使变量易于其重要的问题。好的命名方法使变量易于记忆且程序

31、可读性大大提高。记忆且程序可读性大大提高。Microsoft采用匈牙利命名法来命名采用匈牙利命名法来命名WindowsAPI函数和变量。匈牙利命名法是由函数和变量。匈牙利命名法是由Microsoft的著名开发人员、的著名开发人员、Excel的主要的主要设计者查尔斯设计者查尔斯西蒙尼在他的博士论文中西蒙尼在他的博士论文中提出来的,由于西蒙尼的国籍是匈牙利,提出来的,由于西蒙尼的国籍是匈牙利,所以这种命名法叫匈牙利命名法。所以这种命名法叫匈牙利命名法。匈牙利命名法为匈牙利命名法为C标识符的命名定义了标识符的命名定义了一种非常标准化的方式,这种命名方式是一种非常标准化的方式,这种命名方式是以两条规则

32、为基础:以两条规则为基础:匈牙利命名法匈牙利命名法41标识符的名字以一个或者多个小写字标识符的名字以一个或者多个小写字母开头,用这些字母来指定数据类型。母开头,用这些字母来指定数据类型。在标识符内,前缀以后就是一个或者在标识符内,前缀以后就是一个或者多个第一个字母大写的单词,这些单词清多个第一个字母大写的单词,这些单词清楚地指出了源代码内那个对象的用途。比楚地指出了源代码内那个对象的用途。比如,如,m_szStudentName表示一个学生名表示一个学生名字的类成员变量,数据类型是字符串型。字的类成员变量,数据类型是字符串型。42Windows类型类型样本变量样本变量HWND(窗口句柄窗口句柄

33、)hWnd;HANDLE(对象句柄对象句柄)hI Instance;HI ICON (图标句柄图标句柄)hI Icon;43一般前缀命名规范一般前缀命名规范前缀前缀类型类型实例实例C类或结构类或结构CDocument,CPrintInfoS结构体结构体SAddressM成员变量成员变量m_pDoc,m_nCustomers44前缀前缀类型类型描述描述实例实例cchar8位字符位字符cGradestrstring字符型字符型strNamechTCHAR如果如果_UNICODE定义,定义,chName则为则为16位字符位字符bBOOL布尔值布尔值bEnablen,iint整型整型(其大小依赖于操作

34、系统)(其大小依赖于操作系统)nLength变量命名规范变量命名规范45前缀前缀类型类型描述描述实例实例sishortint短整型短整型siSequnUINT无符号值(其大小依赖于操作系统)无符号值(其大小依赖于操作系统)nHeightwWORD16位无符号值位无符号值wPosffloat浮点型浮点型fRadiusddouble双精度型双精度型dArea变量命名规范变量命名规范46前缀前缀类型类型描述描述实例实例llong长整型长整型lOffsetldlongdouble长双精度型长双精度型ldRatedwDWORD32位无符号整型位无符号整型dwRangep*指针指针pDoclpFAR*远指

35、针远指针lpszNamelpszLPSTR32位字符串指针位字符串指针lpszName47前缀前缀类型类型描述描述实例实例lpszLPCSTR32位常量字符串指针位常量字符串指针lpszNamelpszLPCTSTR如果如果_UNICODE定义定义lpszName则为则为32位常量字符串指针位常量字符串指针hhandleWindows对象句柄对象句柄hWndIf输入文件流输入文件流ifDataFileOf输出文件流输出文件流ofStuFilesz以以“0”结束的字符串结束的字符串szAppName48一般一般49ANSIC中的数据类型声明中的数据类型声明charcharintintfloatf

36、loatdoubledoubleSingle-precisionfloatingpointDouble-precisionfloatingpointasinglebyte-holdingonecharacterinteger以上是基本数据类型以上是基本数据类型.构造类型有构造类型有:结构体类型结构体类型(struct)共同体共同体(联合体联合体)类型类型(union)和枚举类型和枚举类型.指针类型指针类型(char*str=IloveChina)(char*szAppTitle=WindowsAPI窗口程序窗口程序;)什么是匈牙利命名法什么是匈牙利命名法?50关于关于(unsignedchar

37、*)强制声明强制声明请同学看一下两种宏定义请同学看一下两种宏定义:哪一个更合适哪一个更合适?#include#include#definecom8155XBYTE0x2100#definecom8155(unsignedchar*)XBYTE0x2100#definecom8155(unsignedcharvolatile*)XBYTE0x210051关于关于(unsignedchar*)强制声明强制声明请同学看一下两种宏定义请同学看一下两种宏定义:哪一个是正确哪一个是正确?#include#include#definecom8155XBYTE0x2100#definepa8155XBYTE0

38、x2101#definepb8155XBYTE0x210252关于关于(unsignedchar*)声明声明#include#include#definecom8155(unsignedchar*)XBYTE0x2100#definepa8155(unsignedchar*)XBYTE0x2101#definepb8155(unsignedchar*)XBYTE0x2102我们尽可能选择这种描述形式我们尽可能选择这种描述形式#definecom8155(unsignedcharvolatile*)XBYTE0x210053函数的声明函数的声明如果我们用编译环境提供的联机打开文件如果我们用编译环

39、境提供的联机打开文件(opendocument)的功能我们可以看到的功能我们可以看到#ifndef_ABSACC_H_#define_ABSACC_H_#defineCBYTE(unsignedcharvolatilecode*)0)#defineDBYTE(unsignedcharvolatiledata*)0)#definePBYTE(unsignedcharvolatilepdata*)0)#defineXBYTE(unsignedcharvolatilexdata*)0)#defineCWORD(unsignedintvolatilecode*)0)#defineDWORD(unsig

40、nedintvolatiledata*)0)54uSee this The tow The tow componetscomponets can be placed in a structure can be placed in a structure declared like thisdeclared like thisstructstructpointpoint floatx;floatx;floatyfloaty;; ;uStructure user defined data typeAstructureisaAstructureisa collectioncollection ofo

41、foneormorevariableoneormorevariable,possiblyof,possiblyofdifferenttype,differenttype,groupedtogetherundergroupedtogetherunderasinglenameasinglenameconvenientconvenienthandling.handling.structstructpointpoint floatx;floatx;floatyfloaty; ;New Data TypeNew Data Type新数据类型新数据类型新数据类型新数据类型uStructure-how to

42、 declarationstructstructPointPoint doublex;doublex;doubley;doubley;doublez;doublez;structstructstructure_tagstructure_tag Structure-members;Structure-members; ;DeclarationDeclarationstructstructLineLine structstructPointPointStartPointStartPoint; ;structstructPointPointEndPointEndPoint; ; ; 保留字保留字保留

43、字保留字结构体名称结构体名称结构体名称结构体名称这样我们就指定了一个这样我们就指定了一个这样我们就指定了一个这样我们就指定了一个结构体类型,它相当一个结构体类型,它相当一个结构体类型,它相当一个结构体类型,它相当一个模版,其中无具体的数据,模版,其中无具体的数据,模版,其中无具体的数据,模版,其中无具体的数据,也不分配内存。为了使用也不分配内存。为了使用也不分配内存。为了使用也不分配内存。为了使用结构体类型。应定义结构结构体类型。应定义结构结构体类型。应定义结构结构体类型。应定义结构体类型的变量体类型的变量体类型的变量体类型的变量uStructure-who is new typestruct

44、structstructure_tagstructure_tagstructstructstructure_tagstructure_tag Structure-members;Structure-members; ;DeclarationDeclaration保留字保留字保留字保留字结构体名称结构体名称结构体名称结构体名称structstructLineLinestructstruct pointpoint新数据类型新数据类型新数据类型新数据类型IntInt floatfloat结构体成员结构体成员结构体成员结构体成员TypeTypevariableNamevariableName; ;in

45、tintage;age;uStructure-type size(大小)structstructPointPoint doublex;doublex;doubley;doubley;doublez;doublez;doublexdoublexdoubleydoubleydoublezdoublez6464位位位位6464位位位位6464位位位位64+64+6464+64+64位位位位=8*3=24=8*3=24字节字节字节字节uExamplesstructstructStudentStudent intint Code;Code;/* /*学号学号学号学号* */ /charName20;ch

46、arName20;/* /*姓名姓名姓名姓名* */ /charSex;charSex;/* /*性别性别性别性别* */ /unsignedunsignedintintAge;Age;/* /*年龄年龄年龄年龄* */ /; ; uStructure-members(结构体成员变量)类的定义类的定义类是一种用户自定义的数据类型,它的一般定义格类是一种用户自定义的数据类型,它的一般定义格式如下:式如下:classprivate:;protected:;public:;u类和结构结构是类的一种特例,在结构中也可以定义成员函数。定义结构时只要把关键字class改为struct即可。u结构体-类的雏

47、形class是定义类的关键字。是定义类的关键字。是一个标识符是一个标识符(句柄句柄),用于惟一标识一个类。一对大括号内是类的,用于惟一标识一个类。一对大括号内是类的说明部分,说明该类的所有成员。类的成员包括数据说明部分,说明该类的所有成员。类的成员包括数据成员和成员函数两部分。类的成员从访问权限上分有成员和成员函数两部分。类的成员从访问权限上分有以下三类:公有的(以下三类:公有的(public)、)、私有的(私有的(private)和保护的(和保护的(protected),),其中默认为其中默认为private权限。权限。说明为公有的成员可以被程序中的任何代码访问;说说明为公有的成员可以被程序

48、中的任何代码访问;说明为私有的成员只能被类本身的成员函数及友元类的明为私有的成员只能被类本身的成员函数及友元类的成员函数访问,其他类的成员函数,包括其派生类的成员函数访问,其他类的成员函数,包括其派生类的成员函数都不能访问它们;说明为保护的成员与私有成员函数都不能访问它们;说明为保护的成员与私有成员类似,只是除了类本身的成员函数和说明为友元成员类似,只是除了类本身的成员函数和说明为友元类的成员函数可以访问保护成员外,该类的派生类的类的成员函数可以访问保护成员外,该类的派生类的成员也可以访问。成员也可以访问。uStructures Variables(结构体变量)三种方法三种方法三种方法三种方法

49、structstructPointPoint doublex;doublex;doubley;doubley;doublez;doublez;oPoint1,oPoint2;oPoint1,oPoint2;structstructPointPoint doublex;doublex;doubley;doubley;doublez;doublez;structstructPointoPoint1;PointoPoint1;structstructPointoPoint2;PointoPoint2;structstruct d doubleoublex;x;doubley;doubley;doub

50、lez;doublez;oPoint2,oPoint2;oPoint2,oPoint2; 先声明结构体类型先声明结构体类型先声明结构体类型先声明结构体类型再定义变量名再定义变量名再定义变量名再定义变量名( (实例或对象实例或对象实例或对象实例或对象) ) 声明结构体类型同时声明结构体类型同时声明结构体类型同时声明结构体类型同时定义变量名定义变量名定义变量名定义变量名( (实例或对象实例或对象实例或对象实例或对象) ) 直接定义结构体直接定义结构体直接定义结构体直接定义结构体类型变量名类型变量名类型变量名类型变量名( (实例或对象实例或对象实例或对象实例或对象) ) 指定了一个结构体类型,指定了

51、一个结构体类型,指定了一个结构体类型,指定了一个结构体类型,它相当一个模版,其中无具它相当一个模版,其中无具它相当一个模版,其中无具它相当一个模版,其中无具体的数据,也不分配内存。体的数据,也不分配内存。体的数据,也不分配内存。体的数据,也不分配内存。为了使用结构体类型。应定为了使用结构体类型。应定为了使用结构体类型。应定为了使用结构体类型。应定义结构体类型的变量义结构体类型的变量义结构体类型的变量义结构体类型的变量uVariables initialized(变量初始化)structstructPointPoint doublex;doublex;doubley;doubley;double

52、z;doublez;oPoint1=20.0,10,0;oPoint1=20.0,10,0;structstructPointPoint doublex;doublex;doubley;doubley;doublez;doublez;structstructPointPointoPoint1=20.0,10,oPoint1=20.0,10,0 0;(;(标记红在一行标记红在一行标记红在一行标记红在一行) )structstruct doublex;doublex;doubley;doubley;doublez;doublez;oPoint1oPoint1=20.0,10,0;=20.0,10,

53、0;AstructurecanbeinitializedbyfollowingitsdefinitionwithalistAstructurecanbeinitializedbyfollowingitsdefinitionwithalistofofinitializers,eachinitializers,eachaconstantexpression.aconstantexpression.AnautomaticstructuremayalsobeinitializedbyassignmentorAnautomaticstructuremayalsobeinitializedbyassign

54、mentorbycallingafunctionthatreturnsstructureoftherighttype.bycallingafunctionthatreturnsstructureoftherighttype.uVariables initialized(变量初始化)structstructLineLine intintidid;structstructPointPoint StartPointStartPoint; ;Line1=1,2,3,10;Line1=1,2,3,10; 对于复杂结构体变量的初始化如下,对结构体成员变量依次初始化例如:对于复杂结构体变量的初始化如下,对结

55、构体成员变量依次初始化例如:对于复杂结构体变量的初始化如下,对结构体成员变量依次初始化例如:对于复杂结构体变量的初始化如下,对结构体成员变量依次初始化例如:structstructPointPoint intintx;x;intinty;y;intintz;z;Voidmain()Voidmain()/str_1.c/str_1.c printf(“%dprintf(“%d%d%d%d%d %d%d”,”,Line1.id,Line1.startpoint.x,Line1.id,Line1.startpoint.x,Line1.startpoint.y,Line1.startpoint.z)L

56、ine1.startpoint.y,Line1.startpoint.z); ; 输出输出输出输出:12310:12310指定了一个结构体类型,它指定了一个结构体类型,它指定了一个结构体类型,它指定了一个结构体类型,它相当一个模版,其中无具体的数相当一个模版,其中无具体的数相当一个模版,其中无具体的数相当一个模版,其中无具体的数据,也不分配内存。为了使用结据,也不分配内存。为了使用结据,也不分配内存。为了使用结据,也不分配内存。为了使用结构体类型。应定义结构体类型的构体类型。应定义结构体类型的构体类型。应定义结构体类型的构体类型。应定义结构体类型的变量变量变量变量u例1:# #include”

57、stdio.hinclude”stdio.h”/whg_1.c/whg_1.cstructstruct wangxiaowangxiao intintx;x;floaty;floaty; whgwhg=3,8.5;=3,8.5;voidmain()voidmain() clrscrclrscr();(); 输出输出输出输出:38.500000:38.500000Printf(%dPrintf(%d%f”,whg.x,whg.yf”,whg.x,whg.y) )u例2:变量初始没有赋值的缺省为0# #include”stdio.hinclude”stdio.h”/whg_2.c/whg_2.cs

58、tructstruct wangxiaowangxiao intintx;x;intinty;y;intintz;z; whgwhg=3,8;=3,8;voidmain()voidmain() clrscrclrscr();();Printf(%dPrintf(%d%d%”,%d%”,whg.x,whg.y,whg.zwhg.x,whg.y,whg.z) ) 输出输出输出输出:380:380u例3:变量初始分别赋值# #include”stdio.hinclude”stdio.h” ”号号号号 /whg_3.c/whg_3.cstructstruct wangxiaowangxiao inti

59、ntx;x;floaty;floaty; whgwhg; ;voidmain()voidmain() Whg.xWhg.x=3;=3;Whg.yWhg.y=4.2;=4.2;Printf(%dPrintf(%d%f”,whg.x,whg.yf”,whg.x,whg.y) 输出输出输出输出:34.200000:34.200000u指针变量作函数参数指针变量作函数参数例例1:输入输入a和和b两个整数两个整数,按先大后小的顺序输出按先大后小的顺序输出a和和b.swap(int*p1,int*p2)intp;P=*p1;*p1=*p2;*p2=p;voidmain()inta,b;int*pointe

60、r1,*pointer2;Scanf(“%d,%d”,&a,&b);pointer1=&a;pointer2=&b;If(ay)z=x;elsez=y;returnz;72u指针变量指向函数指针变量指向函数main()intmax(int,int)int(*p)();/声明声明inta,b,c;p=max;/赋值赋值(地址值地址值)scanf(“%d,%d”,&a,&b);c=(*p)(a,b);指针调用指针调用(调用函数的起始地址调用函数的起始地址)/引用引用printf(“a=%d,b=%d,max=%d”,a,b,c);int(*p)()表示定义了一个指向函数的指针变量表示定义了一个指向

61、函数的指针变量(指针类型指针类型)它不是固定指向哪一个函数的它不是固定指向哪一个函数的,而只是表示定义了这样的一而只是表示定义了这样的一个变量个变量.它是专门用来存放函数入口地址的它是专门用来存放函数入口地址的.在程序中把哪一在程序中把哪一个函数的地址赋给它个函数的地址赋给它,它就指向哪一个函数它就指向哪一个函数,在一个程序中在一个程序中,一个指针变量可以先后指向不同的函数一个指针变量可以先后指向不同的函数.73u什么是句柄什么是句柄?句柄是句柄是Windows编程中的一个重要元编程中的一个重要元素素.它是一个被用来标识应用程序或对象它是一个被用来标识应用程序或对象如窗口如窗口菜单菜单设备设备

62、文件等唯一文件等唯一整数整数.可一将它理解为一个指向一个类的可一将它理解为一个指向一个类的指针指针.用户必须通过某种方式来创建句柄用户必须通过某种方式来创建句柄.在使用完毕后将其撤消在使用完毕后将其撤消,以收回资源以收回资源.在在Windows编程中会用到大量的句柄编程中会用到大量的句柄.如如HINSTANCE(实例句柄实例句柄)HWND(窗口句窗口句柄柄)HDC(设备句柄设备句柄)HANDLE(通用通用句柄句柄)等等.74u结构和类的唯一区别是:在未指定访问权限时,结构中的成员被默认为公有在未指定访问权限时,结构中的成员被默认为公有的而类中的成员被默认为私有的。在所有其他方面,的而类中的成员

63、被默认为私有的。在所有其他方面,类和结构等价。类和结构等价。例如:例如:structSintX;/公有的公有的.classCintX;/私有的私有的.尽管类和结构是等价的,但一般在描述数据时使用结构,在描述数据及对数据的操作时用类。u类和结构(内联函数)定义类的函数成员的格式如下:定义类的函数成员的格式如下:返回类型返回类型类名类名:成员函数名(参数说明)成员函数名(参数说明)函数体函数体类的成员函数对类的数据成员进行操作,类的成员函数对类的数据成员进行操作,成员函数的定义体可以在类的定义体中,如例成员函数的定义体可以在类的定义体中,如例2所示。所示。u类的成员函数例2:类中的成员函数在类定义

64、中直接描述示例。classLocationpublic:voidinit(intx,inty)X=x;Y=y;private:intX,Y;public:intGetX()returnX;intGetY()returnX;u内联函数(inline)类的成员函数也可以另外定义,而在类定类的成员函数也可以另外定义,而在类定义时给出函数头。义时给出函数头。例例的成员函数可说明如下:的成员函数可说明如下:inlinevoidLocation:init(intx,inty)X=x;Y=y;/将将x,y的值分别赋给的值分别赋给X,YinlineintLocation:GetX()returnX;inlin

65、eintLocation:GetY()returnY;用用inline作显示声明作显示声明通常省略通常省略函数的声明函数的声明#include/SFRdeclarationsvoiddelay(unsignedint);/(unsignedintcount);sbitled=P10;voidmain(void)while(1)delay(5000);led=!led;voiddelay(unsignedintcount)unsignedintj;for(j=0;jcount;j+);79函数的声明函数的声明声明延时函数声明延时函数:voiddelay(unsignedint);/(unsign

66、edintcount);声明消息处理函数声明消息处理函数LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);LRESULT是什么是什么?在微软在微软VC中提供的头文件中定义中提供的头文件中定义(include目录目录)例例:Winnt.h中中typedeflongLONGWindef.h中中typedefLONGLRESULT80函数的声明函数的声明CALLBACK是是VC+(MFC)中的回调函数的固定类型中的回调函数的固定类型WndProc消息处理函数名消息处理函数名括号内的是函数要传送的参数括号内的是函数要传送的参数(数据类型数据类型)下面给出了几个下面给出了几个VC+(MFC)中数据类型中数据类型HWND窗口句柄窗口句柄UINT无符号整型无符号整型WPARAM消息参数消息参数LPARAM消息参数消息参数WINAPI调用系统函数的固定类型调用系统函数的固定类型在在VC+开发环境中开发环境中,可以利用可以利用gotodefinition功能来功能来查看对应的数据类型查看对应的数据类型81u消息消息lpClassName, 消息消息82

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号