您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > 第4章 Windows CE窗口和消息机制
第四章WindowsCE窗口和消息机制版权华清远见嵌入式培训中心版权所有;未经华清远见明确许可,不能为任何目的以任何形式复制或传播此文档的任何部分;本文档包含的信息如有更改,恕不另行通知;保留所有权利。4.1Windows程序设计综述4.1.1WindowsCE程序与桌面Windows程序的联系WindowsCE和桌面版的Windows操作系统(如Windows2000/Windowsxp等)都隶属与微软的操作系统阵营。开发WindowsCE应用程序和开发Windows应用程序的方法是十分类似的,它们有着相同的消息处理机制,有着类似的窗口,资源和控件。在一些细节上,WindowsCE和桌面版的Windows有一些不同。4.1.2窗口的概念微软公司推出的操作系统,都以“Windows”来命名的,如Windows98,Windows2000,Windowsxp,WindowsCE等。“Windows”即为窗口的意思,微软公司的操作系统都是基于窗口机制的。在Windows操作系统中,一个窗口就是屏幕上的一个矩形区域,它接收用户的输入并以文字或图形的形式显示输出内容。4.1.3创建第一个WindowsCE程序使用应用程序开发工具EmbeddedVisualC++进行程序的创建。创建程序时的类型选择“WCEApplication”。CPU选择框中选择“Emulator”和“X86”两项。程序生成后可以点击“Build”进行编译和下载。4.2Windows编程基础4.2.1源代码初步分析WindowsCE程序员在开始编写一个新程序时,总是会复制一个现有的WindowsCE程序,或者利用EVC的程序创建向导创建一个基本的程序框架,然后再做相应的修改,而不必亲手编写每一行代码。在程序代码中,有一个WinMain函数,这时程序的主函数,也是程序的入口点。还有另外一个函数,名为WndProc,这是窗口消息处理程序。下面列出了以Hello程序中出现些函数以及对它们的简明描述:lMyRegisterClass为程序窗口注册窗口类别。lDialogBox显示对话框。lCreateWindow根据窗口类别建立一个窗口。lShowWindow在屏幕上显示窗口。lUpdateWindow通知窗口自我更新。lGetMessage从消息队列中取得消息。lTranslateMessage传送某些键盘消息。lDispatchMessage将消息发送给窗口消息处理程序。lBeginPaint开始绘制窗口。lGetClientRect取得窗口显示区域的大小。lDrawText显示字符串。lEndPaint结束绘制窗口。lPostQuitMessage在消息队列中插入一个“退出程序”消息。lDefWindowProc执行默认的消息处理。4.2.2大写字母标识符在程序源代码中,用到了几个大写的标识符,这些标识符是在系统头文件中定义的。有些标识符含有两个字母或者三个字母的前缀,后面紧跟一个下划线。程序开发人员一般不用去记忆这些数值常数,它们的形式以及意义可以在EVC的帮助手册中查到。4.2.3新的数据形态有些数据形态在头文件中使用typedef或者#define加以定义,最初是为了便于将Windows程序从原来的16位系统上移植到未来的使用32位技术的操作系统上。有时这些新的数据型态只是为了方便缩写。WndProc函数返回一个类型为LRESULT的值,该值被定义为一个LONG。WinMain函数被指定为WINAPI类型,而WndProc函数被指定为CALLBACK类型。这两个标识符都被定义为_stdcall,表示在WindowsCE系统本身和的应用程序之间发生的函数呼叫的呼叫参数传递方式。4.2.4匈牙利命名法在进行WindowsCE编程时一般使用“匈牙利命名法”的变量命名规则。变量名以一个或者多个小写字母开始,这些字母表示变量的数据型态。在命名结构变量时,可以用结构名(或者结构名的一种缩写)的小写作为变量名的前缀,或者用作整个变量名。匈牙利命名法能够帮助程序开发者及早发现并避免程序中的错误。由于变量名既描述了变量的作用,又描述了其数据型态,就比较容易避免产生数据型态不合的错误。4.2.5句柄的意义句柄在WindowsCE中使用非常频繁。句柄通常是一个32位的整数,代表着一个具体对象。程序通过调用WindowsCE中的函数来取得要控制的对象的句柄。在其它WindowsCE函数中通过使用这个句柄来操作它所代表的对象。4.2.6回调函数回调函数是一个通过函数指针调用的函数。如果把函数A的指针作为参数传递给另一个函数B,那么在函数B中通过这个指针来调用它所指向的函数A时,函数A就被称作是回调函数。使用回调函数可以把调用者与被调用者分开。调用者不关心谁是被调用者,它只需知道存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。在WindowsCE程序中,回调函数通常和消息紧密联系。4.3消息机制4.3.1注册与建立窗口WindowsCE程序中建立的每一个窗口都有相关的窗口消息处理程序。这个窗口消息处理程序是一个函数,它既可以在程序中,也可以在动态链接库中。WindowsCE通过给窗口发送消息来调用窗口消息处理程序。窗口消息处理程序对发送过来的消息进行处理,然后将控制传回给操作系统。窗口通常是在“窗口类别”的基础上建立的,窗口类别标识了窗口消息处理程序。多个窗口可以属于同一个窗口类,并使用同一个窗口消息处理程序。窗口消息处理程序处理给窗口发送消息。WindowsCE程序开始执行后,系统会为该程序建立一个“消息队列”。这个消息队列用来存放该程序建立的各种不同窗口的消息。程序中有一小段程序代码,叫做“消息循环”,用来从消息队列中取出消息,并将它们发送给相应的窗口消息处理程序。有些消息可以直接发送给窗口消息处理程序,不用放入消息队列中。4.3.3消息循环WindowsCE为当前执行的每个WindowsCE程序维护一个“消息队列”。在发生用户输入之后,WindowsCE系统会将这个输入事件转换为一个“消息”,并将消息放入程序的消息队列中。程序通过执行“消息循环”的程序代码从消息队列中取出消息4.3.4窗口消息处理在Hello程序中,窗口消息处理程序是WndProc函数。窗口消息处理程序可任意命名,只要不和其它函数命名发生冲突。一个Windows程序可包含多个窗口消息处理程序。窗口消息处理程序总是和调用RegisterClass时注册的特定窗口类相关联。4.3.5队列化消息与非队列化消息WindowsCE中的消息被分为“队列化消息”和“非队列化消息”。队列化的消息是由WindowsCE系统放入程序消息队列中的。在程序的消息循环中,会把这些消息重新传回并发送给窗口消息处理程序。而非队列化的消息在WindowsCE调用窗口时直接送给窗口消息处理程序。队列化消息基本上是用户输入产生的。非队列化消息一般是调用特定的WindowsCE函数产生。消息的产生过程比较很复杂,不过大部分是由WindowsCE系统负责的,无需用户程序关心。从窗口消息处理程序的角度来看,消息是以一种有序的、同步的方式产生的。窗口消息处理程序可以选择性地对它们进行处理,处理消息时,消息处理程序不会被其它消息突然中断。
本文标题:第4章 Windows CE窗口和消息机制
链接地址:https://www.777doc.com/doc-3737695 .html