windows程序设计第一章讲义

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第一章这节课我们主要讲解WINDOWS的内部运行原理,要了解VISUALC++程序的开发过程,先要理解WINDOWS应用程序的运行机制,因为VISUALC++是WINDOWS开发语言,我们要明白在WINDOWS环境下编程和在其他环境下一些根本的差别,全面讨论WINDOWS工作原理需要一本书的内容,我们没了解那么细,但还是要了解一些根本的概念原理。一.Windows应用程序,操作系统,计算机硬件之间的相互关系Windows程序设计是完全不同于传统的DOS系统的设计方法,它采取事件驱动的机制的程序设计模式,主要是基于消息的。当用户要实现某种功能时,会调用操作系统的某种支持,然后操作系统将用户的需要包装成消息,并投递到消息队列中,最后应用程序从消息队列中取走消息并进行响应。向下的箭头①③④表示操作系统能够操作输出设备以执行特定的功能,如让声卡发出声音,显卡画出图形等。向上的箭头②表示操作系统能够感知输出设备状态的变化,如鼠标移动,键盘按下,并能够知道鼠标移动的位置,键盘按下的哪个键,这就是操作系统和计算机硬件的交互关系。应用程序开发者通常不需要知道其具体的实现细节,我们关心的是应用程序与操作系统的交互关系。向下的箭头③表示应用程序可以通知操作系统执行某个具体的动作,如操作系统能够控制声卡发出声音,但它并不知道应该何时发出何种声音,需要应用程序告诉操作系统该发出什么样的声音。这个关系好比有个机器人能够完成行走的功能,但是,如果人们不告诉它往哪个方向上走,机器人是不会主动行走的。这里的机器人就是操作系统,人们就是应用程序那么,应用程序是如何通知操作系统执行某个功能的呢?有过编程经验的读者都应该知道,在应用程序中要完成某个功能,都是以函数调用的形式实现的,同样,应用程序也是以函数调用的方式来通知操作系统执行相应的功能的。操作系统所能够完成的每一个特殊功能通常都有一个函数与其对应,也就是说,操作系统把它所能够完成的功能以函数的形式提供给应用程序使用,应用程序对这些函数的调用就叫做系统调用,这些函数的集合就是Windows操作系统提供给应用程序编程的接口(ApplicationProgrammingInterface),简称WindowsAPI。如CreateWindow就是一个API函数,应用程序中调用这个函数,操作系统就会按照该函数提供的参数信息产生一个相应的窗口。在这里注意:我们不要把API与JAVA或其他的API混淆。API是一个已经被广泛使用的专业术语,如果说某个系统某个设备提供给应用程序对其进行编程操作的函数,类,组件等的集合。如做呼叫购买语音卡,提供一个开发包,开发包的函数集合称为语音卡的API。向上的箭头④表示操作系统能够将输入设备的变化上传给应用程序。如用户在某个程序活动时按了一下键盘,操作系统马上能够感知到这一事件,并且能够知道用户按下的是哪一个键,操作系统并不决定对这一事件如何作出反应,而是将这一事件转交给应用程序,由应用程序决定如何对这一事件作出反应。好比有个蚊子叮了我们一口,我们的神经末梢(相当于操作系统)马上感知到这一事件,并传递给了我们的大脑(相当于应用程序),我们的大脑最终决定如何对这一事件作出反应,如将蚊子赶走,或是将蚊子拍死。对事件作出反应的过程就是消息响应。2.关于消息及消息队列操作系统是怎样将感知到的事件传递给应用程序的呢?这是通过消息机制(Message)来实现的。操作系统将每个事件都包装成一个称为消息的结构体MSG来传递给应用程序,参看MSDN。MSG结构定义如下:typedefstructtagMSG{HWNDhwnd;UINTmessage;WPARAMwParam;LPARAMlParam;DWORDtime;POINTpt;}MSG;解释:(MSDN是微软提供的程序开发的在线帮助系统,这个系统包括了微软的所有开发语言开发工具的帮助文件,信息很全每年发布4次,一个季度一次。)参数1HWNDhwnd;解释:handletowindow新的数据类型,指示窗口的句柄,何谓窗口?屏幕上的一块矩形区域叫窗口,我们通常的开发的应用程序叫窗口程序,如VISUALC++由许多窗口构成,每个窗口又要起标识,当你去定义一个变量来存储这些标识时,你需要有存储定义这些标识的类型来定义变量,像定义整形变量存放整型数据,定义浮点类型变量存放浮点型数据,要存放窗口标识,需要有窗口句柄来定义这样的变量。句柄句柄(HANDLE),资源的标识。操作系统要管理和操作这些资源,都是通过句柄来找到对应的资源。句柄类似指针,也需要占据一块内存,那么对于资源占据一块内存,我们要所引这块内存,索引资源,就是通过句柄找到的。按资源的类型,又可将句柄细分成图标句柄(HICON),光标句柄(HCURSOR),窗口句柄(HWND),应用程序实例句柄(HINSTANCE)等等各种类型的句柄。操作系统给每一个窗口指定的一个唯一的标识号即窗口句柄。参数2UINTmessage无符号整型,消息就是具体一个消息,比如,按下鼠标左键,左键作为参数传递过来,整数表示方式。数值不好记忆,微软定义很多宏,以WM开头,windowmessage,如鼠标左键按下LBUTTONDOWN,键盘按键,KEYDOWN参数3WPARAMwParam;消息的附加信息LPARAMlParam;都是整型。关于消息的附加信息。如按下A键,WM_CHAR消息,收到消息,我们并不知道那个字母,要想知道,把字母的ASCII码放到附加参数里,这样我们收到消息通过附加参数知道键盘上字母的ASII码。MSDN查看WM_CHAR消息既然WPARAMLPARAM都是整型,为什么要再产生两个新的数据类型?我们看别人写的程序:intx,y;x=30;y=30;//x和y既可以用来表示坐标点,也可以用来表示宽度和高度,还可以用来表示身高和体重。typedefintWIDTHtypedefintHEIGHTWIDTHx;HEIGHTy;//好处:我们从变量的类型上就可以知道x和y是用来表示宽度和高度。这就是为什么在WINDOWS中微软为我们定义出这么多新的数据类型,虽然都是整型,参数5DWORD32位整数,指示消息传递出的时间。参数6POINT点结构体,x,y坐标,当消息被传递时光标在屏幕的位置。拷贝,查看MSDN由上看出消息结构体包含很多信息,它包含消息与哪个窗口相关,消息的具体内容是什么,消息的附加参数,消息投递时间和光标位置。消息队列:操作系统为每个应用程序都建立一个消息队列,是一个先进先出的缓冲区,通常是某种变量类型的数组,队列中的每个元素都是一个消息,操作系统将生成的每个消息按先后顺序存放到消息队列,应用程序总是取走队列中的第一个消息,消息取走后,第2条成为第1条,后面的依次前提,应用程序取得消息后就知道用户的操作和程序的变化,例如取得WM_CHAR消息,那么一定是用户输入了字符,并且知道是哪个字符。应用程序得到消息后就要处理消息,这就是消息响应。消息响应通过编码来实现,这就是WINDOWS程序的主要代码区,需要编写一些编码,这个过程叫消息响应。在实现过程可以调用API函数,以便完成特定的功能,例如,我们收到关闭窗口的消息,那么可以调用销毁窗口的函数来关闭窗口,或者用弹出消息框的形式询问用户是否真的关闭窗口。通过以上分析,我们知道要想开发WINDOWS应用程序,除了要具备良好的C++基础,还需要掌握两方面的东西:一消息本身,知道不同的消息不同的消息代表的用户操作和程序状态本,。二。对于不同消息我们要让操作系统执行特定的功能去响应响应WINMAIN函数二,Windows程序的结构1Windows程序的入口函数intWINAPIWinMain(HINSTANCEhInstance,//handletocurrentinstanceHINSTANCEhPrevInstance,//handletopreviousinstanceLPSTRlpCmdLine,//commandlineintnCmdShow//showstate);查看MSDN说明:参数1HINSTANCEhInstance:应用程序实例句柄,何谓运行程序实例句柄,即运行中的程序,叫实例,再次运行,有两个实例。这两个实例需要有个标识,同样需要有一种数据类型来定义变量来存放表示,这个类型就是HINSTANCE参数2HINSTANCEhPrevInstance:先前实例句柄,对第2个实例,前一个实例就是这个参数。兄弟实例注意:基于w32的应用程序该参数为空如98,NT下开发不需要此参数,为空。参数3LPSTRlpCmdLine类型是长指针,指向字符串首地址的指针。命令行参数,在DOS下MAIN函数可以有两个参数,argv[],argc[],argv[]指针数组,存放命令行参数,argc[]主要接受存放命令行参数个。同样在WINDOWS程序中也可以接受命令行参数运行“notepad1.txt”1.txt就是命令行参数我们的程序中也可以接收命令行参数,project/settings/debug选项卡下programarguments输入“weixin.txt”,在程序中intWINAPIWinMain开始位置设置断点,然后调试运行。参数4intnCmdShow显示状态,程序运行时是最大化,最小化或隐藏显示。注意:WinMain函数是入口点函数,由操作系统调用。当操作系统启动我们的程序,它会给运行中的程序分配一个实例号,通过参数就传递进来,如果说启动时命令行参数,操作系统会将参数放在第3个参数中,参数都是由操作系统赋值。2创建一个完整的窗口需要经过下面四个操作步骤:设计一个窗口类;注册窗口类;创建窗口;显示及更新窗口。设计窗口WINDOWS已经做好框架,我们只需要填写一部分,如同做填空题一样,这就需要数据结构,结构体设计一个窗口类;原因:程序运行时窗口的样式风格可以不一样,如光标在窗口是箭头还是十字,窗口的标题,背景等等,需要我们在设计窗口时就要确定的产生一个窗口和设计汽车是一样,生产汽车前,我们都需要在图纸上画出汽车的图,雏形,然后起个名字,比如奔腾600,有了图纸照着生产汽车。类似产生一个窗口也要设计窗口的特征,没有汽车复杂,windows已经给我们设计了窗口应该有的基本属性,我们要做的就跟做填空题一样,把它填写完整。(查看MSDN)typedefstruct_WNDCLASS{UINTstyle;窗口类的类型,很多。结合程序看含义-,水平重画和垂直重画,就跟汽车喷漆一样。WNDPROClpfnWndProc;指针指向窗口过程,也称回调函数intcbClsExtra;类额外数据,操作系统为系统中每个窗口类管理类结构,当程序注册窗口类,可让系统为追加额外内存空间,我们称为类的附加内存,由属于这种窗口类的所有窗口共享,cbClsExtra,通常为0intcbWndExtra;操作系统为系统中每个窗口管理类结构,当程序注册窗口,可让系统为追加额外内存空间,我们称为窗口的附加内存HANDLEhInstance;实例号,设计窗口类,要知道属于哪个HICONhIcon;图标句柄,通过LoadIcon加载图标HCURSORhCursor;HBRUSHhbrBackground;LPCTSTRlpszMenuName;LPCTSTRlpszClassName;新类的名字}WNDCLASS;UINTstyle参数1UINTstyle;窗口类的类型,很多。结合程序看含义-,水平重画和垂直重画,就跟汽车喷漆一样。在我们的程序中经常要用到一类变量,这个变量里的每一位(bit)都对应某一种特性。当该变量的某位为1时,表示有该位对应的那种特性,当该位为0时,即没有该位所对应的特性。当变量中的某几位同时为1时,就表示同时具有几种特性的组合。一个变量中的哪一位代表哪种意义,不容易记忆,所以我们经常根据特征的英文拼写的大写去定义一些宏,该宏所对应的数值中仅有与该特征相对应的那一位(bit)为1,其余的bit都为0。我们使用gotodefinition就能发现CS

1 / 12
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功