cwindows编程基础andMFC.ppt_第1页
cwindows编程基础andMFC.ppt_第2页
cwindows编程基础andMFC.ppt_第3页
cwindows编程基础andMFC.ppt_第4页
cwindows编程基础andMFC.ppt_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

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

文档简介

1,第四章 Windows编程基础,河北经贸大学信息技术学院,VC+语言程序设计,2,本章导读,Windows操作系统是一个多任务、面向对象的图形操作系统。 在Windows操作环境中, Windows应用程序采用“基于消息的事件驱动”运行机制,这是它与过去的面向过程的应用程序机制的不同之处。,面向过程的编程方式:程序执行的流程遵从程序员预先规定的路径. 面向对象的Windows程序执行顺序取决于事件和消息发生的顺序。 Windows应用程序设计的重点是编写事件和消息的处理程序。,3,本章主要内容,Windows编程的概念 Windows应用程序的基本结构 利用Windows API函数编写Windows应用程序,4,编写Windows应用程序必须首先了解以下内容: (1)窗口的概念 (2)事件驱动的概念 (3)消息 (4) 句柄,编写Windows 程序相当一部分工 作是在创建对象和 为对象属性赋值,对象特征:具有规范形态和操作模式,4.1 Windows编程的概念,一个应用程序的窗口一般包含下列组成部分:,1. 窗口 P123,6,窗口是由应用程序创建的一个用于接收用户输入和显示输出的矩形区域。是系统管理应用程序的基本单位。 窗口由“非客户区”和“客户区”组成。 非客户区由系统绘制,包括菜单、工具栏、最大化按钮等。客户区由应用程序绘制,用于输出数据和接受用户的输入。 编写一个Windows应用程序首先应创建一个或多个窗口,随后应用程序的运行过程即是窗口内部、窗口与窗口之间、窗口与系统之间进行数据处理与数据交换的过程。,1. 窗口,7,Windows程序设计是针对事件或消息的处理进行 。,消息是描述事件发 生的信息 如按下鼠标或键盘,Windows对消息有一套严格的定义,并在其产生时将其发送给所有相关的应用程序,这些消息用于驱动应用程序运行以实现一定的功能。,Windows程序的执行顺序取决于事件发生的顺序,程序的执行顺序是由顺序产生的消息驱动的,但是消息的产生往往并不要求有次序之分。,2.事件驱动 P119-123,8,消息驱动机制 P119,派送消息,消息源1,消息源2,消息源n,否,捕获消息,是否退出 消息,是, ,处理消息,9,3 消息,消息的含义 消息来源 消息队列 消息的结构,消息是关于所发生的事件的通知.事件是一个动作,如按下鼠标、选择菜单,输入消息、控制消息、系统消息、用户消息,USER 用户交互内核 来管理,10,Windows应用程序的结构是基于消息驱动模型,程序的任何一个动作都是在接收到一条消息后发生的,如: WM_KEYDOWN WM_KEYUP WM_CHAR WM_LBUTTONDOWN WM_LBUTTONUP WM_PAINT WM_COMMAND等, 每条消息都可以带有参数(wParam,lParam)。 大部分的消息都关联到某个窗口,每个窗口都有一个消息处理过程(函数),属于某个窗口的消息都将由相应的消息处理过程来进行处理。 每个Windows应用程序都有一个消息队列,Windows系统会把属于各个应用程序的消息放入各自的消息队列,应用程序不断地从自己的消息队列中获取消息并把它们发送到相应的窗口处理过程。这个循环(取消息-处理消息)一直到用户以某种方式(如:关闭应用程序的主窗口)结束程序而终止。下面给出了Windows应用程序的一个框架:,消息的含义,消息队列,USER 用户交互内核,12,消息的结构定义: typedef struct tagMSG HWND hwnd;接收消息的窗口句柄,为null,则可检索所有驻留在消息队列中的消息 UINT message;消息值,由Windows.h头文件中的宏定义来标识 WPARAM wParam;32位消息的附加信息wParam和lParam,不同消息其值有所不同 LPARAM lParam; DWORD time; 指定消息送至队列的时间 POINT pt;指定消息发送时屏幕光标的位置, 其数据类型POINT是一个结构体 MSG;,附加信息与具体消息号的值有关, 对于控件,含义见P167,typedef struct tagPOINT LONG x; LONG y; POINT;,消息的结构,13,常用句柄类型及其说明,应用程序通过 句柄访问相应 的对象信息,HWND 窗口句柄 HDC 设备环境句柄 HBITMAP 位图句柄 HCURSOR 光标句柄 HICON 图标句柄 HFONT 字体句柄 HMENU 菜单句柄 HPEN 画笔句柄 HFILE 文件句柄 HBRUSH 画刷句柄 HINSTANCE 当前实例句柄,4. 句柄 P121,要理解句柄,应注意几点:P121,14,一个完整的Windows应用程序通常由五种类型的文件组成。,1.C语言源程序文件 2.头文件 3.模块定义文件 4.资源描述文件 5.项目文件,1. 应用程序的组成,4.2 Windows应用程序的基本结构,一个windows应用程序常具有以下特性: (1)消息驱动机制 (2)图形设备界面(GDI) (3)基于资源的程序设计 (4) 动态链接库,15,1. 所有应用程序的入口,类似Main函数, 2. 完成一系列的定义和初始化,并产生消息循环,2. 源程序组成结构(API P127),16,(1) WinMain函数 P127,三个基本的组成部分:函数说明、初始化和消息循环 详见P127129,WinMain()函数,相当于main(),17,WndProc函数由一个或多个switch语句组成。每一条case语句对应一种消息,当应用程序接收到一个消息时,相应的case语句被激活并执行相应的响应程序模块。 例见P129代码,(2) 窗口函数WndProc和消息处理 P129,18,N,N,Y,Y,3. Windows应用程序的执行过程,19,在Windows.h中定义了Windows 应用程序中包含种类繁多的数据类型,4数据类型,20,MSG:包含一个消息的全部信息,是消息发送的格式,WNDCLASS:包含一个窗口类的全部信息及属性,POINT:定义了屏幕上或窗口中的一个点的X和 Y坐标,RECT:定义了一个矩形区域及其左上角和右下角的坐标,几种重要的结构,5. 一些重要的数据结构,21,API,API函数 的功能,附:API函数概念 (补充),作业 P131 4-1、4-2、4-3,22,第五章 MFC编程基础,河北经贸大学信息技术学院,VC+语言程序设计,23,本章主要内容,MFC类库简介 MFC中类的层次结构 MFC应用程序框架 利用AppWizard生成MFC应用程序 MFC的消息处理,24,本章导读,MFC类基础。 利用向导建立一个MFC应用程序框架。,MFC消息处理机制 键盘、鼠标和自定义消息的处理。,25,5.1 MFC简介 P132,类库是一个可以在应用程序中使用的相互关联的类的集合。 MFC库Microsoft 基本类库是一个Windows应用程序框架,它把传统的Windows编程规范中的大多数内容封装成为各种类,它定义了应用程序的结构,并实现了标准的用户接口,提高了编程效率 可以管理窗口、菜单、对话框,实现基本的输入/输出和数据存储。,MFC库简介,26,5.2 MFC类的层次结构和常用类详见P133-138,MFC分类 CObject_derived 类 Non_CObject_derived 类,根类,命令相关类,应用程序类,窗口类,文档类,视图类,框架窗口类,线程基类,27,非CObject派生类,通用工具类 CString CTime CRect Cpoint CSize,MFC支持类 CArchive CDumpContext CRuntimeClass CFileStatus CMemoryState CTypePointerArray,其他详见 P134138,28,5.3 MFC应用程序框架结构,MFC库简介,MFC的应用程序框架优点: MFC按照C+类的层次形式组织在一起, 类封装了Windows API函数并提供Windows应用程序常见任务的缺省处理代码。几个基类提供一般功能,由基类派生的类实现更具体的行为。 MFC提供了文档和视图模型以实现数据和显示的分离。文档类(Document)用来维护、管理数据,包括数据的读取、存储与修改;视图类(View)用来接收并显示数据,将这些数据交给文档类来处理。 MFC库提供了自动消息处理功能。MFC的框架结构通过消息映射机制,将Windows消息直接映射到个成员函数进行处理, 简化了消息的处理方式。,29,应用程序框架包含用于生成应用程序所必需的各种面向对象的组件的集合. VC+6.0中,MFC APPWizard能方便地生成应用程序框架,然后在此基础上进行进一步的编辑工作. MFC生成的应用程序包括如下一些要素:,30,WinMain()函数,隐藏在应用程序框架中; 应用程序类(如CMyHelloApp),该类的每个对象代表一个应用程序,程序中默认定义一个全局CMyHelloApp对象即theApp; 应用程序启动WinMain()寻找由CWinApp派生出的全局构造的应用程序对象; 成员函数:CMyHelloApp:InitInstance(),调用所需的构造并显示应用程序的主框架窗口; 成员函数:CWinApp:Run(),隐藏在基类中,发送应用程序的消息到窗口,保持应用程序的正常运行;,MFC库简介,31,CMainFrame类,其对象代表应用程序的主框架窗口; CDocument/CView类,应用程序框架的核心。MFC通过“文档一视图“结构为应用程序提供一种将数据与视图相分离的存储方式。 文档类的作用是将应程序的数据保存在文档类对象中,以及从磁盘文件中读或向磁盘文件中写数据。 视图类的作用是显示数据和编辑数据。 关闭应用程序,MFC库简介,32,应用程序的运行机制 P144,MFC应用程序有自己特殊的运行机制,下面以WinHello程序为例,列出应用程序的执行过程。,程序开始,初始化全局对象theApp,CWinApp类构造函数,CHelloApp类构造函数,AfxWinMain函数,pApp- InitInstance(),调用ProcessShellCommand()创建主框架窗口对象、视图对象、文档对象,创建主框架窗口和视图窗口并显示,CWinThread:Run() WM_QUIT,消息循 环,结束,pApp- Run(),CHelloApp theApp,CWinApp *pApp=AfxGetApp();,WinMain,pApp-InitApplication();,33,5.3 利用AppWizard生成MFC应用程序,创建工程:用VisualC+的MFC AppWIzard创建应用程序的基本框架 可视化设计:用VC+ 自带的工具软件Wizards,制作Windows风格的图形用户界面和各种控件。 编写程序代码:用MFCClassWizard添加消息相应函数,然后编写函数代码。,34,MyHello应用程序 P138-142,创建工程 “File/New/Project/MFC AppWizard(exe)” Project name:”MyHello”;Location:”d:MyVC” 根据向导选择: Single document 中文中国 None 其它接受默认设置,最后单击“ Finish”,显示“New Project Information”窗口。,35,MyHello应用程序,编写程序代码 “Workspace/FileView/MyHelloView.cpp” 找到函数OnDraw(CDC *pDC),在其中添加显示字符串: pDC-TextOut(100,80,”Hello,我们开始VC+编程了!”);,36,MyHello应用程序,编译运行 编译: “Build/Build MyHello.exe” 运行:“Build/Execute MyHello.exe” 关闭:关闭运行窗口,37,MyHello应用程序分析,打开“Workspace”窗口中的”Class View( 类视图),MFC生成5个类 CAboutDlg CMainFrame CMyHelloApp CMyHelloDoc CMyHelloView 对于每个类MFC生成两个文件: .h:定义了类和它的各种变量、函数原形; .cpp:生成类对象、实现这个类的函数体。,38,MyHello应用程序分析,CMyHelloApp类: 派生于MFC的CWinApp类,作用是初始化应用程序及运行该程序的所需的成员函数。 MyHello.h:声明了CMyHelloApp类, 虚函数InitInstance()的作用:设置注册数据库,载入标准设置(最近打开的文件列表等)、注册文档模板,其中在注册文档模板时隐含创建了主窗口接下来处理命令行参数,显示窗口,然后返回、进入消息循环。,39,MyHello应用程序分析,CMainFrame类: 派生于MFC的CFrameWnd类,作用是管理应用程序的窗口,显示标题栏、状态栏、工具栏等,同时处理针对窗口操作的信息。 MainFrm.h:声明了两个主要函数PreCreateWindow()和OnCreate() 及两个对象m_wndStatusBar(管理状态栏)和m_wndToolBar(管理工具栏),40,MyHello应用程序分析,CMyHelloDoc类: 派生于MFC的CDocument类,作用是存放应用程序的数据以及文件的保存加载功能。文档类要通过视图类来实现与用户的交互。 CMyHelloDoc.h:声明了三个主要函数OnNewDocument()用于初始化文档 Serialize()串行化(保存和装入)文档 Dump()用于调试诊断。,41,MyHello应用程序分析,CMyHelloView类: 派生于MFC的CView类,作用是管理视图窗口,它对应的对象在框架窗口中实现用户数据的显示和打印。 MyHelloView.h:声明了三个函数用于实现数据打印OnPreparePrinting()/ OnBeginPrinting()/ OnEndPrinting()。 GetDocument():返回CMyHelloDoc指针,获取文档指针 OnDraw():实现视图数据的显示和刷新。,42,MyHello应用程序分析,预编译头文件stdafx.h: 用于建立一个预编译的头文件MyHello.pch和一个预定义的类型文件stdafx.obj,加速编译过程。 资源文件:Resource.h MyHello.ioc:应用程序的图标 MyHello.rc2:不可直接编辑的资源 Toolbar.bmp:工具栏用到的位图资源 MyHelloDov.ico:生成文档的图标 ReadMe.txt,43,5.4 MFC消息处理 详见P148-151,MFC应用程序与其他任何 Windows 程序一样,也使用消息驱动机制,但 MFC 提供的消息处理机制使得消息的处理更加容易。 MFC中消息可以分为三类: Windows 消息(窗口消息):包括以 WM_开头的消息,但 WM_COMMAND 除外。Windows消息由窗口和视图处理。这种消息通常附带一些参数传递给处理函数,这些参数为处理函数正确地处理消息提供了必要的信息。 控件通知消息:当控件的状态发生改变(例如用户利用控件进行输入)时,控件就会向其父窗口发送控件通知消息。MFC对控件通知消息的传递方式与其他以WM_开头的 Windows 消息一样,但 BN_CLICKED 是个例外,该消息的传递方式与命令消息的传递机制一样。 命令消息:包括来自于菜单、工具栏中的按钮和加速键等用户界面对象的WM_COMMAND 通知消息。,44,消息映射,声明 宏 p148-149 DECLEAR_MESSAGE_MAP() (.h文件) BEGIN_MESSAGE_MAP() /实现(.cpp) . ON_Message(ID, ClassMethod) END_MESSAGE_MAP() 消息映射项 ON_Message(ID, ClassMethod) 窗口消息、命令消息、控件通知消息的消息映射项不同,详见P149-150 消息处理方法 afx_msg void ClassMethod(); 发送消息SendMessage() 直接调用窗口函数 P151 寄送消息PostMessage()到队列,45,VC中存在几种系统定义的消息分类,不同的前缀符号经常用于消息宏识别消息附属的分类,系统定义的消息宏前缀如下:,BN 按钮控制消息 CBN 组合框控制消息 DN 默认下压式按钮控制消息 EN 编辑控制消息 LBN 列表框控制消息 SBN 滚动条控制消息 WM 窗口消息,窗口管理消息 初始化消息 输入消息 系统消息 剪贴板消息 控制处理消息 控制通知消息 滚动条通知消息 非用户区消息 MDI消息 DDE消息 应用程序自定义的消息,Windows编 程常用消息,46,鼠标作为定位输入设备,通过鼠标单击、双击和拖动功能,用户可以很容易地操作基于Windows图形界面的应用程序。,常用鼠标消息:,鼠标消息处理,47,相当于窗口的左上 角为原点的坐标值,48,对于鼠标消息的处理,不监测Shift和Ctrl键,case WM_LBUTTONDOWN: /按下鼠标左键 break; case WM_LBUTTONUP:/释放鼠标左键 break; ,49,鼠标应用程序实例,鼠标消息处理程序 当用户对鼠标进行操作时,会产生响应的消息,系统将把此消息发送到对应的窗口 改造例5-1,MyHello程序,添加相应鼠标输入功能,50,鼠标应用程序实例,声明视图类的数据成员 CString m_MousePoint;/存储鼠标的方式和位置 方法:在MyHelloView.h中protected: 处 CString m_MousePoint; 或右击CMyHelloView类,”Add Member Variable” 在视图类的构造函数中初始化 m_MousePoint=“ “; (在MyHelloView.cpp中) 修改屏幕重画函数OnDraw() pDC-Textout(100.100,m_MousePoint); (在MyHelloView.cpp中或双击OnDraw(),51,鼠标应用程序实例,添加鼠标消息WM_LBUTTONDOWN响应函数 类向导 菜单ViewClassWizardMessage Maps ClassName:CmyHelloView(选择); Object IDs:CMyHelloView (选择); Messages:WM_LBUTTONDOWN(选择); 单击“Add Function” 同样方法,在CMyHelloView类中,添加鼠标消息WM_LBUTTONUP 和WM_MOUSEMOVE的响应函数 ClassWizard自动为应用程序作了三件事:,52,鼠标应用程序实例,(1)在CMyHelloView类中添加了三个成员方法,即在MyHelloView.h 中添加了三个响应函数的原型说明 afx_msg void OnLButtonDown(UNIT nFlags,Cpoint point); afx_msg void OnLButtonUp(UNIT nFlags,Cpoint point); afx_msg void OnMouseMove(UNIT nFlags,Cpoint point); (2)在MyHelloView.cpp中添加了个消息映射 ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() ON_WM_MOUSEMOVE() (3)在MyHelloView.cpp中添加了个响应函数的空函数体 void CMyHelloView:OnLButtonDown(UNIT nFlags,Cpoint point) void CMyHelloView: OnLButtonUp(UNIT nFlags,Cpoint point ) void CMyHelloView: OnMouseMove(UNIT nFlags,Cpoint point ),53,鼠标应用程序实例,编写消息响应函数代码 void CMyHelloView:OnLButtonDown(UNIT nFlags,Cpoint point) m_MousePoint.Format(“鼠标左键在点(%d,%d)按下”,point.x,point.y); Invalidate();/使系统让用户区无效,从而调用重画函数OnDraw() void CMyHelloView: OnLButtonUp(UNIT nFlags,Cpoint point ) m_MousePoint=“鼠标左键被释放”; Invalidate(); void CMyHelloView: OnMouseMove(UNIT nFlags,Cpoint point ) m_MousePoint.Format(“鼠标位于点(%d,%d)按下”,point.x,point.y); Invalidate(); ,54,鼠标应用程序实例,查看结果(演示),55,键盘消息处理实例,键盘消息处理程序 当用户对键盘进行操作时,会产生响应的消息,系统将把此消息发送到对应的窗口 改造MyHello程序,添加相应键盘的字符输入 声明视图类的数据成员 int m_nLine;/存储回车次数 CString m_strDisplay;/存储当前行输入的字符 在视图类的构造函数中初始化 m_nLine=0; 添加键盘消息WM_CHAR响应函数 “View/ClassWizard/Message Maps(消息映射)” ClassName:CmyHelloView; Object IDs:CMyHelloView; Messages:WM_CHAR; 单击“Add Function”,在CMyHelloView类中,添加键盘消息WM_CHAR 的响应函数,56,(1)在CMyHelloView类中添加了一个成员方法,即在MyHelloView.h 中添加了一个响应函数的原型说明 afx_msg void OnChar(UNIT nChar,UINT nReCnt,Unit nFlags); (2)在MyHelloView.cpp中添加了一个消息映射 ON_WM_CHAR() (3)MyHelloView.cpp中添加了一个响应函数的空函数体 void CMyHelloView: OnChar(UNIT nChar,UINT nReCnt,Unit nFlags),键盘消息处理实例,ClassWizard自动为应用程序作了三件事,57,编写消息响应函数代码 void CMyHelloView: OnChar(UNIT nChar,UINT nReCnt,Unit nFlags) if(nChar=VK_RETURN)/如按回车键 m_strDisplay.Empty();/清空变量 m_nLine+;/行数加一 else m_strDisplay+=nChar; /将输入的字符添加到变量m_strDisplay的尾端 CClientDC dc(this); /获取客户区设备环境 dc.TextOut(0,m_nLine*20,m_strDisplay); Cview:OnChar(nChar,nRepCnt,nFlags); ,按键的字符代码值,重复击键的次数,扫描码和键转换后的状态,键盘消息处理实例,58,查看结果(演示),键盘消息处理实例,59,技术要点,常用虚拟键盘码,nFlag功能描述表,键盘消息处理实例,60,技术要点 1、定义用户消息的ID const WM_USERMSG=WM_USER+n; 2、消息处理函数(声明与定义) 3、消息映射 4、用户消息的发送-在某函数中发送自定义消息 BOOL PostMessage(HWND hWnd,UNIT Msg,WPARAM wParam,LPARAM lParam) 调用 :PostMessage(hWnd,WM_USERMSG,0,0);,自定义消息处理实例,最好从100开始,61,自定义消息处理,例如在MyHello.exe程序中添加如下功能 当用户单击光标上移键时,程序发出用户自定义消息,在对应的消息响应函数中,弹出消息对话框。(演示) 改造MyHello程序,添加相应键盘的字符输入 定义用户消息和消息响应函数 (1) 在MyHelloView.h中类的声明上面加入如下声明 const WM_USEMSG=WM_USER+100; /定义用户消息的ID(标识符) (2) 在MyHelloView.h中的公有段添加 void OnMyFunction(); /声明用户消息响应函数 在MyHelloView.cpp中编写OnMyFunction()代码 void CMyHelloView: OnMyFunction() MessageBox(“恭喜你,消息发送成功!”);,62,自定义消息处理实例,(3) 添加消息映射 在CMyHelloView.cpp的类的消息映射中加入有关语句 ON_MESSAGE(WM_USERMSG,OnMyFunction) (4)用户消息的发送 当用户按下光标上移键时,程序发出用户自定义消息,在对应的消息响应函数中,弹出消息对话框。 添加WM_KEYDOWN消息响应函数 “View/ClassWizard/Message Maps(消息映射)” ClassName:CmyHelloView; Object IDs:CMyHelloView; Messages:WM_KEYDOWN; 单击“Add Function” 编写发送自定义消息代码 void CMyHelloView: OnKeyDown(UNIT nChar,UINT nReCnt,Unit nFlags) HWND hWnd=GetSafeHwnd(); if(nChar=VK_UP) :PostMessage(hWnd,WM_USERMSG,0,0); return; ,63,自定义消息处理实例,查看结果(演示),64,MFC类基础。 利用向导建立一个MFC应用程序框架。,MFC消息处理机制 键盘、鼠标和自定义消息的处理。,小结,思考题:4-2,4-3,5-1,5-2,5-3,5-4 作业题:写出常用的键盘、鼠标消息。 课外上机,练习MFC应用程序框架,及键盘鼠标消息的处理。,作业,65,PostMessage(),The PostMessage function places (posts) a message in the message queue associated with the thread that created the specified window and then returns without waiting for the thread to process the message. Messages in a message queue are retrieved by calls to the GetMessage or PeekMessage function. BOOL PostMessage( HWND hWnd, / handle of destination window UINT Msg, / message to post WPARAM wParam, / first message parameter LPARAM lParam / second message parameter ); 其中 hWnd Handle to the window whose window procedure is to receive the message. Two values have special meanings: ValueMeaningHWND_BROADCASTThe message is posted to all top-level windows in the system, including disabled or invisible unowned windows, overlapped windows, and pop-up windows. The message is not posted to child windows.NULLThe function behaves like a call to PostThreadMessage with the dwThreadI

温馨提示

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

评论

0/150

提交评论