版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机窗口技术基础第一讲Windows程序设计基础12Windows程序设计基础
Windows系统是一个基于视窗的消息驱动系统,即使功能大异的Windows程序都有比较规范统一的程序界面,如窗口、菜单、工具条、对话框等。Windows程序的设计其实比较规范,但若不了解Windows程序的基本结构,程序调度的基本方法(即消息驱动的基本原理),以及每个程序都会用到的基本数据结构,也很难编写出有用的Windows程序来。之所以在本章介绍API程序,就是基于上述考虑而设计的,尽管API程序设计在实际编程过程中已越来越少用了,但它却是理解Windows程序设计基本原理的最佳捷径,因为所有Windows程序的结构和执行过程最终大同于API程序。在此基础上学习MFC及其它在Windows程序设计语言如JAVA,都是大有帮助的!31.Windows程序设计基础Windows系统的特点标准的用户界面多任务设备独立性动态链接强大的内存管理41Windows程序设计基础2.基本术语窗口(Window)由句柄唯一标识对话框(Dialog)人机交互图标(Icon)代表某一项操作或程序的图符位图(Bitmap)用位模式形成的图像菜单(Menu)命令工具栏(ToolBar)常用的菜单项状态栏(StateBar)操作状态或操作提示51.1窗口窗口是Windows程序的基本单元,Windows程序的运行过程就是窗口内部、窗口之间及窗口与用户之间的信息交换过程。窗口通常包括菜单、工具条、滚动条、状态栏、命令按钮、对话框等元素。61.2事件驱动和消息响应1.事件事件是指人们应用计算机的过程中发生的操作,如按下键盘上的某个按键、移动鼠标、单击鼠标左键、移动窗口及选择程序菜单等操作都是事件。2、事件驱动每发生一个事件,就会产生一个与之对应的特定消息,该消息会被Windows系统捕获,然后将通过此消息调用执行与之对应的程序代码,实现相应的程序功能。因为从事件发生到相应程序代码被调用执行都是通过消息来实现的,因此事件驱动也常被称为消息驱动71.2事件驱动和消息响应3、消息队列用于存放消息的队列,消息系统由Windows系统自动建立和维护。Windows消息队列的类型系统消息队列:由Windows系统维护管理的消息队列,每当有消息发生时,该消息将首先被存入系统消息队列。应用程序消息队列:Windows系统会为每个应用程序建立一个独立的消息队列,用于存放该应用程序的消息。81.2事件驱动和消息响应4、消息循环每个应用程序都有一个循环机构,该循环机构则不断地重复查看程序自身的消息队列,如果队列中有消息,就将其取出并执行相应的消息处理代码,这个处理消息的循环机构称为消息循环。
91.2事件驱动和消息响应5、Windows程序调度的基本原理每个Windows程序启动后,就等待用户在其窗口中进行操作。每个操作会引发一个事件,就会产生一个与之对应的特定消息。该消息会被Windows系统捕获。Windows系统对捕获的消息进行分析后,会将消息传递给产生它的应用程序的消息队列,每个应用程序的消息循环机构不断地重复查看它自已的消息队列,如果队列中有消息,就将其取出并执行相应的消息处理代码,如果队列中没有消息就等待,当队列中有消息时就又处理它,如此循环往复,直至程序结束。101.2事件驱动和消息响应6、事件驱动及消息循环的基本原理111.2事件驱动和消息响应7、DOS和Windows程序执行方式对比121.3Windows程序的构成1、Windows程序的组成程序代码程序代码是程序的主体,用于实现程序的功能资源Windows程序具有标准规范的应用程序界面,每个Windows程序常常包含了许多相同的组成元素,如菜单、对话框、工具栏、应用程序图标、鼠标光标、程序版本信息等,这些组成元素被Windows从程序代码中独立出来,并以各种不同扩展名的文件形式存在,如.ico(图标)、.bmp(位图)、.cur(光标)等,Windows系统称之为资源资源则可以在需要时才通过相关命令加载到程序中。13.libCruntimeDllimport.RC资源编译器.DLGDialogEditor*.obj*.exe.res.DEF资源连接器ImageEditorFontEditor.BMP.ICO.CUR.FON.h.c/cppc编译器2、Window程序的编译链接过程141.4VC++的Windows程序设计方法1.API程序设计API即ApplicationProgrammingInterface(应用程序编程接口),它是Windows操作系统和Windows应用程序之间的标准接口,在应用程序中可以通过API访问Windows提供的各种函数、宏及数据结构。API函数保存在一些动态链接库中,每个Windows程序都要用到的动态链接库有USER32.Dll、GDI32.Dll、KERNEL32.Dll。API程序设计就是直接利用Windows系统提供的API函数,编写能够在Windows系统中运行的程序。151.4VC++的Windows程序设计方法2.MFC程序设计MFC是MicrosoftFoundationClasses的缩写,即微软基础类库。MFC是建立在API基础上的C++类库,它对Windows提供的API函数、数据结构、各种控件按功能进行了分类,利用面向对象技术将它们封装在不同的类中,并通过继承将这些类组织在一起。MFC不仅把API函数封装成了易于使用的类,而且还提供了建立Windows应用程序的框架结构,以及建立应用程序的各种组件,简化了Windows程序设计的难度。
1.4VC++的Windows程序设计方法3.其他桌面编程方法及语言简要介绍DELPHI:是Windows平台下著名的快速应用程序开发工具(RapidApplicationDevelopment,简称RAD)。它的前身,即是DOS时代盛行一时的“BorlandTurboPascal”,最早的版本由美国Borland(宝兰)公司于1995年开发。主创者为AndersHejlsberg。经过数年的发展,此产品也转移至Embarcadero公司旗下。Delphi是一个集成开发环境(IDE),使用的核心是由传统Pascal语言发展而来的ObjectPascal,以图形用户界面为开发环境,透过IDE、VCL工具与编译器,配合连结数据库的功能,构成一个以面向对象程序设计为中心的应用程序开发工具1.4VC++的Windows程序设计方法“真正的程序员用VC,聪明的程序员用Delphi”。和VC相比,Delphi更简单、更易于掌握,而在功能上却丝毫不逊色;和VB相比,Delphi则功能更强大、更实用。可以说Delphi同时兼备了VC功能强大和VB简单易学的特点。Delphi具有以下特性:基于窗体和面向对象的方法,高速的编译器,强大的数据库支持,与Windows编程紧密结合,强大而成熟的组件技术。但最重要的还是ObjectPascal语言,它才是一切的根本。ObjectPascal语言是在Pascal语言的基础上发展起来的,简单易学。1.4VC++的Windows程序设计方法(1)直接编译生成可执行代码,编译速度快。由于Delphi编译器采用了条件编译和选择链接技术,使用它生成的可执行程序更加精炼,运行速度更快。(2)提供了许多快速方便的开发方法,使开发人员能用尽可能少的重复性工作完成各种不同的应用。利用项目模板和专家生成器可以很快建立项目的构架,然后根据用户的实际需要逐步完善。(3)具有可重用性和可扩展性。开发人员不必再对诸如标签、按钮及对话框等Windows的常见部件进行编程。Delphi包含许多可以重复使用的部件,允许用户控制Windows的开发效果。(4)具有强大的数据存取功能。(5)拥有强大的网络开发能力,能够快速的开发B/S应用,它内置的IntraWeb和ExpressWeb使得对于网络的开发效率超过了其他任何的开发工具。1.4VC++的Windows程序设计方法(7)Delphi使用独特的VCL类库,使得编写出的程序显得条理清晰,VCL是现在最优秀的类库,它使得Delphi在软件开发行业处于一个绝对领先的地位。(8)从Delphi8开始Delphi也支持.Net框架下程序开发1.4VC++的Windows程序设计方法3.其他桌面编程方法及语言简要介绍C++Builder:C++Builder是由Borland公司推出的一款可视化集成开发工具。C++Builder具有快速的可视化开发环境:只要简单地把控件(Component)拖到窗体(Form)上,定义一下它的属性,设置一下它的外观,就可以快速地建立应用程序界面;C++Builder内置了100多个完全封装了Windows公用特性且具有完全可扩展性(包括全面支持ActiveX控件)的可重用控件;C++Builder具有一个专业C++开发环境所能提供的全部功能:快速、高效、灵活的编译器优化,逐步连接,CPU透视,命令行工具等。它实现了可视化的编程环境和功能强大的编程语言(C++)的完美结合。1.4VC++的Windows程序设计方法C++Builder优化的32位原码(NativeCode)编译器建立在Borland公司久经考验的编译技术基础之上,提供了高度安全性、可靠性、快速性的编译优化方法,完全编译出原始机器码而非中间码,软件执行速度大大提高。在编译和连接过程中,C++Builder自动忽略未被修改的原代码和没有使用的函数,从而大大提高了编译和连接速度。C++Builder的CPU透视工具包括五个独立的小面板,可以对正在运行程序从内部进行深层次的了解。另外C++Builder还提供了一个专业开发环境所必需的命令行工具,以帮助建立C++程序或者准备编译和连接的程序进行更精细的控制。1.4VC++的Windows程序设计方法3.其他桌面编程方法及语言简要介绍VisualBasic:VisualBasic是一种由微软公司开发的包含协助开发环境的事件驱动编程语言。从任何标准来说,VB都是世界上使用人数最多的语言——不仅是盛赞VB的开发者还是抱怨VB的开发者的数量。它源自于BASIC编程语言。VB拥有图形用户界面(GUI)和快速应用程序开发(RAD)系统,可以轻易的使用DAO、RDO、ADO连接数据库,或者轻松的创建ActiveX控件。程序员可以轻松的使用VB提供的组件快速建立一个应用程序。
1.4VC++的Windows程序设计方法缺点:1.属于解释型语言,可执行程序中包含的并非是机器码,因此需要VB运行库的解释执行,边解释边执行,因此执行效率较慢,不适宜快速反应的硬件底层控制软件设计。2.
VisualBasic语言具有不支持继承、无原生支持多线程、异常处理不完善等三项明显缺点。3.无法学到良好的编程习惯,不利于培养良好的编程习惯,无视程序设计技术和结构。优点:1.开发快速简便,上手快。2.界面编程极为迅速。1.4VC++的Windows程序设计方法3.其他桌面编程方法及语言简要介绍QT:Qt是1991年奇趣科技开发的一个跨平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。Qt很容易扩展,并且允许真正地组件编程。基本上,Qt同XWindow上的Motif,Openwin,GTK等图形界面库和Windows平台上的MFC,OWL,VCL,ATL是同类型的东西。
1.4VC++的Windows程序设计方法Qt支持下述平台:MS/Windows-95、98、NT
4.0、ME、2000、XP、Vista和Win7Unix/X11-Linux、Sun
Solaris、HP-UX、CompaqTru64UNIX、IBM
AIX、SGIIRIX、FreeBSD、BSD/OS和其它很多X11平台Macintosh-
MacOSXEmbedded-有帧缓冲(framebuffer)支持的嵌入式Linux平台,WindowsCEAndroid1.4VC++的Windows程序设计方法3.其他桌面编程方法及语言简要介绍VisualC#:是微软开发的一种面向对象的编程语言,是微软.NET开发环境的重要组成部分。而MicrosoftVisualC#2005是微软开发的C#编程集成开发环境(同种产品还有Borland公司的C#Builder),它是为生成在.NETFramework上运行的多种应用程序而设计的。C#简单、功能强大、类型安全,而且是面向对象的。C#凭借它的许多创新,在保持C样式语言的表示形式和优美的同时,实现了应用程序的快速开发。VisualStudio包含VisualC#,这是通过功能齐全的代码编辑器、项目模板、设计器、代码向导、功能强大且易于使用的调试器以及其他工具实现的。通过.NETFramework类库,可以访问多种操作系统服务和其他有用的精心设计的类,这些类可显著加快开发周期。1.4VC++的Windows程序设计方法C#看起来与Java有着惊人的相似;它包括了诸如单一继承、接口、与Java几乎同样的语法和编译成中间代码再运行的过程。但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司.NETwindows网络框架的主角。C#是一种安全的、稳定的、简单的、优雅的,由C和C++衍生出来的面向对象的编程语言。它在继承C和C++强大功能的同时去掉了一些它们的复杂特性(例如没有宏以及不允许多重继承)。C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言1.4VC++的Windows程序设计方法3.其他桌面编程方法及语言简要介绍JAVA:Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由SunMicrosystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaSE,JavaEE,JavaME)的总称。Java技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。Java由四方面组成:Java编程语言、Java类文件格式、Java虚拟机和Java应用程序接口(JavaAPI)。1.4VC++的Windows程序设计方法Java平台由Java虚拟机(JavaVirtualMachine,简称JVM)和Java应用编程接口(ApplicationProgrammingInterface,简称API)构成。Java应用编程接口为Java应用提供了一个独立于操作系统的标准接口,可分为基本部分和扩展部分。在硬件或操作系统平台上安装一个Java平台之后,Java应用程序就可运行。现在Java平台已经嵌入了几乎所有的操作系统。这样Java程序可以只编译一次,就可以在各种系统中运行。Java应用编程接口已经从1.1x版发展到1.2版。目前常用的Java平台基于Java1.4,最近版本为Java1.7。1.4VC++的Windows程序设计方法Java分为三个体系J2SE(Java2PlatformStandardEdition,java平台标准版),J2EE(Java2Platform,EnterpriseEdition,java平台企业版),J2ME(Java2PlatformMicroEdition,java平台微型版)。un公司对Java编程语言的解释是:Java编程语言是个简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的语言。1.4VC++的Windows程序设计方法3.其他桌面编程方法及语言简要介绍WPF:WPF(WindowsPresentationFoundation)是微软推出的基于WindowsVista的用户界面框架,属于。NETFramework3.0的一部分。它提供了统一的编程模型、语言和框架,真正做到了分离界面设计人员与开发人员的工作;同时它提供了全新的多媒体交互用户图形界面。由.NETFramework3.0开始引入,与WindowsCommunicationFoundation及WindowsWorkflowFoundation并行为新一代Windows
操作系统以及WinFX的三个重大应用程序开发类库。基于DirectX9/10技术的WPF不仅带来了前所未有的3D界面,而且其图形向量渲染引擎也大大改进了传统的2D界面,比如Vista中的半透明效果的窗体等都得益于WPF。WindowsXP、WindowsServer2003和以后所有的Windows
操作系统版本都可以使用它。1.4VC++的Windows程序设计方法WPF其实不仅仅是图形引擎而已,它将给Windows应用程序的开发带来一次革命,因为新的架构提供了一种全新的开发模式。当然对于普通用户而言,最直观的就是界面越来越漂亮,看起来越来越舒服了;但对于开发人员而言,界面显示和代码将更好的得到分离,这与从前的桌面应用程序开发有很多不同(界面设置和代码是融合在一起的),这是比较具有革命性的改变之一。还有就是桌面应用程序和浏览器应用程序的融合,根据ms的承诺,正在开发中的WPF/E,即WPFEverywhere版本,将为基于WPF的应用程序提供全面的浏览器支持,这意味着未来开发出的应用程序将可以基于浏览器在不同的操作系统上运行,当然由于目前还在开发中,并不确定会不会有一定的限制,根据WPF/E开发组的定义,WPF/E仍然是WPF的子集,而不是后继版本。总体而言,WPF的前景应该是一片光明。331.句柄句柄是整个Windows编程的基础。一个句柄是指Windows使用的一个唯一的整数值,是一个4字长(32位无符号整数)的数值,用于标识应用程序中不同的对象和同类对象中不同的实例。如标识一个窗口、按钮、图标、滚动条、输入/输出设备、控件或文件等。应用程序通过句柄能够访问相应的对象信息。2Windows程序设计的常用数据结构34常用的句柄类型HWND 标识窗口句柄HINSTANCE 标识当前实例句柄HCURSOR 标识光标句柄HFONT 标识字体句柄HPEN 标识画笔句柄HBRUSH 标识画刷句柄HDC 标识设备环境句柄HBITMAP 标识位图句柄HICON 标识图标句柄HMENU 标识菜单句柄HFILE 标识文件句柄2Windows程序设计的常用数据结构35关键字 类型 等价于BOOL 逻辑类型 intBOOLEAN 逻辑 BYTEBYTE 字节 unsingedcharCHAR 字符 charDOUBLE 双精度 doubleDWORD 双字 unsignedlongFLOAT 浮点数 floatHANDLE 句柄 2.2常用数据类型36INT 整数 intLONG 长整数 longSHORT 短整数 short UCHAR 无符号字符 unsingedcharUINT 无符号整数 unsingedintULONG 无符号长整数 unsignedlongUSHORT 无符号短整数 unsigendshortVOID voidWCHAR 双字节码 unsignedshortWCHAR_T 双字节码 unsignedshortWORD 字 unsignedshort37WPARAM 消息参数 UINTLPARAM 消息参数 LONGLRESULT 消息返回值 LONG HINSTANCE 实例句柄 unsignedlongHWAND 窗口句柄 unsignedlongHDC 设备环境句柄 unsignedlongTCHAR 字符 charLPSTR 字符指针 char*LPCSTR 常量字符指针 constchar*LPTSTR 字符指针 TCHAR*LPVOID 无类型指针 void*LPCVOID 无类型长指针 constvoid*38(1)坐标结构typedefstructtagPOINT{
LONGx;
LONGy;}POINT;注:在MFC中还有一个类CPoint,与POINT结构近似,但它有许多成员函数。(2)长、宽尺寸结构:CSIZE,Csize;typedefstructtagSIZE{
intcx;
intcy;}SIZE;2.3点和矩形区域39(3)记录矩形区域结构RECT和CrecttypedefstructtagRECT{
LONGleft;
LONGtop;
LONGright;
LONGbottom;}RECT;
在MFC中Crect与此类似,但有成员函数。
LPRECT为指针RECT类型的常数指针。(4)颜色COLORREF32-bitvalueusedtospecifyanRGBcolor.
例:COLORREFRGB(BYTEbRed,BYTEbGreen,BYTEBblue);
402.4窗口结构typedefstruct{
UINTstyle;
//窗口类型
WNDPROClpfnWndProc;
//窗口函数指针
intcbClsExtra;//为类结构的预留额外空间
intcbWndExtra;
//为窗口结构预留额外空间
HANDLEhInstance;
//窗口类的应用实例句柄
HICONhIcon;
//图标句柄
HCURSORhCursor;
//窗口类的光标
HBRUSHhbrBackground;//窗口类的背景刷
LPCTSTRlpszMenuName;
//菜单资源名
LPCTSTRlpszClassName;
//窗口类名}WNDCLASS;
412.4窗口结构WNDCLASS中的style代表窗口类型,可取下面的值:WS_CHILD 子窗口(不能与WS_POPUP同时使用)WS_BORDER 带边框的窗口WS_CAPTION 带标题栏的窗口WS_HSCROLL 带有水平滚动条的窗口WS_MAXIMIZE 最大尺寸的窗口WS_MAXIMIZEBOX 带最大化框的窗口WS_MINIMIZE 最小尺寸的窗口WS_MINIMIZEBOX 带最小化框的窗口WS_OVERLAPPED 带边框和标题栏的窗口WS_OVERLAPPEDWINDOW 带边框、标题栏、系统菜单及最大、最小化框的窗口WS_POPUP 弹出式窗口WS_POPUPWINDOW 带边框和系统菜单的弹出式窗口WS_SYSMENU 带系统菜单的窗口WS_VSCROLL 带垂直滚动条的窗口421、消息结构:MSGtypedefstructtagMSG{
HWND
hwnd;//消息发向的窗口句柄
UINT
message;//消息标识符
WPARAMwParam;//16位的消息参数,值因消息异
LPARAMlParam;//32位的消息参数,值因消息异
DWORD
time;
//消息放入消息队列的时间
POINT
pt;//消息放入消息队列的鼠标位置}MSG;
说明:WPARAM含义和数值因消息不同而不同比如:键盘消息和鼠标消息所对应的WPARAM消息所代表的消息是不同的。2.5消息432.5消息2、MSG中的域说明hwnd是一个窗口句柄,用于标识消息发向的窗口。time用于保存消息放进消息队列的时间。pt用于保存将消息放入消息队列时的鼠标位置。message是消息标识符,它是一个32位的无符号整数。Windows中的每条消息都有一个对应的消息标识符,这些标识符是在windows.h中定义的。443、消息的种类
标准Windows消息除WM_COMMAND外,所有以WM_为前缀的消息,由窗口和视图处理。控制消息由控件和子窗口发给父窗口的消息。命令消息来自用户接口对象。如:菜单、工具条和加速键等。2.5消息452.5消息4、常见消息前缀的含义BM表示按钮控制消息CB组合框控制消息EM编辑框控制消息LB列表控制消息SBM滚动条控制消息WM窗口消息462.5消息5、Windows常用鼠标消息WM_LBUTTONDBLCLKWM_LBUTTONDOWNWM_LBUTTONUPWM_MBUTTONDBLCLKWM_MBUTTONDOWNWM_MBUTTONUP
WM_RBUTTONDBLCLKWM_RBUTTONDOWNWM_RBUTTONUP472.5消息6、Windows常用键盘消息WM_KEYUPWM_KEYDOWN
按下非系统键时产生此消息,系统键是指实现系统操作的组合键,如Alt和F1相结合的按钮键。附加参数wParam为按下键的虚拟键码,lParam记录按钮的重复次数、先前状态等。WM_KEYUP是释放按键时的键盘消息,其含义同WM_KEYDOWN。
WM_CHAR按下非系统键时产生的消息,附加参数wParam为按键的ASCII码,lparam同前。487、其它常用Windows常用消息WM_CREATECreateWindow函数发生的消息。WM_CLOSE关闭窗口时产生的消息,如有子窗口,也一起删除。WM_DESTROY关闭窗口时产生的消息WM_PAINThdc=(HDC)wParam;//发生用户区域移动或显示事件、用户窗口改变大小的事件、程序通过流动条滚动窗口,覆盖在窗口上面的其它对象(如菜单)移开时,都会产生此消息!.2.5消息498、消息的产生用户产生消息
Windows本身产生消息应用程序本身产生消息其他应用程序产生消息9、消息的传递Windows系统有一个存放消息的队列,每个应用程序也有一个消息队列。Windows系统先将收到的消息存放在系统队列中;然后再分发到相应的应用程序队列中。应用程序则从自身的队列中获取消息并进行处理。10.2.5消息5010、消息的处理通常每个Windows应用程序至少对应一个窗口,每个窗口都要有一个窗口函数负责处理该窗口内所发生的事件。每个窗口至少有一个窗口函数,负责处理该窗口的所有消息。2.5消息511、Windows标识符常用命名规则函数命名规则函数名=动词+名词动词和名词的第一个字母必须大写例GetMessage变量命名规则小写字母前缀表示变量的类型,其余的部分描述变量的功能例nCount匈牙利命名法变量名以小写字母或代表数据类型的小写字母开头.Eg:szCmdLine补充:Windows程序的名字52前缀代表的数据类型ccharorWCHARorTCHARbyBYTE(unsignedchar)nshortiintx,yintusedasx-coordinateory-coordinatecx,cyintusedasxorylength;cstandsfor"count"borfBOOL(int);fstandsfor"flag"wWORD(unsignedshort)lLONG(long)dwDWORD(unsignedlong)fnfunctionsstringszstringterminatedby0characterhhandleppointer2、Windows程序常见名字前缀的含义533Windows程序的基本结构1、简单的Windows程序至少包含两个函数:WinMain():必有且仅有一个。是程序执行的入口点,类似于C程序中的main函数窗口函数
:每个窗口对应一个窗口函数,以响应该程序窗口中发生的事件消息。2、WinMain()函数需完成的功能定义窗口类注册窗口类建立窗口类的窗口显示窗口运行消息循环543Windows程序的基本结构3、Windows程序的执行逻辑Windows系统首先为该程序建立必备的程序环境,如定义并初始化一些全局变量,接下来就寻找并进入WinMain函数。WinMain是Window程序的入口点,由它控制程序的执行流程。WinMain函数依次完成以下工作:调用API函数定义并注册窗口类,创建程序窗口,显示窗口,建立消息循环,等待用户操作程序窗口。用户在程序窗口中所作的每件事情都会产生一个消息,该消息会被Windows传递到该程序的消息队列中。WinMain中的消息循环会不断地从本程序的消息队列中获取消息,并将其传递给该窗口的窗口处理函数,由窗口处理函数对消息进行处理,实现相应的程序功能。553.2Win32Application程序设计在MiscrosoftVisualC++中的API程序设计方法一般的编程方法是先用VC++的Win32Application向导建立一个Windows应用程序的框架,然后将它修改成自己的程序,并根据需要添加一些头文件、源程序文件及资源文件。【例10-1】在VC++6.0环境下设计一个简单的WindowsAPI程序,该程序在窗口中显示字符串"Hellow,APIProgramming!"。563.2Win32Application程序设计编程过程如下:(1)启动VC++6.0,选择菜单“文件|新建”,在弹出的“新建”对话框中选择“工程”标签页,如图所示。573.2Win32Application程序设计(2)选中“工程”对话框中的“Win32Application”列表项,并在“位置”编辑框中指定本项目建立的磁盘目录,然后在“工程”编辑框中输入项目文件的名字。(3)单击“确定”按钮,并在弹出的对话框中选中“Anemptyproject.”单选项,然后单击“完成”按钮。最后将得到如图10-7(a)所示的空项目文件窗口。(4)选择菜单“文件|新建”,然后在弹出的对话框中选择“文件”标签,并选择列表中的“C++SourceFile”项目,然后在“文件”编辑框中输入源程序文件名“HellApi”,如图10-7(b)所示。输入完成后,单击“结束”按钮。58.3.2Win32Application程序设计59.3.2Win32Application程序设计(5)打开目录C:\dk\HellApi,在该目录中可以看到以下文件名:HellApi.cpp、HellApi.dsp、HellApi.dsw、HellApi.ncb、HellApi.opt,这些文件就是在前面的操作过程产生的。(6)在HellApi.cpp中输入下面的程序代码。60HellApi.cpp#include<windows.h>LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,PSTRszCmdLine,intiCmdShow){staticTCHARszAppName[]=TEXT("HelloWin");HWNDhwnd;MSGmsg;61
WNDCLASSwndclass;
wndclass.style=CS_HREDRAW|CS_VREDRAW;wndclass.lpfnWndProc=WndProc;wndclass.cbClsExtra=0;wndclass.cbWndExtra=0;wndclass.hInstance=hInstance;wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);wndclass.lpszMenuName=NULL;wndclass.lpszClassName=szAppName;
if(!RegisterClass(&wndclass)){MessageBox(NULL,TEXT("ThisprogramrequiresWindowsNT!"),szAppName,MB_ICONERROR);return0;}注册窗口类定义窗口的属性,如大小、宽度,前景色等62hwnd=CreateWindow(szAppName, //用于建立窗口的类名
TEXT("TheHelloProgram"), //窗口标题
WS_OVERLAPPEDWINDOW,//窗口类型
CW_USEDEFAULT, //窗口左上角X坐标为默认值
CW_USEDEFAULT, //窗口左上角Y坐标为默认值
CW_USEDEFAULT, //窗口宽度为默认值
CW_USEDEFAULT, //窗口高度为默认值
NULL, //该窗口没有父窗口
NULL, //该窗口没有菜单
hInstance, //创建本窗口的程序句柄
NULL); //系统保留参数
ShowWindow(hwnd,iCmdShow); //显示窗口,hwnd代表上面建立的窗口
UpdateWindow(hwnd); //更新窗口,绘制窗口客户区本段程序建立并显示一个窗口63while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}returnmsg.wParam;}Windows程序的消息循环64LRESULTCALLBACKWndProc( HWNDhwnd, UINTmessage, WPARAMwParam, LPARAMlParam){HDChdc;PAINTSTRUCT ps;RECTrect;窗口处理函数,是一个回调函数,每个应用程序至少有一个窗口处理函数,窗口函数的参数由Windows传递,这些参数是由事件消息产生的。65switch(message){ //消息处理
caseWM_CREATE:return0;
caseWM_PAINT:hdc=BeginPaint(hwnd,&ps);GetClientRect(hwnd,&rect);DrawText(hdc,"Hello,WindowsAPI",-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
EndPaint(hwnd,&ps);return0;caseWM_DESTROY:PostQuitMessage(0);return0;}returnDefWindowProc(hwnd,message,wParam,lParam);}663.3Windows程序的控制流程所有Windows应用程序具有相同的程序结构和执行控制流程,步骤如下:(1)创建全局变量(2)程序入口函数WinMain()函数接收控制(3)WinMain()登记窗口(4)WinMain()建立窗口(5)WinMain()进入消息循环(6)当窗口中有事件发生时,事件消息进入消息循环队列(7)windows操作系统分析消息,调用该窗口的窗口函数进行处理。(8)WinMain函数退出,程序终止。67初始化所有全局对象WinMain()登记窗口建立窗口消息循环Hello,WindowsAPI显示窗口程序出口:WM_QUITWindows程序的控制流程683.3Windows程序的控制流程接下来将对API程序的建立、执行流程进行进一步的剖析。借此理解Windows程序的结构,事件驱动和消息循环的本质。69DOS平台的C程序的入口点是main()函数,在WINDOW的C++程序的入口点是WinMain()函数。其定义形式为:intAPIENTRYWinMain(
HINSTANCEhInstance,//
HINSTANCEhPrevInstance,
LPSTRlpCmdLine,
intnCmdShow)实例句柄,当程序在WINDOWS下运行时,它唯一地标识该程序当程序在WINDOWS下有多个副本运行时,它标识该程序的前一个副本标识传给该程序的命令行参数,近似于main()函数的char*argv[]指示窗口在Window中的显示方式,其值为1-7,如:值1表示SW_SHOWNORMAL//窗口以常规显示见第321页表10-41、程序入口点70窗口总是在窗口类的基础上创建的,窗口类标识了处理窗口消息的窗口过程,这是非常重要的。在创建窗口之前,必须先调用RegisterClass函数注册一个窗口类,以后可以基于这个已登录的窗口创建多个窗口。
只有程序的第一个实例需要注册窗口类!
例10-1的注册窗口如下:2、注册窗口类71
WNDCLASSwndclass; wndclass.style=CS_HREDRAW|CS_VREDRAW;wndclass.lpfnWndProc=WndProc;wndclass.cbClsExtra=0;wndclass.cbWndExtra=0;wndclass.hInstance=hInstance;wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);wndclass.lpszMenuName=NULL;wndclass.lpszClassName=szAppName;if(!RegisterClass(&wndclass)){MessageBox(NULL,“Thisprogram……!",szAppName,MB_ICONERROR);return0;}发生在本窗口中的事件由WndProc处理,这是WinMain与窗口函数的关联!723、创建窗口hwnd=CreateWindow( szAppName,//windowclassnameTEXT("TheHelloProgram"),//windowcaptionWS_OVERLAPPEDWINDOW,//windowstyleCW_USEDEFAULT,//initialxpositionCW_USEDEFAULT,//initialypositionCW_USEDEFAULT,//initialxsizeCW_USEDEFAULT,//initialysizeNULL,//parentwindowhandleNULL,//windowmenuhandlehInstance,//programinstancehandleNULL );//creationparameters
if(!hWnd){returnFALSE;}//建立窗口失败
734、显示窗口
ShowWindow(hWnd,nCmdShow);UpdateWindow(hWnd);hWnd是前面创建的窗口的句柄nCmdShow是窗口显示的方式,缺省值为1即:SW_SHOWNORMALhWnd是前面创建的窗口的句柄,该函数产生WM_PAINT消息,导致窗口被重绘745、消息循环调用UpdateWindow(hWnd);函数之后,窗口就显示在显示屏幕上,这时程序就进入了消息循环,等待用户用键盘或鼠标操作窗口,产生消息。产生的消息将被放入消息队列:
755、
Windwos消息循环系统消息队列应用程序队列1应用程序队列2应用程序队列3应用程序队列n应用程序1WinMain()函数消息循环窗口函数1窗口函数m应用程序1WinMain()函数消息循环窗口函数1窗口函数m硬件输入MSG本队列由Windows系统建立和维护MSGMSGMSGMSGMSGMSGMSGMSG76while(GetMessage(&msg,NULL,0,0)){ {TranslateMessage(&msg); DispatchMessage(&msg); } }消息循环从此开始,它从消息队列中取出一条消息,WM_QUIT则退出将MSG消息进行传给WINDOWS系统,并进行一些键盘转换再将MSG消息传给WINDOWS系统,然后WINDOWS系统将该消息传给正确的窗口过程,让它进行处理。本程序是由WndProc函数处理,处理完毕后,WndProc返windows,因为此时Windows调用还处于DispatchMessage函数,在该函数执行后,再次返回到下一个GetMessage函数77Windows应用程序的消息处理流程WM_KEYDOWNWM_KEYUPWM_MOUSEMOVEWM_LBUTTONUPWM_QUIT…应用程序消息队列WinMain()消息循环WndProc()caseWM_KEYDOWNcaseWM_KEYUPcaseWM_LBUTTUP…defaultWM_CREATEWM_DESTROYWM_SIZEWM_PAINT…①④②GetMessage()③检索到的消息DispatchMessage()⑤DefWindowProc⑥Windows系统应用程序回调786、窗口函数实际的动作发生在窗口函数中,窗口函数确定了在窗口的客户区域中显示些什么以及窗口函数怎样响应用户的输入。LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam)说明:1、WndProc是一个回调函数
CALLBACK指定窗口函数是一个回调函数。回调就是由Windows系统调用的意思,即窗口函数是由Windows系统调用的,应用程序不必调用它。
792、窗口函数的参数每个Windows应用程序的窗口函数都有着相同的参数表:第1个参数hWnd用于标识接收消息的窗口句柄;第2个参数message用于标识消息,该消息将被用于处理消息的switch结构中;第3、4个参数wParam和lParam是message的附加信息,它们的内容随message消息而异,如鼠标消息与键盘消息的wParam和lParam参数就不一样。窗口函数主要利用这些参数响应窗口事件,实现程序功能。6、窗口函数807、消息处理
窗口函数所接收的消息都是用一个数值来标识的,它就是传递给窗口过程的message参数,消息在WINDOWS.H头文件中定义,它们是以“WM_”的标识符。 一般地,在WINDOWS程序中使用switch和case结构来确定窗口函数接收的是什么消息以及如何处理它。 窗口窗口函数不处理的消息被传给DefWindowProc函数进行缺省处理。81switch(message){caseWM_CREATE:……break;caseWM_PAINT:……break;caseWM_DESTROY:……default:returnDefWindowProc(……);}消息处理过程828、数据输出与WM_PAINT消息
WM_PAINT消息对于windows程序设计是极其重要的,当窗口客户区的一部分或全部变为“无效”时,将产生该消息,它导致窗口重绘。Hellowwindow中窗口的类型为:CS_HREDRAW|CS_VREDRAW;该类型指示当窗口水平或垂直方向发生变化时,窗口将产生WM_PAINT消息致使窗口重绘。83WM_PAINT消息的处理模式:
hdc=BeginPaint(hwnd,&ps)…………进行窗口绘制的程序代码
……EndPaint(hwnd,&ps);8、数据输出与WM_PAINT消息
849、WM_DESTROY消息与程序结束
这是一条重要的消息,它指示windows系统关闭该应用程序。系统菜单上的close或ALT+F4都会产生该消息。Hellowwindow程序通过
PostQuitMessage(0);函数产生该消息。导致应用程序的关闭。85WM_DESTROY与WinMain结束应用程序消息队列WinMain()消息循环WndProc()caseWM_KEYDOWNcaseWM_KEYUPcaseWM_DESTROY…defaultWM_DESTROY消息①④②GetMessage()③WM_QUIT退出消息循环结束应用程序⑤PostQuitMessage(0)⑥Windows系统应用程序864WindowsAPI程序设计的方法Windows程序由主函数WinMain和窗口处理函数构成。WinMain是程序执行的入口点,每个WinMain的主要功能是创建程序窗口、建立消息循环,其程序结构和代码几乎完全相同。窗口函数主要处理发生在程序窗口中的各种用户事件(如选择菜单、单击鼠标等),是Windows程序设计的主体和重点,程序的不同功能都是在窗口函数的消息处理中实现的。因此编程工作主要在窗口函数中。在VC++环境中设计API程序时,可以先利用VC++向导生成一个简单的应用程序框架,然后对框架程序中的窗口函数进行修改,添加响应窗口事件的消息处理代码段,增加程序的数据输出和消息处理功能,就能够实现需要的程序功能。874.1Windows程序的数据输出1、GDI(GraphicsDeviceInterface)
GDI是Windows为应用程序提供的图形设备接口,其中提供了丰富的图形API函数。GDIAPI函数大致可以分为3种类型①字符输出类函数,以图形方式输出字符、文本;②矢量图形函数,用于绘制点、线、椭圆、三角形等几何图形;③光栅图形函数,用于绘制位图。884.1Windows程序的数据输出2、设备无关性是指在用GDI函数设计针对不同硬件设备的输出程序时,不必考虑具体的硬件特性,只需用统一的方式编写程序,Windows系统会自动调用具体设备的硬件驱动程序将GDI图形输出程序转换成特定硬件设备的输出程序。894.1Windows程序的数据输出3、设备环境(DeviceContext,DC)也称为设备描述表或设备上下文。是Windows为了实现设备无关性而向应用程序提供了一个虚拟逻辑设备,它其实是一种数据结构,其中存了绘图操作需要的所有信息,如绘画笔、字体、图画颜色、绘制的图形背景及绘图的模式。设备环境由Windows系统统一管理,当应用程序需要输出图形(包括字符)时,必须向Windows系统提出申请,用完后必须释放,以便其他程序申请使用。DC相当画家手中的绘图工具,包括画纸、画笔、颜料……。程序只需要用DC中的画笔在DC中作画,Windows就会直接将之转换输出到显示器、打印机之类的输出设备上。904.1Windows程序的数据输出4、Windows程序的输出过程(1)程序首先获取设备环境句柄(2)通过该句柄调用图形设备接口的绘图函数绘图。(3)绘图函数所绘制的图形被Windows系统提供的设备驱动程序转换成具体物理设备的绘图函数,从而在具体硬件设备上绘制出图形。915.获取设备环境(1)用API函数BeginPaint获取设备环境句柄如果在WM_PAINT消息处理中输出图形,就应该使用函数BeginPaint获取设备环境句柄,用法如下:……PAINTSTRUCTps;//此数据结构的说明见下页…… caseWM_PAINT:hdc=BeginPaint(hwnd,&ps);//获取设备环境句柄
…… //绘制图形或输出文本的程序代码
EndPaint(hwnd,&ps);
925.获取设备环境说明:(1)PAINTSTRUCT结构的定义如下:typedefstructtagPAINTSTRUCT{HDChdc; //设备环境句柄
BOOLfErase; //指示是否擦除无效区域背景
RECTrcPaint; //用于标识无效的矩形区域
BOOLfRestore;//系统保留
BOOLfIncUpdate; //系统保留
BYTErgbReserved[16];//系统保留}PAINTSTRUCT;(2)BeginPaint用于获取设置环境句柄,EndPaint用于释放设备环境句柄。BeginPaint和EndPaint必须配对使用。935.获取设备环境(2)用GetDC获取设备环境句柄如果在是在除WM_PAINT之外的其他消息处理中输出图形,就应该用GetDC获取设备环境句柄,用完后必须使用ReleaseDC将其释放。其形式如下:caseWM_XX: //WM_XX非WM_PAINThdc=GetDC(hWnd); //hWnd是窗口句柄………… //绘制图形或输出文本的程序代码ReleaseDC(hWnd,hdc); //释放设备环境句柄break;其中:GetDC和ReleaseDC须配对使用946.输出图形设备环境(即设备描述表)定义了绘图的图形对象和图形模式,应用程序获取到了设备环境后,就能够通过设备环境句柄使用GDIAPI函数来绘制图形。在用设备环境输出图形之前,应用程序可以事先把一些绘图对象选入设备环境中,然后就可以用这些对象来绘制图形。表5-1是常用的绘图对象对象定义对象句柄的结构Windows定义的备用对象说明BitmapHBITMAP
用于处理位图BrushHBRUSHXX_BRUSH用于填充图形的内部PaletteHPALETTE用于管理颜色FontHFONTXX_FONT用于设置文本的字体PenHPENXX_PEN用于绘制图形956.输出图形GDI中常用的函数MoveTo(hDC,x,y); //将画笔从当前位置移到(x,y)坐标BOOLLineToEx(HDChdc,intx,inty); //从当前点画直线到(x,y)坐标处BOOLRectangle(HDChdc,intx1,inty1,intx2,inty2);//以(x1,y1)为左上角坐标,(x2,y2)为右下角坐标画矩形BOOLRoundRect(HDChdc,intx1,inty1,intx2,inty2,inth,intw);//以(x1,y1)为左上角坐标,(x2,y2)为右下角坐标画圆角矩形BOOLEllipse(HDChdc,intx1,inty1,intx2,inty2);//以(x1,y1)为左上角坐标,(x2,y2)为右下角坐标画椭圆967.输出文本Windows程序的文本按图形方式输出。输出文本时必须以像素为单位精确定位每一行的输出位置。常用文本输出函数有TextOut和DrawTexBOOLTextOut(HDChdc,intx,inty,LPCTSTRlpString,intn);intDrawText(HDChdc,LPCTSTRlpString,intn,LPRECTlpRect,UINTuFormat);977.输出文本输出文本的字体设置问题Windows提供了丰富的字体,不同字体的高度和宽度也不尽相同,函数GetTextMetrics能够获取当前字体的详细信息,如字符的完度、高度、字间距、行间距等信息。其原型如下:BOOLGetTextMetrics(HDChdc,TEXTMETRICS&tm);TEXTMETRICS是保存字体信息的数据结构,主要域如下:typedefstructtagTEXTMETRIC{LONGtmHeight; //字符高度
LONGtmExternalLeading; //行间距
LONGtmAveCharWidth; //字符的平均宽度
LONGtmMaxCharWidth; //最大字符宽度
LONGtmWeight; //字符的粗细度
BYTEtmCharSet; //字符集……}TEXTMETRIC;9810.4.1Windows程序的数据输出【例10-2】在例10-1的基础上,修改窗口函数中的WM_PAINT消息,让程序
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年企业间技术秘密转让与保密合同
- 2024《教育基金赠与合同》
- 2024年度二手挖掘机质量保证合同
- 2024年奶牛养殖收购合同
- 2024年度融资合同融资项目及融资金额
- 2024年建筑工程屋面分包协议
- 2024年度★店铺转让及培训协议
- 2024年度生物医药实验室安装内部承包合同
- 2024年企业间关于物联网技术研发与应用合作协议
- 2024供应链金融借款合同
- PDCA化疗药物规范化使用率报告
- 顺丰快递薪酬管理案例分析
- 路面弯沉温度修正系数
- 【护理论文】护理论文范文(共40篇)
- 2023腿式机器人性能及试验方法
- 乳胶漆墙面施工方案范本
- Scratch在小学数学中的应用-以《长方形的周长》为例
- 化工企业停工方案范本
- 网络传播法规(自考14339)复习必备题库(含答案)
- 民法典合同编解读之合伙合同
- 高中英语学习情况问卷调查表及调查报告
评论
0/150
提交评论