第03章 Windows编程基础_第1页
第03章 Windows编程基础_第2页
第03章 Windows编程基础_第3页
第03章 Windows编程基础_第4页
第03章 Windows编程基础_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

第三章Windows编程基础,Windows编程基础知识Windows应用程序常用消息Windows中的事件驱动程序设计Windows应用程序的基本结构,跨平台开发原则,跨平台应用程序的开发Windows操作平台:Windows3.X是一个16位的操作平台。Windows95/98/NT/2000是一个32位的操作平台。NT/2000是一个全32位的操作系统,而95/98是16位和32位的混合物。WindowsAPI(Win16API和Win32API)Win16(Windows3.x)Win32S(Windows3.x的32接口)Win32(Windows95/98/NT),跨平台应用程序的开发原则:1、应用程序中要检测版本2、注意数据类型的变化3、尽量使用通用的API函数4、注意各个版本的区别和支持/不支持的功能5、注意一些函数语法和语义上的改变,Win32平台开发工具包,Win32平台的常用开发工具1、微软提供的软件开发包(SDK)Win32SDK、OLESDK、ODBCSDK等。2、微软提供的可视化集成开发工具VisualStudio系列产品VisualC+(MFC)、VisualBasic、VisualJ+3、Borland公司的一些开发工具BorlandC+(OWL)、C+Builder、Delphi4、其他的WatcomC+、PowerBuilder,窗口,窗口是Windows应用程序基本的操作单元,是应用程序和用户之间交互的接口环境,也是系统管理应用程序的基本单位。,事件、句柄,事件驱动Windows是消息驱动(或事件驱动)的操作系统。句柄和Windows消息1、句柄句柄是整个Windows编程的基础,一个句柄是指Windows使用的一个惟一的整数值(long),用于标识应用程序中不同的对象和同类对象中不同的实例,例如,一个窗口、文件等。,常用的句柄类型,一些常用的句柄类型:(表3-1)HWNDHBITMAPHINSTANCEHICONHCURSORHMENUHFONTHFILEHPENHDCHBRUSH,消息结构定义,2、消息消息是Windows应用程序之间及应用程序与Windows操作系统之间进行通信的机制。消息是一个整数值,可以携带两个参数,一个是wParam,另一个是lParam。根据消息的不同,参数所表示的含义也不同。在WindowsAPI中为了方便的使用消息,通常用MSG结构来封装消息。,MSG结构的定义:typedefstructtagMSGHWNDhwnd;/检索消息的窗口UINTmessage;/消息类型WPARAMwParam;/消息附加信息,如键值LPARAMlParam;DWORDtime;POINTpt;MSG;,消息的分类,消息的分类系统定义的消息消息内部的消息用户自定义的消息外部的消息系统定义的消息的取值范围:0 x00000 x03FF、0 x80000 xBFFF用户自定义的内部消息的取值范围:0 x04000 x7FF用户自定义的外部消息的取值范围:0 xC0000 xFFFF,系统定义的消息,系统定义的消息Windows使用系统定义的消息和应用程序进行通信、控制应用程序。每个系统定义的消息都有一个唯一的数值标识符和相应的宏,例如,按下鼠标左键为:WM_LBUTTONDOWN0 x0201按下鼠标右键为:WM_RBUTTONDOWN0 x0204,用户定义的消息(1),用户定义的消息除系统定义的消息外,用户也可以定义自己的消息。用户自定义的消息分为:用户自定义的内部消息和用户自定义的外部消息两类。用户自定义的内部消息一般用于本应用程序内的通信,其他的外部程序不认识该消息。使用用户自定义的内部消息时应注意,定义的内部消息值应大于0 x0400。Windows定义了一个宏:#defineWM_USER0 x0400,用户定义的消息(2),用户自定义的外部消息一般用于不同应用程序之间的通信,其他的外部程序可以认识该消息。使用用户自定义的外部消息必须通过RegisterWindowMessage()API函数在Windows系统中进行注册,成功后,将返回一个0 xC0000 xFFFF之间的值。,常用消息(1),WM_LBUTTONDOWN单击鼠标左键时产生该消息,其附加的参数wParam中包含了标识鼠标键的按下状态;lParam的低位字节包含了当前光标的X坐标,高位字节包含了当前光标的Y坐标。,MK_LBUTTON,鼠标键状态参数及其说明(表3-3),MK_MBUTTON,MK_RBUTTON,按下了鼠标左键,按下了鼠标中键,按下了鼠标右键,常用消息(2),和WM_LBUTTONDOWN相似的消息有:WM_LBUTTONUPWM_RBUTTONDOWNWM_RBUTTONUPWM_MBUTTONDOWNWM_MBUTTONUP,常用消息(3),WM_KEYDOWNWM_CHARWM_CREATEWM_CLOSEWM_DESTROYWM_QUITWM_PAINT,事件驱动程序设计(1),基于DOS的应用程序主要使用顺序的、过程驱动的程序设计方法。顺序的、过程驱动的程序有一个明显的开始和结束,因此,程序能直接控制事件或过程的顺序。基于Windows的应用程序的设计方法与基于DOS的程序设计方法的主要不同在于Windows程序是事件驱动的,事件驱动的程序的执行顺序不是由程序控制的,而是由事件的发生来控制的。,事件驱动程序设计(2),过程驱动程序与事件驱动程序的区别例如,求一个学生的平均成绩的程序,开始,输入学生的姓名,输入第一次成绩,输入第二次成绩,输入第三次成绩,结束,计算平均成绩,过程驱动设计,事件驱动程序设计(3),过程驱动程序与事件驱动程序的区别例如,求一个学生的平均成绩的程序,开始,结束,消息循环,输入学生的姓名,输入第一次成绩,输入第二次成绩,输入第三次成绩,计算平均成绩,事件驱动设计,Windows应用程序的基本流程,开始,初始化应用程序和窗口,进入消息循环并检索消息,是退出消息?,退出,程序是否处理该消息?,由Windows进行默认处理,处理消息,是,否,是,否,Windows应用程序的文件组成,Windows应用程序的组成.CPP或.C文件.H文件.DEF文件/模块属性,可省略.RC文件.MAK文件/工程文件,源程序文件,/建立projectwin32application,然后建立新文件输入#includewindows.hLRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);HINSTANCEghInst;charszAppName=WinSDK;charszAppTitle=AWindowsSDKApplication;intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnShowCmd/初始窗口显示方式)HWNDhWndMain;MSGMessage;WNDCLASSwc;wc.style=CS_HREDRAW|CS_VREDRAW;wc.lpfnWndProc=WndProc;/窗口消息处理函数wc.cbClsExtra=0;/类扩展内存wc.cbWndExtra=0;/窗口扩展内存wc.hInstance=hInstance;/当前实例句柄wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);wc.hCursor=LoadCursor(NULL,IDC_ARROW);wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);wc.lpszMenuName=NULL;wc.lpszClassName=szAppName;/给定义的类一个名字/1.注册窗口类RegisterClass(,程序分析(1)程序入口点,用C语言编写的DOS程序的入口点是main()函数,Windows程序也需要入口点,称为WinMain()。通常在WinMain函数中完成程序的初始化、创建窗口和进行消息循环。WinMain函数的原型:intFARPASCALWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow)在Win32平台下,hPrevInstance的值总是为NULL!WinMain的另一种形式:intWINAPIWinMain(),程序分析(2)类初始化,每个应用程序的窗口都有窗口类,应用程序的窗口类必须由Windows初始化和注册一次。窗口类由WNDCLASS结构定义,通过RegisterClassAPI函数。WNDCLASS结构定义如下:typedefstruct_WNDCLASSUINTstyle;WNDPROClpfnWndProc;intcbClsExtra;intcbWndExtra;HANDLEhInstance;HICONhIcon;HCURSORhCursor;HBRUSHhbrBackground;LPCTSTRlpszMenuName;LPCTSTRlpszClassName;WNDCLASS;,程序分析(3)RegisterClass函数定义,注册窗口类是为CreateWindow做准备ATOMRegisterClass(CONSTWNDCLASS*lpWndClass)如果该函数执行成功,将返回一个唯一的类标识,失败时,返回NULL。除使用WNDCLASS和RegisterClass定义和注册类外,在Win32平台下,还可以使用WNDCLASSEX和RegisterClassEx定义和注册。ATOM:字符串表中的16bit的标志符号,程序分析(4)创建应用程序窗口,通过CreateWindowAPI函数创建窗口;通过ShowWindow和UpdateWindow显示窗口。CreateWindow函数定义如下:HWNDCreateWindow(LPCTSTRlpClassName,LPCTSTRlpWindowName,intx,inty,intnWidth,intnHeight,HWNDhWndParent,HMENUhMenu,HANDLEhInstance,LPVOIDlpParam);ShowWindow只完成了创建窗口显示的一部分工作,它主要负责建立窗口框架、标题栏、菜单栏等窗口的边界元素,而不负责创建窗口的客户区,这部分工作通过UpdateWindow函数完成。,程序分析(5)-消息循环,while(GetMessage(通过调用GetMessageAPI函数从应用程序的消息队列中得到消息,然后将消息传递给TranslateMessage函数,该函数执行键盘消息的翻译工作,最后通过DispatchMessage函数将消息分派到指定的窗口,由窗口处理函数对消息进行处理。GetMessage函数定义为:BOOLGetMessage(LPMSGlpMsg,HWNDhWnd,/发出消息窗口UINTwMsgFilterMin,/消息值是一个整数UINTwMsgFilterMax)/用此设定上下限该函数由四个参数,通常只用第一个,其他的为NULL和0。,程序分析(6)窗口过程,窗口过程是消息处理中心,一般都包含一个很大的switch语句,用于对消息进行分类处理。窗口过程通过WNDCLASS结构中的lpfnWndProc成员和窗口建立联系,即发向该窗口的消息将由lpfnWndProc成员指定的函数(窗口过程)进行处理。窗口过程的定义格式为:,LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam)switch(message)caseWM_DESTROY:PostQuitMessage(0);default:returnDefWindowProc(hWnd,message,wParam,lParam);return0;,程序分析(7)窗口过程,LRESULTCALLBACKWndProc(HWNDhWndMain,/消息所指向的窗口UINTMessage,/消息值WPARAMwParam,/消息参数LPARAMlParam/消息参数)对窗口过程中没有处理的消息,要调用DefWindowProc函数让Windows进行缺省处理。,返回,消息机制,消息机制,退出消息,当用户选择File菜单的退出菜单项时,windows会产生一系列消息,如键盘或鼠标消息,WM_SYSCOMMAND消息,WM_CLOSE消息。WM_CLOSE是一条进队消息,被放入应用程序消息队列中。GetMessage函数从消息队列中取得WM_CLOSE消息,由DispatchMessage派送给窗口函数,若窗口函数中

温馨提示

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

评论

0/150

提交评论