第01讲 windows 应用程序基础.ppt_第1页
第01讲 windows 应用程序基础.ppt_第2页
第01讲 windows 应用程序基础.ppt_第3页
第01讲 windows 应用程序基础.ppt_第4页
第01讲 windows 应用程序基础.ppt_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

第1讲Windows应用程序基础,一、Windows编程基础,WindowsAPI(WindowsApplicationProgrammingInterface)WindowsSDK(WindowsSoftwareDevelopmentKit)编写Windows应用程序必须首先了解以下内容:1.窗口的概念2.事件驱动3.句柄4.消息,typedefstructtagMSGHWNDhwnd;/目标窗口的句柄UINTmessage;/消息值,Windows.h中的宏定义标识WPARAMwParam;/包含有关消息的附加信息LPARAMlParam;DWORDtime;/指定消息送至队列的时间POINTpt;/指定消息发送时屏幕光标的位置MSG;,typedefstructtagPOINTLONGx;LONGy;POINT;,二、Windows应用程序组成及编程步骤,WindowsAPI程序的开发步骤结合实例演示说明AnemptyprojectAsimplaWin32applicationAtypicalHelloWorld”application应用程序的文件组成.dsw.dsp.opt.clw.ncb.plg.cpp.h.rc.rc2readme.txt.ico.bmp.cur.exe.obj.res.lib.exp.sbr.bsc.ilk.pdb.pch结合实例说明,源程序组成结构,WinMain和WinProc是Windows应用程序的主体,所有应用程序的入口,类似Main函数,完成一系列的定义和初始化,并产生消息循环,定义了应用程序对接收到的不同消息的响应包含了对各种可能接收到的消息的处理过程,注意!Win是多任务管理的,同一应用程序的多个窗口可能会同时存,Win系统对每个窗口的执行称为一个实例,并用一个实例句柄来唯一标识,(1)WinMain函数,三个基本的组成部分:函数说明、初始化和消息循环,所有应用程序的入口,类似Main函数,完成一系列的定义和初始化,并产生消息循环,请看实例程序,(2)初始化,(a)窗口类定义与注册定义窗口的形式与功能,通过给窗口类数据结构WNDCLASS赋值完成,该数据结构中包含窗口类的各种属性。,窗体类结构类型定义如下:typedefstruct_WNDCLASSEXUINTcbSize;/窗体类结构类型长度;UINTstyle;/窗体风格;WNDPROClpfnWndProc;/窗体过程指针;intcbClsExtra;/系统保留;intcbWndExtra;/系统保留;HANDLEhInstance;/实例句柄;HICONhIcon;/窗体图标;HCURSORhCursor;/窗体光标;HBRUSHhbrBackground;/窗体客户区背景色;LPCTSTRlpszMenuName;/窗体菜单指针;LPCTSTRlpszClassName;/窗体类名称;HICONhIconSm;/窗体小图标。WNDCLASSEX;,(b)注册窗口类,Windows系统本身提供部分预定义的窗口类,程序员也可以自定义窗口类,窗口类必须先注册后使用。窗口类的注册由函数RegisterClass()实现。RegisterClass(/wndclass为窗口类结构RegisterClass函数的返回为布尔值,注册成功则返回真,ATOMMyRegisterClass(HINSTANCEhInstance)WNDCLASSEXwcex;/窗口类的定义wcex.cbSize=sizeof(WNDCLASSEX);wcex.style=CS_HREDRAW|CS_VREDRAW;/窗口类风格wcex.lpfnWndProc=(WNDPROC)WndProc;/定义窗口处理函数wcex.cbClsExtra=0;/窗口类无扩展wcex.cbWndExtra=0;/窗口实例无扩展wcex.hInstance=hInstance;/当前实例句柄wcex.hIcon=LoadIcon(hInstance,(LPCTSTR)IDI_MY02HELLOWINDOWS);/窗口的最小化图标为缺省图标wcex.hCursor=LoadCursor(NULL,IDC_ARROW);/窗口采用箭头光标wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);/窗口背景为白色wcex.lpszMenuName=(LPCSTR)IDC_MY02HELLOWINDOWS;/窗口中菜单wcex.lpszClassName=szWindowClass;/窗口类名wcex.hIconSm=LoadIcon(wcex.hInstance,(LPCTSTR)IDI_SMALL);/窗口的最小化图标为缺省图标returnRegisterClassEx(/进行窗口类的注册,LoadCursor的作用是在应用程序中加载一个窗口光标HCURSORLoadCursor(HINSTANCEhInstance,LPCTSTRlpCursorName),应用程序调用函数GetStockObject获取系统提供的背景刷HBRUSHGetStockObject(intnBrush);,(c)创建窗口实例,创建一个窗口类的实例由函数CreateWindow()实现,函数原型如下:HWNDCreateWindow(LPCTSTRlpszClassName,LPCTSTRlpszTitle,DWORDdwStyle,intx,y,intnWidth,nHeight,HWNDhwndParent,HWENUhMenu,HINSTANCEhInstance,LPVOIDlpParam),窗口类名窗口标题名创建窗口的样式窗口左上角坐标窗口宽度和度高该窗口的父窗口句柄窗口主菜单句柄创建窗口的应用程序当前句柄指向一个传递给窗口的参数值的指针,(d)显示窗口,窗口类的显示由ShowWindow和UpdateWindow函数实现。应用程序调用ShowWindow函数在屏幕上显示窗口ShowWindow(hwnd,nCmdshow);/nCmdshow为窗口显示形式标识,显示窗口后,应用程序调用UpdateWindow更新并绘制用户区,并发出WM_PAINT消息。UpdateWindow(hwnd);,(3)消息循环,消息循环的常见格式如下:MSGMsg;while(GetMessage(,将消息的虚拟键转换为字符信息,将消息传送到指定窗口函数,将消息传递给窗口函数的相应过程处理,Windows将产生的消息,WinMain函数,2窗口函数WinProc,WinProc函数由一个或多个switch语句组成。每一条case语句对应一种消息,当应用程序接收到一个消息时,相应的case语句被激活并执行相应的响应程序模块。,/窗口函数的一般形式如下:LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessgae,WPARAMwParam,LPARAMlParam)switch(message)message为标识的消息casebreak;caseWM_DESTROY:PostQuitMessage(0);break;default:returnDefWindowProc(hwnd,message,wParam,lParam);return(0);,在消息处理程序段中一般都有对WM_DESTROY的处理,该消息是关闭窗口时发出的。它向应用程序发出WM_QUIT消息,请求退出处理函数:voidPostQuitMessage(intnExitCode)/nExitCode为应用程序的退出代码,为未定义处理过程的消息提供缺省处理,3数据类型,在Windows.h中定义了Windows应用程序中包含种类繁多的数据类型,4.一些重要的数据结构,MSG:包含一个消息的全部信息,是消息发送的格式,WINDCLASS:包含一个窗口类的全部信息及属性,POINT:定义了屏幕上或窗口中的一个点的X和Y坐标,RECT:定义了一个矩形区域及其左上角和右下角的坐标,几种重要的结构,5.MessageBox()的使用,TheMessageBoxfunctioncreates,displays,andoperatesamessagebox.Themessageboxcontainsanapplication-definedmessageandtitle,MessageBox(HWNDhWnd,/handleofownerwindowLPCTSTRlpText,/addressoftextinmessageboxLPCTSTRlpCaption,/addressoftitleofmessageboxUINTuType/styleofmessagebox);,Message_BoxTypesMB_ABORTRETRYIGNOREThemessageboxcontainsthreepushbuttons:Abort,Retry,andIgnore.MB_OKThemessageboxcontainsonepushbutton:OK.MB_OKCANCELThemessageboxcontainstwopushbuttons:OKandCancel.MB_RETRYCANCELThemessageboxcontainstwopushbuttons:RetryandCancel.MB_YESNOThemessageboxcontainstwopushbuttons:YesandNo.MB_YESNOCANCELThemessageboxcontainsthreepushbuttons:Yes,No,andCancel.,Message-BoxIconsMB_ICONEXCLAMATIONAnexclamation-pointiconappearsinthemessagebox.MB_ICONINFORMATIONAniconconsistingofan“i”inacircleappearsinthemessagebox.MB_ICONQUESTIONAquestion-markiconappearsinthemessagebox.MB_ICONSTOPAstop-signiconappearsinthemessagebox.,ReturnValueZeroifthereisnotenoughmemorytodisplaythemessagebox;otherwiseoneoftheButtonvaluesisreturned,三、消息处理,回调函数(窗口函数)负责消息处理,是什么消息?,WM_CREATE,是创建消息?,WM_DESTROY,是销毁消息?,WM_.,是其他一些消息?,switch分支,根据不同的消息,执行不同的代码,default:DefWindowProc,形形色色的消息,WM_CREATEWM_SHOWWINDOWWM_COMMANDWM_LBUTTONDOWNWM_KEYDOWNWM_PAINTWM_CLOSEWM_DESTROYWM_QUIT,一个窗口从创建到销毁会经历哪一些消息?,SPY,发了什么消息啊?参数什么含义?,晕,自己给自己发消息?,SendMessageTheSendMessagefunctionsendsthespecifiedmessagetoawindoworwindows.Thefunctioncallsthewindowprocedureforthespecifiedwindowanddoesnotreturnuntilthewindowprocedurehasprocessedthemessage.ThePostMessagefunction,incontrast,postsamessagetoathreadsmessagequeueandreturnsimmediately.LRESULTSendMessage(HWNDhWnd,/handleofdestinationwindowUINTMsg,/messagetosendWPARAMwParam,/firstmessageparameterLPARAMlParam/secondmessageparameter);BOOLPostMessage(HWNDhWnd,/handleofdestinationwindowUINTMsg,/messagetopostWPARAMwParam,/firstmessageparameterLPARAMlParam/secondmessageparameter);,1.WM_CREATE:由CreateWindow函数发出的消息,wParam:未用1Param:包含一个指向CREATESTRUCT数据结构的指针,此时窗口已经创建此时创建仅仅创建了一些基本要素(标题栏、边框、主菜单等)此时窗口还是不可见的,在这里可以作一些基本的初始化工作,四、常用消息及其使用1/10,不能在这里添加一些依赖于窗口创建的代码,2.WM_COMMAND:命令消息,四、常用消息及其使用2/10,wNotifyCode=HIWORD(wParam);/notificationcodewID=LOWORD(wParam);/item,control,oracceleratoridentifierhwndCtl=(HWND)lParam;/handleofcontrolParameterswNotifyCodeValueofthehigh-orderwordofwParam.Specifiesthenotificationcodeifthemessageisfromacontrol.Ifthemessageisfromanaccelerator,thisparameteris1.Ifthemessageisfromamenu,thisparameteris0.wIDValueofthelow-orderwordofwParam.Specifiestheidentifierofthemenuitem,control,oraccelerator.hwndCtlValueoflParam.Handletothecontrolsendingthemessageifthemessageisfromacontrol.Otherwise,thisparameterisNULL.,thismessageissentwhentheuserselectsacommanditemfromamenu,whenacontrolsendsanotificationmessagetoitsparentwindow,orwhenanacceleratorkeystrokeistranslated.,此外,相似的消息还有:WM_LBUTTONUP:放开鼠标左键时产生;WM_RBUTTONDOWN:单击鼠标右键时产生;WM_RBUTTONUP:放开鼠标右键时产生;WM_LBUTTONDBLCLK:双击鼠标左键时产生;WM_RBUTTONDBLCLK:双击鼠标右键时产生。,lParam,高字节包含当前光标的Y坐标值,低字节包含当前光标的X坐标值,wParam包含一整数值以标识鼠标键的按下状态,MK_LBUTTON按下鼠标左键MK_MBUTTON按下鼠标中键MK_RBUTTON按下鼠标右键,四、常用消息及其使用3/10,3.WM_LBUTTONDOWN:单击鼠标左键产生的消息,4.WM_KEYDOWN:按下一个非系统键时产生的消息,系统键是指实现系统操作的组合键,例如Alt与某个功能键的组合以实现系统菜单操作等。,wParam:按下键的虚拟键码,用以标识按下或释放的键lParam:记录了按键的重复次数、扫描码、转移代码、先前键的状态等信息。,相似的消息还有WM_KEYUP,在放开非系统键时产生,如F1的虚拟键码在Windows.h文件中定义为VK_F1,四、常用消息及其使用4/10,5.WM_CHAR:按下一个非系统键时产生的消息,四、常用消息及其使用5/10,wParam为按键的ASCII码lParam与WM_KEYDOWN的相同,TheWM_CHARmessageispostedtothewindowwiththekeyboardfocuswhenaWM_KEYDOWNmessageistranslatedbytheTranslateMessagefunction.WM_CHARcontainsthecharactercodeofthekeythatwaspressed.,6.WM_CLOSE:关闭窗口时产生的消息,wParam和1Param均未用。,7.WM_DESTROY:由DestroyWiodow函数发出的消息,wParam和1Param均未用。,四、常用消息及其使用6/10,此时用户刚刚想关闭窗口此时窗口仍然显示,在这里添加代码,比如让它什么都不做,则窗口是销毁不了的。,在这里可以拦截窗口的销毁,ReturnValuesIfanapplicationprocessesthismessage,itshouldreturnzero.,此时窗口还没有销毁此时窗口已经不可见此时消息循环依然在运作此时窗口的销毁已经势在必行,再无法阻止窗口的销毁,只能在这里作一些工作配合窗口销毁,在这里可以作一些善后的工作,ReturnValuesIfanapplicationprocessesthismessage,itshouldreturnzero.,8.WM_QUIT:由PostQuitMessage函数发出的消息,退出应用程序时发出的消息wParam:含退出代码,标识程序退出运行时的有关信息1Param:未用,四、常用消息及其使用7/10,此时窗口已经销毁此时消息循环即将退出此时回调函数不会被调用,到达窗口的最后一个消息,ReturnValuesThismessagedoesnothaveareturnvalue,becauseitcausesthemessagelooptoterminatebeforethemessageissenttotheapplicationswindowprocedure,9.WM_TIMER:定时器发出的消息,四、常用消息及其使用8/10,TheWM_TIMERmessageispostedtotheinstallingthreadsmessagequeuewhenatimerexpires.YoucanprocessthemessagebyprovidingaWM_TIMERcaseinthewindowprocedure.Otherwise,thedefaultwindowprocedurewillcalltheTimerProccallbackfunctionspecifiedinthecalltotheSetTimerfunctionusedtoinstallthetimer.wTimerID=wParam;/timeridentifiertmprc=(TIMERPROC*)lParam;/addressoftimercallbackParametersReturnValuesAnapplicationshouldreturnzeroifitprocessesthismessage.RemarksTheWM_TIMERmessageisalow-prioritymessage.TheGetMessageandPeekMessagefunctionsretrievethismessageonlywhennootherhigher-prioritymessagesareinthethreadsmessagequeue.,10.WM_PAINT,用户区移动或显示,用户窗口改变大小,程序通过滚动条滚动窗口,下拉式菜单关闭并需要恢复被覆盖的部分,Windows清除对话框等对象,并需要恢复被覆盖的部分,均产生WM_PAINT消息,AnapplicationsendstheWM_PAINTmessagewhenthesystemoranotherapplicationmakesarequesttopaintaportionofanapplicationswindow.ThemessageissentwhentheUpdateWindoworRedrawWindowfunctioniscalled,orbytheDispatchMessagefunctionwhentheapplicationobtainsaWM_PAINTmessagebyusingtheGetMessageorPeekMessagefunction.WM_PAINThdc=(HDC)wParam;/thedevicecontexttodrawin,四、常用消息及其使用9/10,四、应用程序举例,【例2-1】创建应用程序框架。本例的目的在于说明创建Windows应用程序的方法及过程,#include/包含应用程序中所需的数据类型和数据结构的定义/窗口函数说明LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);/-以下初始化窗口类-intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInst,LPSTRlpszCmdLine,intnCmdShow)HWNDhwnd;MSGMsg;WNDCLASSwndclass;charlpszClassName=窗口;/窗口类名charlpszTitle=My_Windows;/窗口标题名,/窗口类的定义wndclass.s

温馨提示

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

评论

0/150

提交评论