LessonB-1窗口与消息.doc_第1页
LessonB-1窗口与消息.doc_第2页
LessonB-1窗口与消息.doc_第3页
LessonB-1窗口与消息.doc_第4页
LessonB-1窗口与消息.doc_第5页
全文预览已结束

下载本文档

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

文档简介

Lesson B-1 窗口与消息一、窗口的创建建立窗口很简单,只需调用CreateWindow函数即可,其实,窗口的创建过程并非真的如此简单。因此,在我们试图调用CreateWindow函数之前,介绍一些背景知识会大有帮助。1系统结构结构概述进行Windows程序设计,实际上是在进行一种面向对象的程序设计(OOP)。这一点在Windows中使用得最多的对象上表现最为明显。这种对象正是Windows之所以命名为Windows的原因,这个对象正式窗口(Windows)。桌面上最明显的窗口就是应用程序窗口。这些窗口含有显示程序名称的标题栏、菜单栏,甚至可能还有工具栏和滚动条。另一类窗口是对话框,它可以有标题栏也可以没有标题栏。装饰对话框表面的还有各式各样的按钮、单选按钮、复选框、列表框、滚动条和文本框等,其中每一个小的对象都是一个窗口。更确切地说,这些对象都被称为“子窗口”或“控件窗口”或“子窗口控件”。作为对象,使用者会在屏幕上看到这些窗口,并通过键盘和鼠标直接与它们进行交互操作。窗口以“消息”的形式接收窗口的输入,窗口也借助消息与其它窗口通讯。对“消息”的理解将是学习如何编写Windows程序所必须越过的障碍之一。我们知道,大多数的Windows程序都有大小合适的应用程序窗口。也就是说,您能够通过鼠标拖动窗口的边框来改变窗口的大小。通常,程序将通过改变窗口中的内容来响应这种大小的变化。是Windows本身而不是应用程序在处理与使用者重新调整窗口大小相关的全部琐碎的代码。应用程序是如何知道用户改变了窗口的大小的呢?对习惯于传字符模式编程的程序员来说,操作系统不具备将此类消息传递给用户的机制。因此这个问题是理解Windows体系结构的关键。当用户改变窗口的大小时,Window便向应用程序发送一条携带新窗口尺寸相关信息的消息。然后应用程序对自身的内容进行调整以反映出窗口尺寸的变化。“Windows向应用程序发送了消息”,那么操作系统是如何将消息传递给应用程序的呢?其实“Windows向应用程序发送了消息”是说Windows调用了该应用程序内部的一个函数,而这个函数是用户写的,且是程序的核心,其参数描述了描述了由Windows所发送并由用户的程序所接收的特定消息。这函数被称为“窗口过程”。对于应用程序调用操作系统功能的做法是很熟悉的。例如,程序在打开磁盘文件时就要使用有关的系统调用,而操作系统调用应用程序的做法可能比较陌生,而这正是Windows体系结构的基础。应用程序所创建的的每一个窗口都有一个与之相关联的窗口过程。这个窗口过程可以是应用程序中的某一个函数,也可以位于一个动态链接库中。Windows正是通过调用窗口该过程来向窗口传递消息的。窗口过程则依据这些消息进行相应的处理,然后将控制权返还给Windows。窗口过程用于处理传递给窗口的消息。通常这些消息用于将用户的鼠标或键盘输入通知给窗口,例如,正式通过这种途径使按钮窗口能够获知它被“单击”。而当窗口尺寸被调整或当窗口表面需要重绘时,也有相应的消息来通知窗口。Windows程序开始执行时,Windows首先为该程序建立一个“消息队列”。这个消息队列用来存放该程序可能建立的各种不同窗口的消息。程序中有一小段程序代码,叫做“消息循环”,用来从消息队列中检索消息,并且将它们分发给相应的窗口过程。而有些消息直接发送给窗口过程,不放入消息队列中。必须深刻理解窗口、窗口类、窗口过程、消息队列、消息循环和窗口消息是如何相互配合的。2HELLOWIN程序要建立一个窗口,首先需要注册一个窗口类,而窗口类又需要一个窗口过程来处理窗口消息。这些是几乎所有Windows程序都包括的一些常规而繁琐的步骤。HelloWin程序3通盘考量 实际上,每一个Windows程序代码中都包括HELLOWIN.C程序的大部分。没人能真正记住此程序的全部写法;通常,Windows程序写作者在开始写一个新程序时总是会复制一个现有的程序,然后再做相应的修改。 这个程序,已经可以做很多操作。如:可以在系统菜单中执行所有选项(就是按下在标题栏最左端的小图标);也可以从系统菜单中选择 Close选项,或者单击标题栏最右端的关闭按钮,或者双击标题栏最左端的图标,来关闭窗口以终止程序的执行。(1)Windows函数调用 HELLOWIN至少调用了18个Windows函数。下面以它们在HELLOWIN中出现的次序列出这些函数以及各自的简明描述: LoadIcon 加载图标供程序使用。 LoadCursor 加载鼠标光标供程序使用。 GetStockObject 取得一个图形对象(这里是取得绘制窗口背景的画刷对象)。 RegisterClass 为程序窗口注册窗口类。 MessageBox 显示消息框。 CreateWindow 根据窗口类建立一个窗口。 ShowWindow 在屏幕上显示窗口。 UpdateWindow 指示窗口对其自身进行重绘。 GetMessage 从消息队列中获取消息。 TranslateMessage 翻译某些键盘消息。 DispatchMessage 将消息发送给窗口过程。 PlaySound 播放一个声音文件。 BeginPaint 标明开始绘制窗口。 GetClientRect 获取窗口客户区的大小。 DrawText 显示字符串。 EndPaint 结束绘制窗口。 PostQuitMessage 在消息队列中插入一个“退出程序”消息。 DefWindowProc 执行默认的消息处理。 这些函数均在Platform SDK文件中有详细说明,并在不同的头文件中声明,其中绝大多数声明在WINUSER.H中。(2)大写标识符 HELLOWIN.C中有很多大写的标识符,这些标识符是在Windows头文件中定义的。有些标识符含有两个字母或者三个字母的前缀,这些前缀后面跟着一个下划线:这些标识符其实都是数值常量。前缀指示该常量所属的类别,如表B1-1所示。表B1-1前缀类别CS 类风格选项 CW 建立窗口选项 DT 文本绘制选项IDI 图标ID IDC 光标ID MB 消息框选项 SND 声音选项 WM 窗口消息 WS 窗口风格 (3)新的数据类型 HELLOWIN.C中的其它标识符属于新的数据类型,也在Windows头文件中使用typedef或者#define语句定义了。最初是为了便于将Windows程序从原来的16位系统上移植到32位(或者其它)操作系统上。这种作法并不如当时每个人想象的那样顺利,但是这种概念基本上是正确的。 有时这些新的数据类型只是为了方便缩写。例如:用于WndProc的第二个参数UINT类型,其实就是一个unsigned int (无正负号整数),在Windows 98中,这是一个32位的值。用于WinMain的第三个参数的PSTR数据类型是指向一个非宽字符串的指针,即是一个char *。 其它数据类型的含义就不太明显了。例如,WndProc的第三和第四个参数分别被定义为WPARAM和LPARAM,这些名字的来源有点历史背景:当Windows还是16位系统时,WndProc的第三个参数被定义为一个WORD,这是一个16位的无正负号短(unsigned short)整数,而第四个参数被定义为一个LONG,这是一个32位有正负号长整数,“PARAM”前面加上了前置前缀“W”和“L”。当然,在32位的Windows中,WPARAM被定义为一个UINT,而LPARAM被定义为一个LONG(这就是C中的long整数类型),因此窗口过程的这两个参数都是32位的值。 WndProc函数的返回值类型为LRESULT,该值简单地被定义为一个LONG。WinMain函数被指定了一个WINAPI类型(在头文件中定义的所有Windows函数都被指定为这种类型),而WndProc函数被指定为CALLBACK类型。这两个标识符都被定义为_stdcall,表示在Windows本身和使用者的应用程序之间发生的函数调用的特定传递方式。HELLOWIN还使用了Windows头文件中定义的四种数据结构,这些数据结构如表B1-2所示。表B1-2结构 含义 MSG 消息结构 WNDCLASS 窗口类结构 PAINTSTRUCT 绘制结构 RECT 矩形结构 (4)句柄简介 对各种类型的句柄,有三种大写标识符,如表B1-3所示。表B1-3标识符含义HINSTANCE 实例句柄(程序本身) HWND 窗口句柄 HDC 设备环境句柄 句柄在Windows中使用非常频繁。如我们将遇到HICON(图标句柄)、HCURSOR(鼠标指针句柄)和HBRUSH(画刷句柄)。句柄是一个(通常为32位的)整数,它代表一个对象。Windows中的句柄类似传统C或者MS-DOS程序设计中使用的文件句柄。程序几乎总是通过调用Windows函数取得句柄。应用程序在其它Windows函数中使用这个句柄,以使用它代表的对象。句柄的实际值对程序来说是无关紧要的。但是,向应用程序传递句柄的Windows模块知道如何通过句柄来引用对象。(5)匈牙利表示法 许多Windows程序写作者使用一种叫做“匈牙利表示法”的变量命名通则。这种记法非常简单,变量名以一个或者多个小写字母开始,这些字母表示变量的数据类型。例如,szCmdLine中的sz代表“以0结尾的字符串”。在hInstance和hPrevInstance中的h前缀表示“句柄”;在iCmdShow中的i前缀表示“整数”。WndProc的后两个参数也使用匈牙利表示法。尽管wParam应该更适当地被命名为uiParam(代表无符号整数),但是因为这两个参数是使用数据类型WPARAM和LPARAM定义的,因此保留它们传统的名字。在命名结构变量时,可以用结构名(或者结构名的一种缩写)的小写形式作为变量名的前缀,或者用作整个变量名。例如,在HELLOWIN. C的WinMain函数中,msg变量是MSG类型的结构;wndclass是WNDCLASS类型的一个结构。在WndPmc函数中,ps是一个PAINTSTRUCT结构,rect是一个RECT结构。匈牙利表示法由于变量名既描述了变量的作用,又描述了其数据类型,就比较容易避免产生数据类型不匹配的错误。 表B1-4列出了在本书中经常用到的变量前缀。 表B1-4前缀数据型态c char或WCH

温馨提示

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

评论

0/150

提交评论