wince软件开发基础.ppt_第1页
wince软件开发基础.ppt_第2页
wince软件开发基础.ppt_第3页
wince软件开发基础.ppt_第4页
wince软件开发基础.ppt_第5页
已阅读5页,还剩80页未读 继续免费阅读

下载本文档

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

文档简介

T01. WinCE的开发软件基础,Windows CE 选修课,2008-10-05,1,推荐的资源,2,推荐的资源,3,推荐的资源,4,教科书,5,教科书,6,推荐的参考书,7,推荐的参考书,8,本书分为三个大部分,从嵌入式系统开发的基础开始,先让读者对嵌入式开发有一个大局观。接着通过一些应用开发让读者学习开发的基本认识,最后通过一些具有实践意义的例子来强化开发能力。本书适合对嵌入式系统开发感兴趣的初中级读者阅读,也可供相关工程技术人员作为参考用书使用。 采用最新的Windows Embedded CE6.0写作。全书通俗易懂,立足于Windows CE嵌入式移动领域软件开发,站在入门和转型者的角度,从嵌入式系统基础开始,逐渐深入Windows CE开发的一些理论,并结合相应的实践,达到“喻理于境”的效果。内容丰富,涉及嵌入式操作系统,Windows CE体系结构,进程与线程,存储系统,开发环境与参考文档,应用编程接口,映像创建过程,Platform Builder for CE 6.0,定制Windows Embedded CE,应用程序的开发、诊断、调试与发布,BSP开发,数据库开发,SQL Server Compact Mobile,网络与通信,国际化与本地化,C编程基础等相关知识。,9,工程应用实践,带有身份证号码验证系统和日历转换系统两个项目案例,帮助读者全面总结所学知识,快速积累项目实战经验。网络互动,在线辅导。本书在希赛网和学赛网上为读者提供与作者的互动活动、在线答疑、源代码下载等服务。超值服务。购买此书即可获得1000希赛积分,可用于在希赛网和学赛网接受全方位的学习辅导,还将得到超值学习资源。,10,推荐的参考书,11,推荐的参考书,12,推荐的参考书,(美)佩措尔德 著,方敏,张胜,梁路平,赵勇 等译 /2010-09-01/清华大学出版社,本书是一本经典的Windows编程圣经,涵盖基础知识和中高级主题,全面地介绍了Windows程序设计所涉及的细枝末节,旨在帮助读者从高屋见瓴(ling)的角度,建立完整的知识体系,为以后的职业生涯奠定良好的基础。.,13,推荐的参考书,14,推荐的参考书,15,消息,16,C语言程序设计 C+程序设计 VC+程序设计 .NET程序设计 Windows操作系统,Wince的课程背景,17,WinCE的EVB WinCE的EVC WinCE的API WinCE的MFC WinCE的ATL 在讨论上面软件先了解下面几个概念:,Wince涉及的软件,18,窗口管理,Windows CE支持大量的窗口样式,包括层叠窗口, 但Windows CE不支持窗口的最大最小化按钮不支持隐藏任务栏不支持MDI(多文档界面)不支持DDE. (DDE = Dynamic Data Exchange,是 16 位 Windows 时代实现不同应用程序之间互相交换数据和控制的技术,现在用得很少了,Windows Shell 外壳打开某些文件类型还用到 DDE.),19,窗口是做什么?,应用程序需要窗口.以便Windows CE接收信息,同时窗口也是应用程序接收用户输入信息和显示信息的区域.处理Windows CE的消息传送用的是两个最基本的函数: SendMessage和PostMessage. SendMessage采用同步消息传送机制.而 PostMessage.采用异步消息传送机制.消息对列和线程是一一对应的关系.而每一个都和一个特定线程相关的消息对列联系在一起.窗口是消息传送的目的地.消息对列线程窗口窗口处理函数之间的关系是:窗口拥有自己的线程自己的消息对列和响应的窗口处理函数,20,是Win32程序设计中的Windows消息机制,消息就是一个用户对电脑的请求。我想放CD(音乐),我只能选择按鼠标或者敲键盘,于是消息便从这里产生了。 消息结果导致了某些特定电信号,电信号再到达计算机电路系统,系统再将信号反应到操作系统,操作系统再将信号变成消息形式发到线程,到线程的消息再进入消息队列排队,最终到达消息处理函数,此时电脑就明白你的请求是什么意思了,再通过消息处理函数进行工作. 消息是发到电脑,还不如说是发到了线程 .,21,Windows消息机制,线程如何接收到消息的呢?,还得从GUI入口函数说起。 一个GUI用户程序的入口函数将不是main(),而是WinMain(),原形是: int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) APIENTRY是_stdcall的宏,意思是用Windows标准调用方式,hInstance是本身的实例句柄,lpCmdLine是命令行参数,22,Windows消息机制,仅仅一个WinMain()是不会等待消息的,我可以加入一个MessageBox();简单的弹一个窗口出来,然后结束。 问题是我们需要先建一个窗口(体)出来,建主窗口的过程比较复杂,详细的情况我们后面要看到。过程大致是,先设置窗体句柄的参数,然后建立窗体,然后注册窗体,最后刷新窗体。 ShowWindow(ghWnd,nCmdShow); /显示窗口 UpdateWindow(ghWnd); /更新窗口 完了之后这个窗体就会挂在桌面上,等待用户发消息。,23,Windows消息机制,所以必须让主线程工作起来,同时等待消息的到达。 接下来就创建无限的消息循环: 代码像这样: MSG msg; while(GetMessage( /处理消息 这里的无限循环,不是说这段代码将一直运行,事实上GetMessage()将使这个线程挂起,只有当消息到来时再被再次激活。,24,菜单对话框和控件,菜单对话框和控件是为用户提供的一种选择对象执行命令 执行输入/输出任务的标准方法. Windows CE支持滚动菜单在菜单超出屏幕时自动添加滚动箭头. Windows CE不支持菜单栏.但支持命令栏,在一个控件中结合了菜单栏工具栏命令栏. Windows CE支持的菜单对话框和控件有: 菜单: Windows CE支持滚动菜单级联菜单下拉菜单和弹出菜单.,25,菜单对话框和控件(续),命令栏: Windows CE独有,它结合了菜单栏,工具栏. 工具栏: Windows CE工具栏包含按扭的控件. ReBar(双栏): 可以重新定位包含一个或多个带区的容器控件.,26,为什么我们选用eVC (vs2005)?,MFC是Visual c+编程的核心, 在MFC程序中,我们并不经常直接调用Windows API,而是从MFC类创建对象并调用属于这些对象的成员函数.也就是说MFC封装了Windows API . 这样就使开发人员绕开复杂的API函数的调用.从而快速的进行程序开发.,27,MFC的类,MFC提供数百个类,最重要的、也是编写任何VC+.net应用程序都必不可少的两个类CWinApp和CFrameWnd,这两个类是编写复杂庞大应用程序的基石。 1.封装特性: 构成MFC框架的是MFC类库而MFC类库又是C+的一个类库。这些类封装WIN32应用程序编程接口,OLE(Object Link Embed 对象链接嵌入)特性,ODBC和DAO数据访问的功能。,28,继承特性,MFC抽象出了众多类的共同特性,并设计出一些基类作为实现其他类的基础,这些类中最重要的类是CObject类和CCmdTarget类,程序员可以从适当的MFC类中派生出自己的类,实现特定的功能达到编程的目的。,29,虚拟和消息映射,MFC是以C+为基础,当然支持虚函数,但作为一个编程框架必须要解决的是效率问题:如果MFC仅仅通过虚函数来支持动态约束必然会产生大量的虚函数表这样编程框架过于臃肿而且消耗更多的内存。但是MFC建立了消息映射机制这样降低了内存的使用却大大提高了效率,30,消息映射,消息映射是一个将消息和成员函数相互关联的表,当应用程序的框架窗口接收到一个消息时,MFC将搜索该窗口的消息映射,如果存在一个处理消息的处理程序,那么就调用该处理程序. 它通过宏来实现消息到成员函数的映射,而且这些函数不必是虚拟的成员函数,这样不需要为消息映射函数生成一个很大的虚拟函数表(V表),节省内存。,31,与桌面MFC的异同,为了适应嵌入式和Windows CE的要求. Windows CE 中的MFC对桌面的作了一定的改动.增加了一些Windows CE 特有的类,并删除了对其它一些类的支持. Windows CE并不支持桌面所有Windows中的类,例如: Windows CE中的MFC数据库连接中的Data Access Objects(DAO)与Open Database Connectivity(ODBC);也不支持Multiple-Document Interface(MDI)多文档用户界面等等.,32,ATL,什么是ATL 自从1993年Microsoft首次公布了COM技术以后,Windows平台上的开发模式发生了巨大的变化,以COM为基础的一系列软件组件化技术将Windows编程带入了组件化时代。广大的开发人员在为COM带来的软件组件化趋势欢欣鼓舞的同时,对于COM开发技术的难度和烦琐的细节也感到极其的不便。COM编程一度被视为一种高不可攀的技术,令人望而却步。开发人员希望能够有一种方便快捷的COM开发工具,提高开发效率,更好地利用这项技术。,33,ATL(续1),针对这种情况,Microsoft公司在推出COM SDK以后,为简化COM编程,提高开发效率,采取了许多方案,特别是在MFC(Microsoft Foundation Class)中加入了对COM和OLE的支持。但是随着Internet的发展,分布式的组件技术要求COM组件能够在网络上传输,而又尽量节约宝贵的网络带宽资源。采用MFC开发的COM组件由于种种限制不能很好地满足这种需求,因此Microsoft在1995年又推出了一种全新的COM开发工具ATL。,34,ATL (续2),ATL是ActiveX Template Library 的缩写,它是一套C+模板库。使用ATL能够快速地开发出高效、简洁的代码(Effective and Slim code),同时对COM组件的开发提供最大限度的代码自动生成以及可视化支持。为了方便使用,从Microsoft Visual C+ 5.0版本开始,Microsoft把ATL集成到Visual C+开发环境中。1998年9月推出的Visual Studio 6.0 集成了ATL 3.0版本。目前,ATL已经成为Microsoft标准开发工具中的一个重要成员,日益受到C+开发人员的重视。,35,ATL (续3),作为ATL最核心的实现技术的模板是对标准C+语言的扩展,但是在大多数的C+编程环境中,人们很少使用它,这是因为模板的功能虽然很强,但是它内部机制比较复杂,需要比较多的C+知识和经验才能灵活地使用它。在MFC中的CObjectArray等功能类就是由模板来定义的。完全通过模板来定义程序的整体类结构,ATL是迄今为止做得最为成功的。,36,ATL (续3),所谓模板类简单地说是对类的抽象。我们知道C+语言用类定义了构造对象(这里指C+对象而不是COM对象)的方式,对象是类的实例,而模板类定义的是类的构造方式,使用模板类定义实例化的结果产生的是不同的类。因此可以说模板类是“类的类”。,37,.NET Compact Framework,微软给出的.NET Framework概念。 .NET Framework是Microsoft为开发应用程序创建的个富有革命性的新平台。 这句话最有趣的地方是它的含糊不清,但这是有原因的。 1)注意这句话没有说“在Windows操作系统上开发应用程序“。尽管.NET Framework发布的第一个版本是运行在Windows操作系统上,但是以后将推出运行在其它操作系统上的版本,这些操作系统包括FreeBSD,LinuxMacintosh,甚至个人数字助手类设备。(可移植性),38,.NET Compact Framework,2).NET Framework定义并没有限制应用程序的类型。.NET Framework可以创建Windows应用程序、Web应用程序、Web服务和其他各种类型的应用程序。,39,.NET Compact Framework,什么是 Microsoft .NET Compact Framework? Microsoft .NET Compact Framework 是针对 Microsoft .NET 计划的智能设备开发框架,是实现 Microsoft 随时随地在任何设备上为客户提供良好体验的目标的关键所在。.NET Compact Framework 将托管代码和 Web 服务带给了智能设备,它允许安全的、可下载的应用程序在诸如个人数字助理 (PDA)、移动电话和机顶盒等设备上运行。,40,公共语言运行时(库),CLR(Common Language Runtime)公共语言运行时是整个.net framework构建的基础,是实现.Net跨平台,跨语言,代码安全等核心特性的关键。 CLR和Java虚拟机一样也是一个运行时环境,它负责资源管理(内存分配和垃圾收集),并保证应用和底层操作系统之间必要的分离。,41,公共语言运行时,公共语言运行时是.NET Compact Framework的基础. 公共语言运行库是.net framework的基础。它运行代码并提供使开发过程更轻松的服务。 托管代码:以公共语言运行库为目标的代码称为托管代码。(以.net为基础) clr功能: 1.管理内存2。线程执行。,42,公共语言运行时,托管执行过程:选择编译器。把代码编译为中间语言(msil)。将msil编译为本机代码。运行代码。 microsoft中间语言(msil) 一组可以有效的转换为本机代码且独立于cpu的指令。 当编译为托管代码时,编译器将源代码翻译为microsoft中间语言(msil)。,43,在编程时,变量、函数的命名是一个极其重要的问题。好的命名方法使变量易于记忆且程序可读性大大提高。Microsoft采用匈牙利命名法来命名Windows API函数和变量。匈牙利命名法是由Microsoft的著名开发人员、Excel的主要设计者查尔斯西蒙尼在他的博士论文中提出来的,由于西蒙尼的国籍是匈牙利,所以这种命名法叫匈牙利命名法。 匈牙利命名法为C标识符的命名定义了一种非常标准化的方式,这种命名方式是以两条规则为基础:,匈牙利命名法,44,标识符的名字以一个或者多个小写字母开头,用这些字母来指定数据类型。 在标识符内,前缀以后就是一个或者多个第一个字母大写的单词,这些单词清楚地指出了源代码内那个对象的用途。比如,m_szStudentName表示一个学生名字的类成员变量,数据类型是字符串型。,45,Windows类型 样本变量 HWND (窗口句柄) hWnd; HANDLE(对象句柄) hInstance; HICON (图标句柄) hIcon;,46,一般前缀命名规范 前缀 类型 实例 C 类或结构 CDocument,CPrintInfo S 结构体 SAddress M 成员变量 m_pDoc,m_nCustomers,47,前缀 类型 描述 实例 c char 8位字符 cGrade str string 字符型 strName ch TCHAR 如果_UNICODE定义, chName 则为16位字符 b BOOL 布尔值 bEnable n ,i int整型 (其大小依赖于操作系统) nLength,变量命名规范,48,前缀 类型 描述 实例 si short int 短整型 siSequ n UINT 无符号值(其大小依赖于操作系统)nHeight w WORD 16位无符号值 wPos f float 浮点型 fRadius d double 双精度型 dArea,变量命名规范,49,前缀 类型 描述 实例 l long 长整型 lOffset ld long double 长双精度型 ldRate dw DWORD 32位无符号整型 dwRange p * 指针 pDoc lp FAR* 远指针 lpszName lpsz LPSTR 32位字符串指针 lpszName,50,前缀 类型 描述 实例 lpsz LPCSTR 32位常量字符串指针 lpszName lpsz LPCTSTR 如果_UNICODE定义 lpszName 则为32位常量字符串指针 h handle Windows对象句柄 hWnd If 输入文件流 ifDataFile Of 输出文件流 ofStuFile sz 以“0”结束的字符串 szAppName,51,一般,52,ANSI C中的数据类型声明,char,int,float,double,Single- precision floating point,Double- precision floating point,a single byte-holding one character,integer,以上是基本数据类型. 构造类型有: 结构体类型(struct) 共同体(联合体)类型 (union)和枚举类型. 指针类型(char *str=“I love China“ ) (char *szAppTitle=“Windows API窗口程序“; ) 什么是匈牙利命名法?,53,关于(unsigned char *)强制声明,请同学看一下两种宏定义:哪一个更合适? #include #include #define com8155 XBYTE0x2100 #define com8155 (unsigned char *)XBYTE0x2100 #define com8155 (unsigned char volatile *)XBYTE0x2100,54,关于(unsigned char *)强制声明,请同学看一下两种宏定义:哪一个是正确? #include #include #define com8155 XBYTE0x2100 #define pa8155 XBYTE0x2101 #define pb8155 XBYTE0x2102,55,关于(unsigned char *)声明,#include #include #define com8155 (unsigned char *)XBYTE0x2100 #define pa8155 (unsigned char *)XBYTE0x2101 #define pb8155 (unsigned char *)XBYTE0x2102 我们尽可能选择这种描述形式 #define com8155 (unsigned char volatile *)XBYTE0x2100,56,函数的声明,如果我们用编译环境提供的联机打开文件(open document)的功能我们可以看到 #ifndef _ABSACC_H_ #define _ABSACC_H_ #define CBYTE (unsigned char volatile code *) 0) #define DBYTE (unsigned char volatile data *) 0) #define PBYTE (unsigned char volatile pdata *) 0) #define XBYTE (unsigned char volatile xdata *) 0) #define CWORD (unsigned int volatile code *) 0) #define DWORD (unsigned int volatile data *) 0),See this,The tow componets can be placed in a structure declared like this,struct point float x; float y; ;,Structure user defined data type,A structure is a collection of one or more variable,possibly of different type,grouped together under a single name convenient handling.,struct point float x; float y ;,New Data Type,新数据类型,Structure-how to declaration,struct Point double x; double y; double z; ;,struct structure_tag Structure-members; ;,Declaration,struct Line struct Point StartPoint; struct Point EndPoint; ;,保留字,结构体名称,这样我们就指定了一个结构体类型,它相当一个模版,其中无具体的数据,也不分配内存。为了使用结构体类型。应定义结构体类型的变量,Structure-who is new type,struct structure_tag,struct structure_tag Structure-members; ;,Declaration,保留字,结构体名称,struct Line,struct point,新数据类型,Int float,结构体成员 Type variableName; int age;,Structure-type size(大小),struct Point double x; double y; double z; ;,double x,double y,double z,64位,64位,64位,64+64+64位=8*3=24字节,Examples,struct Student int Code; /*学号*/ char Name20; /*姓名*/ char Sex; /*性别*/ unsigned int Age; /*年龄*/ ;,Structure-members(结构体成员变量),类的定义 类是一种用户自定义的数据类型,它的一般定义格式如下: class private: ; protected: ; public: ; ;,类和结构,结构是类的一种特例,在结构中也可以定义成员函数。定义结构时只要把关键字class 改为struct即可。,结构体-类的雏形,class是定义类的关键字。是一个标识符(句柄) ,用于惟一标识一个类。一对大括号内是类的说明部分,说明该类的所有成员。类的成员包括数据成员和成员函数两部分。类的成员从访问权限上分有以下三类:公有的(public)、私有的(private)和保护的(protected),其中默认为private权限。说明为公有的成员可以被程序中的任何代码访问;说明为私有的成员只能被类本身的成员函数及友元类的成员函数访问,其他类的成员函数,包括其派生类的成员函数都不能访问它们;说明为保护的成员与私有成员类似,只是除了类本身的成员函数和说明为友元类的成员函数可以访问保护成员外,该类的派生类的成员也可以访问。,Structures Variables(结构体变量),三种方法,struct Point double x; double y; double z; oPoint1, oPoint2;,struct Point double x; double y; double z; ; struct Point oPoint1; struct Point oPoint2;,struct double x; double y; double z; oPoint2, oPoint2;,先声明结构体类型 再定义变量名(实例或对象),声明结构体类型同时 定义变量名(实例或对象),直接定义结构体 类型变量名(实例或对象),指定了一个结构体类型, 它相当一个模版,其中无具 体的数据,也不分配内存。 为了使用结构体类型。应定 义结构体类型的变量,Variables initialized(变量初始化),struct Point double x; double y; double z; oPoint1=20.0,10,0;,struct Point double x; double y; double z; ; struct Point oPoint1=20.0,10,0;(标记红在一行),struct double x; double y; double z; oPoint1 =20.0,10,0;,A structure can be initialized by following its definition with a list of initializers,each a constant expression. An automatic structure may also be initialized by assignment or by calling a function that returns structure of the right type,Variables initialized(变量初始化),struct Line int id; struct Point StartPoint; Line1= 1,2,3,10;,对于复杂结构体变量的初始化如下,对结构体成员变量依次初始化例如:,struct Point int x; int y; int z; ;,Void main() /str_1.c printf(“%d %d %d %d”, Line1.id,Line1.startpoint.x, Line1.startpoint.y,Line1.startpoint.z); 输出:1 2 3 10,指定了一个结构体类型,它相当一个模版,其中无具体的数据,也不分配内存。为了使用结构体类型。应定义结构体类型的变量,例1:,#include”stdio.h” /whg_1.c struct wangxiao int x; float y; whg=3,8.5; void main() clrscr(); ,输出:3 8.500000,Printf(%d %f”,whg.x,whg.y),例2:变量初始没有赋值的缺省为0,#include”stdio.h” /whg_2.c struct wangxiao int x; int y; int z; whg=3,8; void main() clrscr(); Printf(%d %d %”,whg.x,whg.y,whg.z) ,输出:3 8 0,例3:变量初始分别赋值,#include”stdio.h”号 /whg_3.c struct wangxiao int x; float y; whg; void main() Whg.x=3; Whg.y=4.2; Printf(%d %f”,whg.x,whg.y) ,输出:3 4.200000,72,指针变量作函数参数,例1:输入a和b两个整数,按先大后小的顺序输出a和b. swap(int *p1,int *p2) int p; P=*p1; *p1=*p2; *p2=p; void main() int a,b; int *pointer1,*pointer2; Scanf(“%d,%d”, ,5,9 9,5,指针变量是pointer1 而不是*pointer1,实际参数是地址。形式参数是指针变量-指向地址. (运行时拷贝的是指针变量指向的变量值),73,函数的指针(函数入口地址),一个函数在编译时被分配给一个入口地址,这个入口地址称为函数的指针。可以定义一个指向函数的指针变量(类型),将函数入口地址赋予指针变量,然后通过指针变量调用此函数。 指向函数的指针变量定义形式为: 类型标识符 (*指针变量名)( ) ; 函数返回值的类型 例如: int (*p)( ) ;,74,例:求a和b中的较大者.,程序如下: main() int max(int,int) int a,b,c; scanf(“%d,%d”, ,75,指针变量指向函数,main() int max(int,int) int (*p)(); /声明 int a,b,c; p=max; /赋值(地址值) scanf(“%d,%d”, int (*p)()表示定义了一个指向函数的指针变量(指针类型) 它不是固定指向哪一个函数的,而只是表示定义了这样的一个变量.它是专门用来存放函数入口地址的.在程序中把哪一个函数的地址赋给它,它就指向哪一个函数,在一个程序中,一个指针变量可以先后指向不同的函数.,76,什么是句柄?,句柄是Windows编程中的一个重要元素.它是一个被用来标识应用程序或对象如窗口菜单设备文件等唯一整数.可一将它理解为一个指向一个类的指针.用户必须通过某种方式来创建句柄.在使用完毕后将其撤消,以收回资源.在Wi

温馨提示

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

评论

0/150

提交评论