




已阅读5页,还剩145页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
WINDOWS 程序设计教程(上),杨祥金 杨丹 李永新 编著,本书的基本内容与特点,本书介绍在Microsoft Windows 98、 NT 4.0和 NT 5.0环境下应用C语言、API编程接口编写应用程序的方法。讲解Windows应用程序的组成和工作原理。 使用C语言和原始的API编写Windows 应用程序是最基本,最重要的方法。应用这种方法开发出的应用程序却具有最佳的性能、最强大的功能和最大的灵活性。 熟悉API会使您对Windows操作系统的内部活动有更深入的理解。 本书是一本教科书,内容按照教学的要求而组织。 在教学过程中我们遵循“从简单到复杂, 循序渐进,理论联系实际,用例程导引课文学习”的原则。每章末尾附有大量习题,可供学习参考。 本书是一本自学课本。本书的起点低,只要熟悉C语言,有一定使用Windows操作系统经历的读者都能读懂。 本书提供了大量的例程。很多基本概念,编程方法与技巧都通过例程进行解释。例程来源于Charles Petzold 著的Programming Windows一书。例程具有经典性,典型性。 通过本书的学习将使你对Microsoft Visual C+ 6。0开发工具的理解更上一个层次,使得读者应用开发工具生成应用程序的感觉不再仅仅是步骤,而是从理念上理解。,第 1 章 概述,本章简要地介绍了Windows操作系统的发展历史,基本性质和用途.介绍了对Windows编程最有用的API及其发展历程, 介绍了Win16 和 Win32 API的特点和异同. 为了便于从过程式C语言编程过渡到多任务的Windows编程, 我们用一个简短又简单的大家易于熟悉的字符模式程序和一个具有同样功能的Windows程序进行比较. 本章还回顾了字符编码的发展过程 .讲述了与字符编码有关系的字符数据类型,宽字符数据类型以及处理宽字符数据的库函数.本章最后还介绍了应用程序实现Unicode和ASCII混合编码的原理,1.1 WINDOWS的发展历史,上世纪60年代就开始从事系统软件的研究与开发,但直到1981年MS-DOS才正真成为PC上的主流操作系统。MS-DOS是一个小型,个人,单任务操作系统,它提供给用户的是一种命令介面,它为编程人员提供输入输出(I/O )函数供编程人员调用, 。为了将文字或图形写到显示器上,应用程序可以直接存取PC机的硬件。,图形操作环境的作用,有了图形操作环境计算机才能从专业人员手中走进寻常百姓家。 有了图形操作环境才能使用户做到“所见即所得”,使用户对计算机的操作成为规范化的图形操作。 有了图形操作环境才能使计算机成为电脑。,图形操作环境的发展历程,由於存贮器和硬件的限制,直到1983年1月,苹果计算机公司才发表Lisa计算机,在Lisa计算机中提出了不同於字符模式环境的另一种环境图形操作环境。并在1984年1月成为Macintosh上图形环境的一种标准。对 Windows图形环境的研究工作有杰出功献的是Xerox Palo Alto Research Center(PARC)。是它们在70年代中期所作的开拓性研究工作。,下表记录了Windows图形操作环境的发表历史,反映了软件的发展。,发行日期 编码 API 应用程序 Windows 1.0 1985年11月 16位 Win16 16 位 Windows /386 1987年9月 16位/32位 Win16 16 位 Windows 2.x 1987年12月 16位 Win16 16 位 Windows 3.0 1990年5月 16位/32位 Win16 16 位 Windows 3.1 1992年4月 16位/32位 Win16 16 位 Windows for Workgroup 3.1 1992年11月 16位/32位 Win16 16 位 Windows for Workgroup 3.11 1993年11月 16位/32位 Win16 16 位 Windows 3.11 1993年12月 16位/32位 Win16 16 位 Windows NT 3.1 1993年8月 32位 Win32 32 位/16位 Windows NT AS 3.1 1993年8月 32位 Win32 32 位/16位 Windows NT workstation 3.5 1994年10月 32位 Win32 32 位/16位 Windows NT sever 3.5 1994年10月 32位 Win32 32 位/16位 Windows NT workstation 3.51 1995年7月 32位 Win32 32 位/16位 Windows NT sever 3.51 1995年7月 32位 Win32 32 位/16位 Windows 95 1995年8月 32位/16位 Win32 32 位/16位 Windows 98 1998年6月 32位 Win32 32 位/16位 Windows 2000 2000年xx月 32位 Win32 32 位/16位 本表中的编码 16位/32位 ,API Win16/Win32,应用程序的位数 32 位/16位这三个项目的意义由下面各节介绍。,1.2 32位Windows操作系统的基本性质和用途,32位优先权式多工,多线程图形操作系统。 “所见即所得”的图形信息显示,以及格式化的内容输出。 屏幕显示器被称作“显示多个程序的桌面”。 为了实现多工必须对存贮器进行管理。 不要求应用程序自行开发驱动程序 。,1.3 API的基本特征及其发展历程,什么是API?API是”应用程序接口”的缩写( Application Programming Interface) , API包含了所有应用程序能够使用,操作系统能够执行的函数调用 。 API的特点:发展保持一致和兼容 。 API的最大发展是16位变成32位。 API的分类:Win16 API ,Win32 API 。 。,1.4 编程工具及集成开发环境,Visual Basic编程工具简介。 Visual C+编程工具简介。 , MFC编程简介。 , Borland Delphi编程工具简介。 集成开发环境 简介。,1.6 C程序和windows程序的比较,用 C语言编出的 hello, world程序 (教材程序11-1 helloworld.doc) 同样效果的Windows程序 HelloMsg.c (教材程序11-2HelloMsg.doc),1.7 HelloMsg.C的三个组成部分,本节介绍: 1.7.1 #include申明和包含文件 1.7.2 程序进入点 和WINAPI 识别字 1.7.3 MessageBox函数,1.7.1 #include申明和包含文件,包含文件的作用:用于前置处理 。定义了Windows程序中的数据类型、函数原型、数据结构和常数, #include 的解释。 最重要最基本的包含文件是: WINDEF.h 文件中有基本数据类型定义。 WINNT.h 文件中有支援Unicode的类型定义。 WINBASE.h 文件中有Kernel函数的有关定义。 WINUSER.h 文件中有用户介面函数的有关定义。 WINGDI.h 文件中有图形介面函数的有关定义。 .,1.7.2 程序进入点,Windows程序的进入点是WinMain 。 解释 WinMain函数: Int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd); 解释: Int WINAPI 以及WinMain的四个参数。,Int WINAPI 识别字,Int 是WinMain函数返回值的类型。 WINAPI 识别字是函数调用规范,定义如下: #define WINAPI _stdcall。 _stdcall是指示编译工作的识别字,它告诉编译系统如何产生机器码,函数调用参数在堆栈中是如何放置的以及函数调用时参数取出的的顺序。故而该识别字指定了一个调用约定。WinMain函数申明为WINAPI,这也是说,Winmain函数的调用也遵循_stdcall约定。,WinMain的四个参数,hInstance :操作系统为该应用程序创建的“执行实例 。 hPrevInstance:控制标识。如果是(null),表示在此之前,此应用程序还没有建立过任何实例,如果非0,说明已经建立过应用程序的实例。 lpCmdLine:指向命令序列的长指针。 nShowCmd:程序的显示方式 。,1.7.3 MessageBox函数,MessageBox函数用於显示短信息。 MessageBox函数的四个参数的解释 : 参数1指示在那个窗口中显示。 参数2是在窗口中显示的字符串。 参数3是在窗口标题行上显示的字符串。 参数4指示在显示窗口中生成按钮,MB_常数的解释,MB_常数指示在显示窗口中生成按钮。 MB_表示此常数是MessageBox函数的专用常数(为函数定义常数在其他函数中也能见到)。 MB_实际上是表示一个代码。 例如MB_OK 就是 0x00000000L。 更多的MB_ 代码见 教材程序1MB_常数表.doc,1.8 字符编码及Unicode初介,本节介绍: 1.8.1 字符集编码的发展简史 电报码 ,盲人阅读码 ,Telex代码 , BCDIC码 ,ASCII ,内码表 。 . 1.8.2 双字节字符集 1.8.3 Unicode字符集,1.8.2 双字节字符集(DBCS ),DBCS的编码是0到256,它就像内码表一样,前128个代码是ASCII,用1个字节定义。后128个代码“中的”某些用2个字节定义,某些仍然是用1个字节来定义。 双字节编码会引起附加的程序设计问题,例如,字符串的长度计算。,1.8.3 Unicode字符集,Unicode是统一的16位(两个字节)表示一个字符的编码系统。 Unicode和DBCS之间的区别 是什么? Unicode的优点是什么?缺点是什么? Unicode编码:教材程序1Unicode编码.doc,1.9 字符的数据类型char和宽字符数据类型wchar,本节介绍: 1.9.1 操作系统中基本数据类型的确定。 1.9.2 單字节字符数据类型(char)。 1.9.3 宽字符数据类型(wchar)。 1.9.4 宽字符库函数。 1.9.5 字符串函数的Unicode版和ASCII版的合 一方法 。 1.9.6 TCHAR.h头文件的作用。 1.9.7 编译命令中_UNICODE识别字的引入。 1.9.8 WINDOWS对宽字符支持 。,1.9.1 操作系统中基本数据类型的确定,int,char是最基本的数据类型。int取决于CPU的位数,即操作系统的位数。Char取决于操作系统所采用的编码。 如果char用8位二进制进行编码,那就是ASCII码字符集 。 如果char用16位二进制进行编码,那就是 Unicode 码字符集。,1.9.2 單字节字符数据类型(char)。,字节和字符是两个既有联系又有差别的概念 。字节是,字符是。 一个字节是8位二进制。 解释:char c = A ; char * p ; char * p = “Hello!“ ; char a10 ; char a = “Hello!“ ; static char a = “Hello!“ ;,1.9.3 宽字符数据类型(wchar)。,用多个字节存贮一个字符称为宽字符,C中用wchar_t表示宽字符数据类型 。 wchar_t和无符号短整数类型相同 。 定义宽字符数据类型的方法:例如 wchar_t c = A ; /c中存放A的宽字符。 wchar_t * p = L“Hello!” /L不可少。 static wchar_t a = L“Hello!“ ; /L不可少。,1.9.4 宽字符串库函数,为什么要设计处理宽字符串的库函数。,1.9.5 字符串函数的Unicode版和ASCII版的合一方法,最好的解决办法是源文件既能按ASCII编译又能按Unicode编译(见1.10)。,1.9.6 TCHAR.h头文件的作用,该头文件不是ANSI C标准的一部分,其中定义的每个函数和宏参数,前面都有一条下底线。TCHAR.h为以字符串作为参数的标准库函数提供一系列的替代名称。 例如,_tprintf是屏幕显示宽字符串的函数 _tcslen是计算宽字符串长度计算函数。,1.9.7 编译命令中_UNICODE识别字的引入,_UNICODE是控制程序段中的字符串处理函数是按照宽字符串处理函数对待还是按照常规字符串处理函数对待。 如果在程序中包含了TCHAR.h头文件,当源程序中 _UNICODE识别字有定义时,那么_tcslen就定义为wcslen(宽字符串长度计算函数):,如果_UNICODE识别字没有定义,则_tcslen定义为strlen (非宽字符串长度计算函数)。,1.9.8 WINDOWS对宽字符支持,Windows NT从底层支援Unicode。这意味著Windows NT内部使用由16位字符组成的字符串。 Windows NT可执行ASCII编码的程序或Unicode 编码的程序 或者 ASCII和Unicode混合编写的程序 。,1.10 应用程序实现Unicode和ASCII混合编码的原理,本节介绍: 1.10.1 WINNT.h是对Unicode支持的 头 文件。 1.10.2 32位系统中的MessageBox 函数 。 1.10.3 Windows的字符串处理函数 。 1.10.4 Windows中的sprintf函数。,1.10.1 WINNT.h是对Unicode支持的头文件。,定义了新的数据类型:CHAR和WCHAR 。 定义了六个字符串指针和四个const字符串指针。 WINNT.h用于实现UNICODE 和ASCII的混合编码。见教材程序1实现 UNICODE和ASCII混合编码.doc。 定义了一些宏参数(教材程序1宏参数的定义.doc)。,1.10.2 32位系统中的MessageBox函数 。,16位MessageBox在USER。EXE,32位M在USER32.DLL用于支持Unicode 编码。 32位MessageBox函数有两个函数的进入点:MessageBoxA(ASCII版), MessageBoxW(宽字符版)。 但是,用户仍然只需使用MessageBox,到底选用那个进入点由WINUSER.h头文件决定 。见教材程序1到底进入 MessageBoxA还是 MessageBoxW.doc。,1.10.3 Windows的字符串处理函数,Windows从c库中复制的字符串处理函数(教材程序1Windows使用的字符串处理函数.doc) 。 这些函数在程序段前面设置UNICODE识别字,那么这些函数将接受宽字符串,否则只接受常规字符串。,1.10.4 Windows中的sprintf函数,Windows程序中不能使用printf ,但是,在Windows程序中可以使用fprintf。 sprintf系列中的其他函数(见教材程序1sprintf系列.doc),Windows程序中不能使用printf ,但是,可以使用fprintf,教材程序1printf和sprintf函数的比较.doc,练习 1,1. 学习本书必须先知道那些知识? 2. OS/2 .1.1版本中的PM是什么意思? 3. 讲解Win16 和 Win32 API的特点和异同 4. “动态链结库”文件中的“常项”是什么? 5. 开发工具和集成开发环境有何区别,它们有什么联系? 6. 解释MessageBox函数的应用 7. 操作系统中基本数据类型是如何确定的? 8. 双字节字符集和Unicode字符集有何区别?采用双字节字符集有何问题? 9. 字符,字节有何区别?有何联系? 10. 什么叫宽字符?什么是Unicode字符?它们有何区别? 11. 讲述_Unicode识别字, TCHAR.H头文件的作用,第 2 章 Windows操作系统的寻址方法与存贮器管理,Windows应用程序的主体结构和传统的C程序的主体结构有很大的差别。造成这种差别的主要原因是: Windows应用程序的运行环境是基于Windows操作系统,而传统C语言运行环境是基于DOS操作系统。 Windows操作系统是單人多任务操作环境 . 16位Windows系统是属于非抢占式(non-preemptive)多任务,32位Windows系统是属于抢占式(preemptive)多任务,2.1 Windows的芯片,iAPX86 模式 仿真 RAM 虚拟内存 段 _ 8088 实模式 无 1MB 不支持 64K 8086 实模式 无 1MB 不支持 64K 80286 保护模式16位 实模式 16MB 1GB 64K 80386 保护模式32位 实模式,保护模式16位 4GB 64TB 4GB 80486 保护模式32位 实模式,保护模式16位 4GB 64TB 4GB Pentiun 保护模式32位 实模式,保护模式16位 4GB 64TB 4GB 表中有几个名字必须解释,它们是: 实模式,保护模式,RAM,虚拟内存。 实模式不支持虚拟内存,只有保护模式支持。,2.2 Windows的分段寻址方法,什么是寻址方法,什么是分段寻址方法? 什么是实模式,什么是保护模式? 本节介绍: 2.2.1 16位实模式。 2.2.2 16位保护模式 2.2.3 32位保护模式 2.2.4 分段寻址方法的缺陷及其消除方法,2.2.1 16位实模式,实模式的运行框图( 请见教材程序2实模式的寻址方式.doc)。 实模式下物理地址,内存空间,偏移空间的计算。 实模式不支持虚拟内存,只有保护模式支持。 实模式的优点与缺点是什么?,2.2.2 16位保护模式,何谓保护模式? 保护模式是如何实现的?(请见教材程序216位保护模式的实现.doc)。 保护机制是如何实现的? 保护模式下的段地址,偏移地址的意义? 保护模式下物理地址,内存空间,偏移空间(段空间)的计算。,2.2.3 32位保护模式,内存地址空间是怎样算出的? 存取字段中的间隔尺寸 位有什么用? 虚拟地址空间是怎样算出的? 以上三个问题清见:32位和16位保护模式描述符的比较(请见教材程序232位和16位保护模式描述符的比较.doc:),2.2.4 分段寻址方法的缺陷及其消除方法,分段寻址方法的缺陷是什么?为什么要采用“一个段” 思想 。 在“一个段”思想指导下再进行分页是极好的想法,所谓分页就是把4GB内存按照页的大小进行分割,一个页是4096字节。4GB大小的内存(相当于分段技术中的一个段)可以分割成220个页。,2.3 32位分页保护模式及其寻址方法,32位分页保护模式下,因为232 =4GB 内存虚拟内存=物理内存 + 交换区。 文件是以页为单位来存贮的。交换区中的页文件由调度程序控制,只有把它调入物理内存才能进行处理。 如何把32位地址进行分割实现分页机制的(请见教材程序2分页机制的解释.doc),2.4 抢占式多任务,非抢占式多任务,进程和线程的概念,本节介绍: 2.4.1 进程和线程的概念 2.4.2 抢占式多任务 2.4.3 非抢占式多任务 2.4.4 32位抢占式多任务多线程的 工作原理。,2.4.1 进程和线程的概念,一个任务的一次执行过程称为一个进程 . 能独立执行的程序块的一次执行。 进程和线程概念是怎样产生的?,2.4.2 抢占式多任务,具有最高优先级的线程就是当前正在运行的那个线程 ,这是抢占式多任务线程的调度规则。 进程的通信问题是进程设计的关键。,2.4.3 非抢占式多任务,Windows 3.x 以前的版本是一种老式的多任务,它有三个特征:非抢占式,软件实现,协调工作。 按照消息来进行调度,一旦这个消息获得执行权,一定要等到这个消息执行结束其他消息才有机会获得执行权。 实现非抢占式多任务的关键是应用程序中有一个消息循环(请见教材程序2消息循环的基本结构.doc)。,2.4.4 intel处理器的结构对抢占式多任务的支持,Win 32中,应用程序的开发背景发生了那几个方面的变化? 操作系统结构发生了什么变化?(请见教材程序2intel处理器的结构.doc)。 线程是系统调度用的能够执行的最小执行代码段 。,2.5 32位Windows 应用程序的消息输入方式,以进程作为调度单位有何缺点?为什么要采用多重输入方式? 多重输入队列的工作原理(请见教材程序2多重输入队列.doc)。 32位Windows 应用程序的特点:多任务,多线程,多重输入。,2.6 32位Windows中虚拟内存空间的划分,Windows95的虚拟内存空间划分 WindowsNT的虚拟内存空间划分 在这两种系统中,应用程序都可以访问低端的2GB虚拟内存中的大部分内容。操作系统的职责是把虚拟地址映射成真正的物理地址(在RAM的页内),并对页进行分配和管理。,2.7 32位Windows中虚拟内存的管理,何谓内存页与分页文件,各有什么用? 内存是以页为单位分配的(4K)。不可能预测到一个页在内存的什么地方 。 分页机制和分段机制对虚拟地址空间的管理机制是不一样的,但是,其目的是一样的。 分配内存页的两个阶段-予约与委托 ,由VirtualAlloc()函数 来完成(请见教材程序2VirtualAlloc函数的用法.doc) VirtualQuery()函数的用法(请见教材程序2VirtualQuery的用法.doc)。,2.7.4 异常事件及其处理方法,什么是异常事件 寻找与处理异常事件的步骤?(请见教材程序2寻找与处理异常事件的顺序.doc) 异常事件处理程序的编写方法 1 封装具有潜在危险性的代码 2 异常事件过滤器的设计 3 GetExceptionCode() 函数的应用 4 PageExceptionFilter()函数,在内存管理中常用的几个函数,VirtualAlloc()函数(请见 教材程序2VirtualAlloc函数的用法.doc)。 VirtualQuery()函数(请见教材程序2VirtualQuery的用法.doc)。 PMEMORY_BASIC_INFORMATION结构(请见教材程序2PMEMORY_BASIC_INFORMATION结构.doc)。 VirtualProtect()函数 (请见教材程序2VirtualProtect函数.doc) 内存的释放函数VirtualFree()(请见教材程序2VirtualFree函数.doc)。,练习 2,1. 为什么实模式可以用在单任务环境下?而不能用在多任务环境? 2. 模式是什么意思?什么是实模式?什么是保护模式? 3. 实模式是如何寻址的?有什么优缺点? 4. 介绍16位保护模式的寻址方法, 32位保护模式的寻址方法, 5. 分段有什么缺点?如何解决?什么叫“一个段”思想? 6. 32位分页保护模式的虚拟内存是多少? 7. 非抢占式(non-preemptive)多任务和抢占式(preemptive)多任务的区别 8. 32位抢占式(preemptive)多任务多线程的特点是什么? 9. Win 16 和Win 32 的消息队列有什么不一样? 10. 多线程和多重输入队列有什么优点? 11. 什么是异常事件? 操作系统寻找一个解决异常事件的顺序如何? 12. Win32异常处理程序的编程步骤?,第 3 章 开发Windows应用程序的技术基础,本章主要目的是向读者介绍编写Windows应用程序所采用的基本技术, 约定和惯例,API的结构与基本用法等作了介绍,对Windows应用程序的各个组成部分也作了初步介绍,并用框图的形式介绍Windows应用程序的工作原理,3.1 应用程序的结构与编译,解决多任务的关键是:控制核心应该从程序本身转移到Windows操作系统。应该由Windows操作系统决定那个应用程序可以占用CPU时间,程序的结构也不再是过程式程序中的赋值、循环、分支等C语言中常见的结构,而是消息,处理。为了解决这个问题,应用程序采用一种称为”事件驱动结构”是合适的。所谓非抢占式是指一旦这个应用程序取得了执行权,就一直要把这个程序执行下去,除非遇到新的消息来干预。否则,其他程序没有办法执行。如果把非抢占式和”事件驱动结构相结合,那就是Win16操作系统下的应用程序。,3.1.1 Windows应用程序的结构和C语言程序结构的比较,请见Windows应用程序的结构和C语言程序结构的比较 C语言程序的主体结构是 Main() 定义函数1 定义函数2 。 定义函数n C语言程序的主体结构是主函数Main和一些函数定义所组成。 而Windows应用程序的结构可以用下面的框图来表示。 WinMain Windows Function 图3-1 Windows应用程序的结构有两个函数所组成,一个是WinMain函数,另一个称为窗口函数,又称窗口消息处理程序。,3.1.2 Windows应用程序的编译和C语言程序编译的比较,C语言的编译图示 (请见教材程序3C语言的编译用图表示如下.doc Windows应用程序编译图示(请见教材程序3Windows应用程序编译系统.doc). Windows应用程序编译系统工作步骤(请见教材程序3编译系统的工作过程.doc)。,编译应用程序所需的六个基本文件,什么资源文件与资源描述文件(.RC)?在编译中的作用? 模块定义文件(.DEF)的结构(请见教材程序3模块定义文件.doc)和在编译中的作用? 头文件(.H)的作用? WINDOWS.H头文件 (请见教材程序3WINDOWS.H头文件.doc)。 WINDEF.H头文件(请见教材程序3WINDEF.头文件.doc)。 项目文件(.MAKE)在编译中的作用?,3.2 Windows 应用程序设计接口(API),学习API的重要性。 简要介绍两种API。 每个API主要有哪三个文件(请见教材程序3三个核心API组件.doc)。 每个文件的作用。,3.3 标识符的匈牙利命名惯例,为什么此惯例称为匈牙利命名惯例。 匈牙利命名惯例的两条约定。 要熟悉很多习惯用法。例如WPARAM和LPARAM 是习惯用法。 按照匈牙利命名惯例常用变量的字首(请见教材程序3常用变量的字首.doc,3.4 事件驱动程序设计,什么是事件驱动程序设计,它与传统程序设计有什么区别。 解释图3-4的工作原理(请见教材程序3事件驱动程序的工作原理.doc)。 消息与消息处理是实现事件驱动的关键。,3.5 动态链结和动态链结库,静态连接和动态连接的基本概念。 如何进行链结。 如何建立DLL文件请见其他有关文章和书籍。,3.6 PASCAL与WINAPI调用规范,什么是C调用规范。 Win 16中的PASCAL调用规范(_cdecl )。 Win 32中的PASCAL调用规范(_stdcall )。 Win32中的WINAPI调用规范(_stdcall ) 。 比较C,_cdecl ,_stdcall 三种调用规范。 调用规范的同义词(请见教材程序3调用规范的同义词.doc)。,3.7 Windows应用程序的工作原理,句柄与代号 。 單一应用程序情况下输入消息的获得与处理(请见教材程序3單一应用程序情况.doc) 。 消息循环程序及其解释(请见教材程序3消息循环.doc)。 应用程序的结束(请见教材程序3应用程序的结束.doc)。 窗口类的作用及其用法初步,3.8 窗口类的作用及其用法初步,每个Windows应用程序(或进程)都要有一个窗口,每个窗口代表一个应用程序。 窗口类结构与窗口类是不同又有联系的概念。 应用程序建立窗口的大概过程。,练习 3,1. 16位和 32位Windows 操作系统对应用程序的支持有什么不同? 2. Windows应用程序的编译和C语言程序编译有什么不同? 3. 资源描述文件的作用是什么?资源编译器的功能是什么? 4. 资源文件与资源描述文件(.RC)的区别? 5. 模块定义文件(.DEF)在编译中的作用? 6. WINDOWS.H头文件的作用?WINDEF.H中定义了那些东西?WINNT.H头文件的作用? 7.项目文件的作用? 8. 简述程序设计接口(API)的组成情况 9. 讲讲匈牙利命名惯例的约定,还要记住那些习惯用法? 10. 解释事件驱动程序的原理,并和过程式程序进行比较 11. 何谓动态连接?何谓静态连接?动态连接库文件的后缀是什么? 12. Win32里,微软设计者们又定义了一种新的调用规范,用什么符号表示? 13. 介绍PASCAL调用规范,C调用规范(用_cdecl表示),_stdcall调用规范 14. W32中有那些识别字都定义成_stdcall 15. 消息循环从应用程序消息队列取得窗口消息是怎样送給窗口消息处理程序?,第 4章 应用程序(HELLOWIN.c)的分析,本章详细地介绍HELLOWIN.C中的窗口类结构以及各个条款的作用和意义并介绍根据窗口类结构创建窗口的方法 HELLOWIN.C(教材程序44-HELLOWIN.C.doc)的WinMain函数分成:定义变量, 定义窗口类变量,填写窗口类条款,注册窗口类,创建窗口, 在屏幕上显示窗口,消息循环等七段, 本章对它们进行了解释.并初步介绍与HELLOWIN.C密切联系的窗口函数WndProc,使大家对窗口消息的处理有一个基本认识.通过本章的学习使大家对Windows应用程序的整体结构,组成,工作原理有一个粗浅的认识. WinMain函数是应用程序的入口点, 其关键作用是为Windows应用程序创建窗口和进行消息循环。,4.1 HELLOWIN.c应用程序(请见教材程序44-HELLOWIN.C.doc),Windows是一个多任务操作系统,每一个作业都需要在屏幕上运行一个窗口,这个窗口用于显示作业运行的情况,显示运行结果,用于运行时和用户交互的界面,相反,屏幕上的每一个窗口都联系着一个作业。所以,每一个应用程序都应包括HELLOWIN.C程序中的WinMain函数代码的大部分。,4.2 WinMain函数的四个参数,Windows程序的进入点是WinMain,它的四个参数介绍(请见教材程序4WinMain函数.doc)。 在32位Windows版本中第二个参数总是NULL ?,4.3 窗口类结构WNDCLASS,窗口类结构与窗口类的联系 和区别? 窗口类结构是内定的。 WNDCLASS结构是如何用软件实现的?(请见教材程序4WNDCLASS的实现.doc)。,4.4 WNDCLASS各条款介绍,WNDCLASS结构请见教材程序4窗口类结构.doc。 第1个条款是wndclass.style 它用 CS_HREDRAW | CS_VREDRAW 填写,前缀CS_代表class style ,用前缀CS_定义的识别字请见教材程序4以CS_为字首的识别字.doc。 其他各条款介绍。,4.5,4.6 节介绍,4.5 与窗口有关的识别字的介绍,请见教材程序4与窗口有关的识别字.doc。 4.6 和窗口有关的几种结构请见教材程序4与窗口有关的几种结构.doc。,4.7 ,4.8,4.9 节,代号是什么? HELLOWIN.c中用的代号请见教材程序4代号.doc。 HELLOWIN至少调用了18个函数调用, 请见教材程序4函数调用.doc。 解释为什么要注册窗口类,如何注册窗口类?,4.10,4.11,4.12 介绍,用CreateWindows 创建窗口,CreateWindows 介绍请见教材程序4CreateWindows函数.doc。 显示窗口用那个函数? 解释基本消息循环及SMG结构请见教材程序4消息循环与MSG结构.doc。,4.13 窗口函数,窗口函数是处理消息的函数,窗口函数确定了在窗口显示区域内显示什么以及窗口怎样响应用户的输入。 窗口函数的基本结构 使用switch和case结构来确定窗口函数接收的消息并处理它 。 窗口消息WM_CREATE , WM_PAINT消息 ,WM_DESTROY消息 是什么情况下产生?做些什么事?,HELLOWIN.C的解释(请见教材程序44-HELLOWIN.C.doc),/ 1 定义应用程序要用的变量 /2 WNDCLAS是Windows中的窗口类结构名,这一段是定义窗口类变量 / 3 根据窗口类结构填写各条款,形成初始化的窗口类 /4 进行注册,注册失败则输出信息并返回操作系统。注册成功,则跳过if循环*/ /5 根据窗口类建立窗口 / 6 在屏幕上显示窗口 / 7 消息循环,练习 4,1. 讲解Windows程序的结构, Windows程序的进入点是哪个函数? 2. 窗口类结构名WNDCLASSA和WNDCLASSW的应用场合? 3. 解释窗口类结构名与窗口类变量,为什么要填写窗口类条款?注册的作用是什么? 4. 用哪个函数创建窗口?它有几个参数?请解释每一个参数? 5.应用程序中用的窗口类名从那里取得? 6. 主程序WinMain和WndProc是如何联系的? 7. 解释消息循环中的几个函数? 8. 请问:为什么DispatchMessage函数要调用操作系统来完成它所要的工作,而它不直接去完成呢? 9.解释下面函数申明中的每一个单词 int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nShowCmd ) ;,第 5 章 Windows操作系统中的窗口类,本章对窗口类作了介绍和分析,例举了多种形式的窗口类,对窗口类和窗口类结构在概念上的联系和区别作了介绍,这是学生和自学人员容易搞错的。 对填写窗口类条款所经常要遇到的四 个函数作了介绍.在对窗口类条款作深入介绍的基础上.对应用程序的其他部分,如窗口的风格,窗口的显示,消息循环等,在第四章的基础上本章也都作了补充。,5.1 窗口类概述,系统全局窗口类(System Global Class)是系统内定的窗口类,预先定义好的窗口类共有七种(请见教材程序5预先定义窗口类.doc)。 应用程序局部应用窗口类(Application Local Class)这是进程注册窗口类,开始于进程的建立终止于进程的结束。 应用程序全局应用窗口类(Application Global Class)应用程序的第1个进程生成的窗口类,其他进程用不到再注册,可以直接应用。当窗口式样条款中加入CS_GLOBALCLASS识别字时,注册的窗口类就是应用程序全局应用窗口类,5.2 几种窗口类结构介绍,Win95中的窗口类结构(请见教材程序5Win95中的扩展窗口类结构.doc。 窗口类条款的补充说明。 Windows NT 中的窗口类结构(请见教材程序5Windows NT 中的窗口类.doc)。,几个与窗口类有关的函数,LoadIcon函数请见教材程序5LoadIcon函数.doc LoadImage()函数请见教材程序5LoadImage.doc LoadCursor()函数请见教材程序5LoadCursor.doc CreateSolidBrush()函数请见教材程序5CreateSolidBrush.doc,窗口类的式样,表5-6的解释,请见教材程序5表5_6.doc。 表5-7的解释,请见教材程序5表5_7.doc。 ShowWindow 函数的用法,练习 5,1. Window应用程序是否一定要用WinMain主函数,WinMain函数的作用是什么? 2. Window应用程序中是否所有的标识符都按照”匈牙利命名惯例”来拼写? 3. 解释系统全局窗口类,应用全局窗口类,应用专用窗口类? 4. WinMain()的语法在16位Windows和32位Windows里是完全一致的,但是两者之间内在的差别是很大的,差别是什么? 5. 32位Windows支持哪三种窗口类?讲述每种窗口类的用法 6. 为什么要设计窗口类? 7.请你解释一下下面三个窗口类条款 WNDPROC lpfnWndProc LPCSTR lpszClassName HINSTANCE hInstance 8. 请你解释窗口类的每个条款 9. 解释窗口类结构名和窗口类名 10. 窗口类结构中常用的有那几个载入函数?它们的用法如何? 11. 为什么不提倡一个应用程序注册两个或两个以上主窗口? 12. CreateWindowEx中有两个窗口风格,试介绍它们。 13. CreateWindowEx函数有12个参数,它们是否和扩展窗口类中的条款一样?要好好区别它们。 14. 应用程序中如何做到不用ShowWindow?并解释ShowWindow?,第6章 输出,在多任务环境下,屏幕,打印机等硬件设备都是许多应用程序共享的,因此,任何一个应用程序都不能任意地进行输出操作, 所有的输出,如屏幕,打印机,绘图机等,都必须通过GDI(图形设备接口(GRAPHISC DEVICE INTERFACE )函数来完成输出. 本章表面上是讨论的字符串输出,实际上是讨论与设备无关的程序设计基础。本章例举了三个例程来说明应用程序的输出。,6.1 客户区的绘制和更新,Windows是通过发送WM_PAINT消息給窗口函数,使得窗口显示输出。在初始化阶段都要调用函数UpdateWindow,执行这个函数的结果是Windows向窗口函数发送第一个WM_PAINT消息。其他还有很多情况(?)Windows向窗口函数发送WM_PAINT消息,使得被覆盖的部分客户区得以重新绘制。 有效矩形和无效矩形,6.2 GDI简介,所有输出都要通过GDI函数,当执行GDI函数输出时,可得到与设备无关的输出,其实现是源于Windows系统中为每一个设备建立一个数据结构,这个结构记录了设备输出时的详细要求,例如,输出时文字的颜色,线条的宽度,画图的坐标,以及输出时调用的驱动程序等,这个数据结构称为设备描述表,简称DC。Windows系统中使用设备就抽象成使用DC。这种把设备抽象成为DC是实现设备无关性的关键。每个输出用的GDI函数其第1个参数就是hdc, hdc 是指向DC的指针,GDI函数通过设备进行输出就变成通过DC进行输出。 同样,要输出都得要考虑在那个窗口上输出,为此要为每个输出窗口建立一个数据结构绘图信息结构(PAINTSTRUCT) 。,6.2.2 获得hDC代号的方法。,1. 利用GetDC(hWnd)取得窗口hDC. 2. 处理WM_PAINT消息期间用 BeginPaint获得hDC的方法。 . 3 在处理非WM_PAINT消息期间获得hDC的方法,6.2.3 绘图信息结构(PAINTSTRUCT),绘图信息结构(PAINTSTRUCT)及其应用。 (请见教材程序6绘图信息结构.doc)。,6.3 TextOut函数。,TextOut是在屏幕上显示文字的最常用的GDI函数。语法是: TextOut (hdc, x, y, psText, iLength) hdc屏幕也是设备。 1. hDC就是屏幕的设备描述表代号 2. x, y是客户区内输出字符串的开始地址,x是 水平地址,y是垂直地址 , 3. psText参数是指向需要在窗口显示的 字符串 的指针 , 4. iLength是输出字符串中字符的个数,6.4 重画区域的设定,WM_PAINT窗口消息并非只来源于Windows系统,它们可以使用InvalidateRect或InvalidateRgn函数直接产生并送消息队列。一般是先设定一个重画区,然后再用它们中的一个送 WM_PAINT消息到消息队列,再排队进入窗口函数并在这个分支中进行重画。 InvalidateRect设定的重画区是矩形,InvalidateRgn函数设定的重画区为不规则区域。,6.5.3 系统字体,字体的基本概念 字体参数存贮在TEXTMETRIC类型的结构中(请见教材程序6TEXTMETRIC.doc)。 用五个参数表示字体尺寸(请见教材程序6用五个参数表示字体尺寸.doc)。 格式化文字输出(请见教材程序6格式化文字输出.doc)。,6.6字体显示的综合使用SYSMETS1.c,视觉元件信息表(SYSMETS.h)请见教材程序6SYSMETS.H.doc) 。 SYSMETS1.c程序(教材程序66-2 SYSMET1.C.doc) 阅读SYSMETS1.c。 SYSMETS1.c窗口函数的分析。 SYSMETS1.c程序存在问题。,6.8 滚动条的使用,滚动条的范围和地址,图6-6 的解释(请见教材程序6图 6-6.doc。 滚动条消息WM_VSCROLL(供上下移动)和WM_HSCROLL(供左右移动)消息 。 通知码的解释,图6-7的解释(请见教材程序6图67.doc)。 在SYSMETS1.C中加入滚动功能 (教材程序66-3 SYSMETS2.C.doc) WM_VSCROLL消息
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 出租车劳动合同范本2篇
- 瓶式氧气吸入课件
- 安全施工培训内容记录课件
- 农业碳汇项目融资策略与风险管理研究报告
- 农业现代化背景下2025年智能农业种植风险防控与绿色生产方案报告
- 球团厂安全规程培训
- 安全教训培训工作通报课件
- 房屋室内拆除工程方案(3篇)
- 以不变的精神面对变化的时代
- 比较教学法在高中语文课堂中的应用
- 洁净室区甲醛熏蒸消毒标准操作规程
- 4.1 整式(第1课时 单项式) 课件 七年级数学上册 (人教版2024)
- 中国急性缺血性卒中诊治指南(2023)解读
- 常熟理工学院图书馆考试完整题库
- 招聘诚信承诺书
- 装配式混凝土检查井施工及验收规程
- 2024小红书无货源精细化铺货实战课程
- 任正非的创业故事
- 学生实习家长知情同意书(完美版)
- 涉警网络负面舆情应对与处置策略
- 《英国政党制度》课件
评论
0/150
提交评论