资源预览内容
第1页 / 共58页
第2页 / 共58页
第3页 / 共58页
第4页 / 共58页
第5页 / 共58页
第6页 / 共58页
第7页 / 共58页
第8页 / 共58页
第9页 / 共58页
第10页 / 共58页
亲,该文档总共58页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
信息系统技术基础信息系统技术基础-2授课老师:王志宏;王长军实验老师:王长军1高等课堂Contact InformationlName:王长军lOffice:721lTel:62378372(O);13816261856(M)lEmail:cjwangdhu.edu.cnlPersonalInformationl2007-Present物流系,DHUl2005-2006ComputerSystemDivision,SECl2002-2005SJTU2高等课堂课程概要企业信息化、政府信息化和社会信息化孕育着巨大的软件市场企业信息化、政府信息化和社会信息化孕育着巨大的软件市场新技术(新技术(IPV6、3G、移动、移动IP、Wibro、蓝牙、蓝牙、RFID)驱动软件市场)驱动软件市场新商业模式(新商业模式(E-Commerce、M-Commerce)拉动软件市场)拉动软件市场软件是软件是IT的核心与灵魂的核心与灵魂3高等课堂课程概要l王志宏l操作系统相关l王长军l软件项目开发基础lWindowsAPI编程基础(消息机制;进程/线程;图形接口)l软件项目实施基础4高等课堂Windows消息机制王长军2007年7月5高等课堂讲授内容l1. 课程背景课程背景l2. Windows程序的特点程序的特点l3. 事件与消息系统事件与消息系统 l4. Windows程序的基本结构程序的基本结构l5. 实验实验:利用利用API 开发开发Windows程序实例程序实例6高等课堂1.1预备知识lWindows操作系统:用过吧!用过吧!l一门编程语言:C/VB,学过吧!,学过吧!(C#, Java, Delphi)l一个适合Windows程序设计的编译器和开发环境:Microsoft Visual C+ 6.0/ Visual Basic 6.07高等课堂1.2课程目标l不是编程lAPI(ApplicationProgrammingInterface)而不是MFC(MicrosoftFoundationClass)l消化”消息”8高等课堂1.3Windows相关lAPI就是应用程序编程接口。它是能用来操作组件、应用程序或者操作系统的一组函数。典型的情况下,API由一个或多个提供某种特殊功能的DLL组成l每个Windows应用程序都直接或间接地使用了WindowsAPIl随着Windows操作系统的发展,WindowsAPI的内容也在不断扩充之中9高等课堂1.3Windows相关MS-DOSIBM-PC有限的I/O函数1981OS硬件MS1.03.016bitHWAPI函数1983图形环境NTXP16/32bitHWAPI函数1993图形环境Vista32/64bitHWAPI函数20063D图形环境过程驱动过程驱动消息驱动消息驱动10高等课堂1.3Windows相关NTXP32bitHWAPI函数1993图形环境Vista32/64bitHWAPI函数20063D图形环境MFC(MicrosoftFoundationClassLibrary)WPF(WindowsPresentationFoundation)WCF(WindowsCommunicationFoundation)WWF(WindowsWorkflowFoundation)11高等课堂1.3Windows相关lDOS与Windows驱动机制的区别lDOS是过程驱动l在等待用户输入过程中,所有输入设备(资源)都被“等待”过程抢占了。lWindows是消息(事件)驱动12高等课堂2.Windows程序的特点l2.1图文图文l2.2消息消息l2.3整合整合13高等课堂2.1图文l1不仅是黑底白字不仅是黑底白字l2. 而是而是 l框架菜单按钮滚动条框架菜单按钮滚动条l称为窗口要素称为窗口要素l3. 窗口类型窗口类型 lConsole 文字类型文字类型lWindow 菜单菜单+用户区域用户区域lDialoglMessage Boxl4. 实现途径实现途径GDI(图形设备接口,(图形设备接口,GDI32.dll)14高等课堂2.2消息l不再是循规蹈矩不再是循规蹈矩 而是而是Messagebased,eventdrivenl窗口程序的主要任务是人机交互l除非人主动结束任务,程序以while循环为主体框架l人不断进行各种输入,计算机不断响应,形成“输入”“响应”的程序结构15高等课堂2.2消息l各种类型的“输入”,以消息格式存在lGetMessage()取走一个消息l对事件的响应,即事件驱动lDispatchMessage()处理消息l实现途径实现途径User32.dll16高等课堂2.3整合lMSWindows结构lOS系统服务(KERNEL):内存管理、程序加载(包括DLL)、任务调度、文件管理l用户接口(USER):窗口和消息管理,以及菜单、控制、对话框、定时器等l图形设备接口(GDI, Graphic Device Interface):管理显示器,为USER与应用程序提供与硬件设备独立的接口l对应的,API函数也分为三类:l系统服务;管理和图形设备函数17高等课堂2.3整合.DLG.DLG.BMP.BMP.ICO.ICO.CUR.CUR.FON.FON.RC.RC.H.H.C.C.OBJ.OBJ.LIB.LIBDLL ImportDLL Import.DEF.DEFRC compilerRC compilerText EditorText EditorDialog EditorDialog EditorImage EditorImage EditorFont EditorFont EditorC CompilerC CompilerLINKERLINKER.EXE.EXE.RES.RES18高等课堂3.事件与消息系统l3.1事件和事件驱动事件和事件驱动l3.2消息系统消息系统l3.3一个具体的窗口程序一个具体的窗口程序19高等课堂3.1事件和事件驱动lWindows程序为消息而“生”,因消息而“死”l那么,消息从何而来?Windows操作环境中,无论是系统产生的动作或用户运行应用程序产生的动作,称为事件(Events)产生的消息(Message)。l那么,事件又从何而来?l通过输入设备,如键盘和鼠标l通过屏幕上可视的对象,如菜单、工具栏按钮、滚动条和对话框上的控件l来自Windows内部20高等课堂基于事件驱动的程序模型3.1事件和事件驱动21高等课堂Windows消息系统的组成消息系统的组成消息队列消息循环窗口过程3.2消息系统22高等课堂消息的数据结构消息的数据结构消息的数据结构MSG的定义如下:typedefstructtagMSGHWNDhwnd;/用以检索消息的窗口句柄UINTmessage;/消息值WPARAMwParam;/包含有关消息的附加信息LPARAMlParam;/随不同的消息而有所不同DWORDtime;/消息送到队列的时间POINTpt;/消息发送时,屏幕光标的位置MSG;3.2消息系统23高等课堂 Windows常用消息常用消息WM_LBUTTONDOWN:单击鼠标左键时产生的消息;WM_LBUTTONUP:放开鼠标左键时产生的消息;WM_RBUTTONDOWN:单击鼠标右键时产生的消息;WM_RBUTTONUP:放开鼠标右键时产生的消息;WM_LBUTTONDBLCLK:双击鼠标左键时产生的消息;WM_RBUTTONDBLCLK:双击鼠标右键时产生的消息;WM_CREATE:CreateWindows()函数产生的消息;WM_CLOSE:关闭窗口时产生的消息;WM_QUIT:退出应用程序时由PostQuitMessage()发出的消息;WM_PAINT:Windows系统需要重绘时产生的消息。3.2消息系统24高等课堂3.2消息系统消息队列消息队列l消息队列是系统定义的内存块,用于临时存储消息;或是把消息直接发给窗口过程l在16位的系统中系统中只有一个消息队列l32位的系统中每一运行的程序都会有一个消息队列25高等课堂支持队列特征的消息驱动模型 3.2消息系统消息队列消息队列26高等课堂3.2消息系统什么是消息循环什么是消息循环while(GetMessage(&Msg,NULL,0,0)0)TranslateMessage(&Msg);DispatchMessage(&Msg);27高等课堂3.2消息系统Windows消息处理示意图消息处理示意图Windows系统应用程序队列A应用程序队列B系统队列事件输入WinMain函数消息循环窗口函数1窗口函数2WinMain函数消息循环窗口函数1窗口函数2应用程序A应用程序B消息循环消息循环28高等课堂WinMainWinMain()()()() 初始化;初始化;初始化;初始化; while(GetMessage(&msg)while(GetMessage(&msg) TranslateMessage( ); TranslateMessage( ); DispatchMessage( ); DispatchMessage( ); 系统系统系统系统消息消息消息消息队列队列队列队列WndProc(msg)WndProc(msg) switch(msg)switch(msg)case MSG1:case MSG1:case MSG2:case MSG2: 应用应用应用应用程序程序程序程序消息消息消息消息队列队列队列队列mousemousedriverdriverkeyboardkeyboarddriverdriverSendMessage()SendMessage()USERUSERModulModule emessage frommessage fromOther windowOther windowPostMessage()PostMessage()system3.3一个具体的窗口程序29高等课堂4.Win32程序的基本结构l4.1.Windows程序组成l4.2.详解入口,窗口,消息l4.3.Windows数据类型l4.4.Windows程序的“生生死死”30高等课堂lWinMain()程序入口点l注册窗口RegisterClass()l生成并显示窗口CreateWindow()ShowWindow()l消息循环lWndProc()窗口函数(功能实现)l区分消息switchl根据消息触发相应处理l调用DefWindowProc()不处理的消息、和需要系统进一步处理的消息如WM_CLOSE,使用者关闭了窗口。应用程序获得这个消息后,释放了自己的资源,然后让系统进一步执行关闭窗口的动作4.1.Windows程序组成31高等课堂WinMainWinMain()()()() 初始化;初始化;初始化;初始化; 创建、显示、更新窗口;创建、显示、更新窗口;创建、显示、更新窗口;创建、显示、更新窗口; 建立基于消息的建立基于消息的建立基于消息的建立基于消息的 事件驱动机制事件驱动机制事件驱动机制事件驱动机制 WinMainWinMain()()()() RegisterClass( );RegisterClass( ); CreateWindow( );CreateWindow( ); ShowWindow( ); ShowWindow( ); UpdateWindow( ); UpdateWindow( ); while(GetMessage(&msg) while(GetMessage(&msg) TranslateMessage( ); TranslateMessage( ); DispatchMessage( ); DispatchMessage( ); WinMainWinMain()程序入口点()程序入口点()程序入口点()程序入口点4.2.详解入口32高等课堂4.2.详解入口WinMain函数的原型如下:int WINAPI WinMain (HINSTANCE hInstance, / 当前实例句柄当前实例句柄HINSTANCE hPrevInstance, / 以前的实例句柄以前的实例句柄LPSTR lpCmdLine, / 指向命令行参数的指针指向命令行参数的指针int nCmdShow ) / 窗口的显示状态窗口的显示状态33高等课堂初始化包括初始化包括l定义窗口l注册窗口l创建窗口l显示窗口需要注意的是,在显示窗口ShowWindow函数后,需调用UpdateWindow()函数更新并绘制用户区,并发出WM_PAINT消息。4.2.详解窗口34高等课堂l注册窗口RegisterClass()在注册之前可以设置窗口属性,系统会给出一些缺省值,我们重点关心其中的lpfnWndProc参数WNDCLASS wc;WNDCLASS wc;wc.stvle = ;wc.stvle = ;wc.lpfnWndProc wc.lpfnWndProc (WNDPROCWNDPROC)WndProc;WndProc;提示系统收到消息后,调该函数处理消息提示系统收到消息后,调该函数处理消息提示系统收到消息后,调该函数处理消息提示系统收到消息后,调该函数处理消息wc.hIcon = wc.hIcon = wc.Cursor = wc.Cursor = wc.hbrBackground = wc.hbrBackground = RegisterClass(&wc);RegisterClass(&wc);4.2.详解窗口35高等课堂lCreateWindow()lShowWindow()lUpdateWindow()4.2.详解窗口 HWND CreateWindow( LPCTSTR lpClassName, /已注册的窗口类名 LPCTSTR lpWindowName, /窗口标题 DWORD dwStyle, /窗口风格 int x, /窗口的水平位置 int y, /窗口的垂直位置 int nWidth, /窗口宽度 int nHeight, /窗口高度 HWND hWndParent, /父窗口句柄 HMENU hMenu, /菜单句柄或控件标识 HINSTANCE hInstance, /应用程序实例句柄 LPVOID lpParam ) /其他窗口创建时的参数数据36高等课堂l消息l本身是一个无符号整型变量l类型有lWM_COMMAND:系统命令类,菜单选择,按钮等lWM_PAINT:对窗口作图lWM_DESTORY:关闭窗口lWM_USER:用户可自定义一些消息l在某个特定类型之下,更有许多事件,一般通过wParam通知4.2.详解消息37高等课堂while(GetMessage(&msg)TranslateMessage(&msg);/消息转换DispatchMessage(&msg);lGetMessage具有阻塞机制l当消息队列中没有消息时,程序非忙等,而是让权等待l当收到WM_QUIT时,GetMessage返回false,循环停止,同时应用程序终止。lDispatchMessagel通过USER模块协助,将消息传递到WndProclWndProc的调用指示在注册窗口类时,已向系统指明4.2.详解消息采集38高等课堂WndProc( HWND hWnd, UINT message,WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) WPARAM wParam, LPARAM lParam)HWND hWnd: HWND hWnd: 窗口句柄,在与窗口有关的控制中使用窗口句柄,在与窗口有关的控制中使用窗口句柄,在与窗口有关的控制中使用窗口句柄,在与窗口有关的控制中使用UINT messageUINT message:消息(类型):消息(类型):消息(类型):消息(类型)WPARAM wParamWPARAM wParam:传递的参数:传递的参数:传递的参数:传递的参数LPARAM lParamLPARAM lParam: 传递的参数传递的参数传递的参数传递的参数1-1-在基于消息的机制中,有时仅有消息是不够的在基于消息的机制中,有时仅有消息是不够的在基于消息的机制中,有时仅有消息是不够的在基于消息的机制中,有时仅有消息是不够的2-2-产生消息的同时,传递什么样的参数要视具体产生消息的同时,传递什么样的参数要视具体产生消息的同时,传递什么样的参数要视具体产生消息的同时,传递什么样的参数要视具体的消息而定的消息而定的消息而定的消息而定4.2.详解消息处理l消息处理函数是用于处理特定消息的一些代码,一般包括一个多分支switch语句结构。39高等课堂WndProc( hWnd, message, wParam, lParam)WndProc( hWnd, message, wParam, lParam) switch(message)switch(message)case WM_COMMANDcase WM_COMMAND:id = LOWORD(wParam)id = LOWORD(wParam);Switch(id) Switch(id) case IDM_OPENcase IDM_OPEN:breakbreak;菜单中的菜单中的菜单中的菜单中的openopen选项选项选项选项 case WM_PAINT:case WM_PAINT:在视窗作图;在视窗作图;在视窗作图;在视窗作图;breakbreak;defaultdefault:DefWindowProc();DefWindowProc();4.2.详解消息处理40高等课堂消息的处理消息的处理消息的处理消息的处理4.2.详解消息处理思考:怎样根据功能要求思考:怎样根据功能要求思考:怎样根据功能要求思考:怎样根据功能要求生成消息,并把这个消息生成消息,并把这个消息生成消息,并把这个消息生成消息,并把这个消息传递给窗口函数?传递给窗口函数?传递给窗口函数?传递给窗口函数?窗口程序的可能结构WindowsWindows系统系统系统系统显示显示显示显示产生消息产生消息在窗口中显示在窗口中显示41高等课堂4.3.Windows数据类型Windows数据类型数据类型对应的基本数据对应的基本数据类型类型(C语言语言)说明说明BOOLbool布尔值BSTRunsignedshort*32位字符指针BYTEunsignedchar8位无符号整数COLORREFunsignedlong用作颜色值的32位值DWORDunsignedlong32位无符号整数,段地址和相关的偏移地址LONGlong32位带符号整数LPARAMlong作为参数传递给窗口过程或回调函数的32位值LPCSTRconstchar*指向字符串常量的32位指针LPSTRchar*指向字符串的32位指针LPVOIDvoid*指向未定义类型的32位指针LRESULTlong来自窗口过程或回调函数的32位返回值UINTunsignedint32位无符号整数WORDunsignedshort16位无符号整数WPARAMunsignedint当作参数传递给窗口过程或回调函数的32位值42高等课堂lWindows将使用的所有类型定义在Windows.h文件和其相关的文件中。l一些常用的类型有句柄(HANDLE)、窗口句柄(HWND)、字符(BYTE)、短整数(WORD)、布尔型(BOOL)、字符串指针(LPSTR)以及常量字符串指针(LPCSTR)等。lHANDLE是一个用作句柄的32位整数,句柄是代表某些资源的简单的数值,所有的句柄类型以H开头。l凡是数据类型的前缀是前缀是P或或LP,则表示该类型是一个指针或长指针数据类型指针或长指针数据类型。若前缀是前缀是U,则表示无符号数,则表示无符号数据类型据类型,等等。4.3.Windows数据类型43高等课堂l程序初始化过程中调用CreateWindow,为程序创建了一个窗口,CreateWindow送出WM_CREATE直接给窗口函数,后者可以在此时做些初初始化始化操作;l在程序运行过程中,不断以GetMessage从消息队列中取得消息。如果这个如果这个消息是消息是WM_QUIT,GetMessage会得到会得到false的返回值而结束循环,进而结的返回值而结束循环,进而结束整个程序;束整个程序;lDispatchMessage通过系统USER模块的协助与监督,把消息分派至窗口函数,消息将被处理;l程序不断循环;l当使用者按下系统菜单中的Close命令时,系统送出WM_CLOSE,通常窗口程序不处理它,由DefWindowProc处理;lDefWindowProc处理WM_CLOSE,调用DestoryWindow把窗口清除,送出WM_DESTORY;l窗口程序对WM_DESTORY的处理是调用PostQuitMessage;lPostQuitMessage送出WM_QUIT,于是WinMain的循环结束了,整个应用程序也结束了。4.4.Windows程序的“生生死死”44高等课堂CreateWindow()CreateWindow()WM_CREATEWM_CREATEGetMessage()GetMessage()DispatchMessage(DispatchMessage(WM_CREATEWM_CREATE) )WndProc(WndProc(WM_CREATEWM_CREATE) )用户程序初始化用户程序初始化用户程序初始化用户程序初始化启动启动启动启动4.4.Windows程序的“生”WinMain()WinMain() 初始化;初始化;初始化;初始化; CreateWindow();CreateWindow(); while(GetMessage(&msg) while(GetMessage(&msg) TranslateMessage( ); TranslateMessage( ); DispatchMessage( ); DispatchMessage( ); WndProc(msg)WndProc(msg) switch(msg)switch(msg)case WM_CREATE:case WM_CREATE:用户程序初始化用户程序初始化用户程序初始化用户程序初始化case WM_DESTORY:case WM_DESTORY:PostQuitMessage()PostQuitMessage()default:default:DefWindowProc()DefWindowProc() 45高等课堂使用者按下关闭按钮使用者按下关闭按钮使用者按下关闭按钮使用者按下关闭按钮WM_CLOSEWM_CLOSEGetMessage()GetMessage()DispatchMessage( WM_CLOSE)DispatchMessage( WM_CLOSE)WndProc(WM_CLOSE)WndProc(WM_CLOSE)DefWindowProc(WM_CLOSE)DefWindowProc(WM_CLOSE)关闭关闭关闭关闭WinMain()WinMain() 初始化;初始化;初始化;初始化; CreateWindow();CreateWindow(); while(GetMessage(&msg) while(GetMessage(&msg) TranslateMessage( ); TranslateMessage( ); DispatchMessage( ); DispatchMessage( ); WndProc(msg)WndProc(msg) switch(msg)switch(msg)case WM_CREATE:case WM_CREATE:用户程序初始化用户程序初始化用户程序初始化用户程序初始化case WM_DESTORY:case WM_DESTORY:PostQuitMessage()PostQuitMessage()default:default:DefWindowProc()DefWindowProc() DestoryWindow( )DestoryWindow( )WM_DESTORYWM_DESTORYGetMessage()GetMessage()DispatchMessage( WM_DESTORY)DispatchMessage( WM_DESTORY)WndProc(WM_DESTORY)WndProc(WM_DESTORY)PostQuitMessage()PostQuitMessage()WM_QIUTWM_QIUTGetMessage()GetMessage()返回为返回为返回为返回为0,while0,while结束结束结束结束WinMainWinMain结束,整个程序结束结束,整个程序结束结束,整个程序结束结束,整个程序结束4.4.Windows程序的“死”46高等课堂下面介绍建立基于API的应用程序框架的步骤。l(1)在File下拉菜单中选择New选项,以建立项目文件。l(2)在弹出的New对话框中,选择Projects选项卡,并选择其中的Win32Application项,在ProjectName编辑框中填人所要创建的项目文件名Myapi,然后单击OK按钮。l(3)此时弹出如后图所示的界面,选择其中的Anemptyproject选项,说明是创建一个空的项目文件。5.实验:利用API开发Win32程序实例47高等课堂Win32 Application Step 1 of 1对话框5.利用API开发Win32程序实例48高等课堂New Project Information对话框5.利用API开发Win32程序实例49高等课堂空的Win32应用程序框架界面 5.利用API开发Win32程序实例50高等课堂Insert Files into Project对话框 5.利用API开发Win32程序实例51高等课堂Windows窗口程序的运行结果 5.利用API开发Win32程序实例52高等课堂源程序代码如下:#include/窗口函数说明LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);/初始化窗口类/WinMain函数说明intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInst,LPSTRlpszCmdLine,intnCmdShow)HWNDhwnd;MSGMsg;WNDCLASSwndclass;charlpszClassName=“窗口”;/窗口类名charlpszTitle=My_Windows;/窗口标题名5.利用API开发Win32程序实例53高等课堂wndclass.0;/窗口类型为缺省类型wndclass.lpfnWndProc=WndProc;/窗口处理函数为WndProcwndclass.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=lpszClassName;/窗口类名为“窗口示例”/窗口类注册if(!RegisterClass(&wndclass)/如果注册失败,则发出警告声音MessageBeep(0);returnFALSE;5.利用API开发Win32程序实例54高等课堂/创建窗口hwnd=CreateWindow(lpszClassName,/窗口类名lpszTitle,/窗口实例的标题名WS_OVERLAPPEDWINDOW,/窗口的风格CW_USEDEFAULT,CW_USEDEFAULT,/窗口左上角坐标为缺省值CW_USEDEFAULT,CW_USEDEFAULT,/窗口的高和宽为缺省值NULL,/此窗口无父窗口NULL,/此窗口无主菜单hInstance,/创建此窗口的应用程序的当前句柄NULL);/不使用该值/显示窗口ShowWindow(hwnd,nCmdShow);5.利用API开发Win32程序实例55高等课堂/绘制用户区UpdateWindow(hwnd);/消息循环while(GetMessage(&Msg,NULL,0,0)TranslateMessage(&Msg);/将消息的虚拟键转换为字符信息DispatchMessage(&Msg);/将消息传送到指定窗口returnMsg.wParam;/消息循环结束即程序终止时将信息返回系统5.利用API开发Win32程序实例56高等课堂/窗口函数LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAM wParam,LPARAMlParam)switch(message)caseWM_DESTROY:PostQuitMessage(0);/调用PostQuitMessage发出WM_QUIT消息default:/默认时采用系统消息默认处理函数returnDefWindowProc(hwnd,message,wParam,lParam);return(0);5.利用API开发Win32程序实例57高等课堂谢谢!谢谢!58高等课堂
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号