




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
大家好1面向对象课程组2面向对象程序设计第八讲Windows编程机制3本讲要点Windows的编程机制MFC应用程序框架MFC消息管理MFC应用实例4CImageApp程序演示:CImageApp程序5Windows操作系统特点一致的图形化的用户界面。使用图形和图像来显示应用程序数据。多任务机制。Windows是一个多任务的图形窗口操作系统。硬件即插即用功能。Windows提供了各种设备驱动程序来支持各种各样的外部设备。与设备无关的图形图像机制等等。6Dos程序主要采用顺序的、关联的、过程驱动的程序设计方法。程序直接控制时间和过程的顺序。缺点:交互性差,用户界面不够友好。结束开始过程一条件?过程二过程三NY7事件驱动程序模型Windows程序由事件的发生来控制,允许用户用各种合理的顺序来安排程序的流程。8消息队列及其在应用程序中的轮询处理9Windows应用程序消息的来源输入消息:包括键盘和鼠标的输入。这类消息首先放到消息队列中,然后由Windows将它们送入应用程序消息队列中,由应用程序来处理消息。控制消息:用来与Windows的控制对象,如列表框,按钮等进行双向通信。这类消息一般不经过应用程序消息队列,而是直接发送到控制对象上去。系统消息:对程序化的事件或系统时钟中断作出反应。一些系统消息,如动态数据交换(DDE)要通过系统的消息队列,而有些则不通过系统消息队列直接送入应用程序的消息队列,如创建窗口消息。用户消息:这是程序员自己定义并在应用程序中主动发出的,一般由应用程序的某一部分内部处理。10
typedefstructtagMSG{ HWNDhWnd; //目标窗口句柄
UINTmessage; //消息标识
WPARAMwParam; //消息参数1(附加信息,16位)
LPARAMlParam; //消息参数2(附加信息,32位)
DWORDtime; //消息发送时间
POINTpt; //消息发送时鼠标的屏幕坐标}MSG;wParam和lParam的具体含义与message成员的值有关消息用MSG结构表示11消息驱动模型窗口1消息队列窗口函数WndProc消息1消息2用户交互内核USER消息3窗口2消息队列窗口函数WndProc12Windows操作系统包括三个内核基本元件:GDI、Kernel和UserGDI(图形设备接口):负责在屏幕上绘制像素、打印输出,绘制用户界面包括窗口、菜单、对话框等。Kernel支持和操作系统密切相关的功能:如进程加载,文本切换、文件I/O、内存管理、线程管理等。User为所有的用户界面对象提供支持,它用于接收和管理所有输入消息、系统消息并把它们发送给相应的窗口的消息队列。13窗口在Windows编程中,程序的基本单位不是过程和函数,而是窗口。Windows程序以窗口的形式存在,在不同窗口之间传递消息是Windows和应用程序进行交流的主要形式。程序具体功能由不同的窗口函数实现。14程序设计的重点:根据软件的功能需要,考虑用户可能的各种输入;针对不同的输入事件,提供相应的消息处理函数。相似的界面雷同的程序基本结构相似的代码通用的套路而已15什么是WindowsAPI?Windows为应用程序提供了各种服务,每一种服务就是一个函数,可以帮应用程序达到开启视窗、描绘图形、使用周边设备等目的。这些服务被称为ApplicationProgrammingInterface,简称API函数。它是应用软件与Windows系统最直接的交互方式。WindowsAPI是Windows操作系统与应用程序之间的标准接口,它提供了上千个标准函数、宏和数据结构的定义。凡是在Windows工作环境下执行的应用程序,都可以调用WindowsAPI。WindowsAPI函数定义在一些DLL动态链接库中,其中最主要的DLL是User32.dll、Gdi32.dll和Kernel32.dll三个库文件。16如何对待WindowsAPI我们对待API函数不必刻意去研究每一个函数的用法,那也是不现实的(能用得到的API函数有几千个呢)。不要专门去学,在需要的时候去查API帮助就足够了。17Windows应用程序生成18SDKWindows程序开发19Windows应用程序入口程序【WinMain】构建窗口类【WNDCLASS】注册窗口类【RegisterClass】创建窗口【CreateWindow】显示窗口【ShowWindow】更新窗口【UpdateWindow】进入消息循环【while循环】20HANDLE句柄句柄,是整个windows编程的基础。一个句柄是指使用的一个唯一的整数值(四字节长的数值),来标志应用程序中的不同对象和同类对象中的不同的实例,例如:一个窗口,按钮,图标,滚动条等。应用程序能够通过句柄访问相应的对象的信息。windows设立句柄,源于内存管理机制,即数据的地址需要变动,因此系统用句柄来记载数据地址的变更。数据对象加载进入内存中之后即获得了地址,但是这个地址并不是固定的,数据对象会根据需要在内存与硬盘之间游弋移动,因此其物理地址总是变动的,那么作为管理者则必须对管理对象所发生的变化了如指掌才行,因此系统为进程分配固定的地址(句柄)来存储进程下的数据对象变化后的地址也就是当前的地址。句柄与普通指针的区别:指针包含的是引用对象的内存地址,而句柄则是由系统所管理的引用标识,该标识可以被系统重新定位到一个内存地址上。21构建窗口typedefstruct_WNDCLASS{UINT style;WNDPROC lpfnWndProc;int cbClsExtra;int cbWndExtra;HINSTANCE hInstance;HICON hIcon;HCURSOR hCursor;HBRUSH hbrBackground;LPCTSTR lpszMenuName;LPCTSTR lpszClassName;}WNDCLASS,*PWNDCLASS;22注册窗口ATOMRegisterClass(CONSTWNDCLASS
*lpWndClass//classdata
);23创建窗口HWNDCreateWindow( LPCTSTR
lpClassName,//registeredclassname LPCTSTR
lpWindowName,//windowname DWORD
dwStyle,//windowstyle int
x,//horizontalpositionofwindow int
y,//verticalpositionofwindow int
nWidth,//windowwidth int
nHeight,//windowheight HWND
hWndParent,//handletoparentorownerwindowHMENU
hMenu,//menuhandleorchildidentifier HINSTANCE
hInstance,//handletoapplicationinstance LPVOID lpParam//window-creationdata);24显示窗口BOOLShowWindow( HWND
hWnd,//handletowindow int
nCmdShow//showstate);25更新窗口BOOLUpdateWindow( HWND
hWnd//handletowindow);26进入消息循环MSGmsg;while(GetMessage(&msg,NULL,0,0)){ TranslateMessage(&msg); DispatchMessage(&msg);}27BOOLGetMessage( LPMSG
lpMsg,//messageinformation HWND
hWnd,//handletowindow UINT
wMsgFilterMin,//firstmessage UINT
wMsgFilterMax//lastmessage);28BOOLTranslateMessage( CONSTMSG
*lpMsg
//messageinformation);LRESULTDispatchMessage( CONSTMSG
*lpmsg//messageinformation
);29VC++应用程序的开发主要有两种模式:WINAPI方式MFC方式传统的WINAPI开发方式比较繁琐,而MFC则是对WINAPI再次封装,所以MFC相对于WINAPI开发更具备效率优势。30本讲要点Windows的编程机制MFC应用程序框架MFC消息管理MFC应用实例31MFC微软基础类MFC(MicrosoftFoundationClass)微软基础类是一个由Microsoft公司设计的类库。应用程序的轮廓用户接口的标准实现方法具体应用程序特有的东西MFC建立的应用程序:MFCAppWizard创建MFC应用程序框架利用ClassWizard对Windows消息进行管理32MFC类宏全局函数以层次结构方式组织,几乎每一个派生层次都与一具体的Windows实例相对应,如文档类、窗口类和视图类等。MFC宏主要功能:消息映射、运行时对象类型服务、诊断服务、异常处理。MFC约定:全局函数以“Afx”为前缀,全局变量以“afx”为前缀。33学习MFC的方法了解Windows编程概念和API函数,如WindowsAPI有哪些功能和哪些常用的数据结构等。大体上了解MFC的概念、组成和基本约定,从简单的类入手,结合程序设计,由浅入深,循序渐进、日积月累。如果MFC某个类能完成所需要的功能,可以直接调用已有类的方法(成员函数)。利用面向对象技术中的“继承”方法对MFC类的行为进行扩充和修改,从MFC中已有的类派生出自己需要的类。理解使用34MFC应用程序生成35MFC应用程序框架应用程序结构应用程序源代码MFC类应用程序对象theApp调用WinMain()主函数启动程序36应用程序向导所产生的程序入口程序WinMain构建窗口注册窗口创建窗口显示窗口更新窗口进入消息循环MyRegisterClassInitInstance37例.利用VisualC++向导建一个单文档应用程序hello。38Hello程序流程程序开始初始化全局对象theAppCHelloApp构造函数CWinApp构造函数1234539MFC应用程序运行后各函数的调用关系InitInstance()函数是派生类唯一需要重载的函数,它负责应用程序的初始化,如初始化数据、创建文档模板、处理命令行以及显示应用程序主窗口。40Hello程序流程41例.利用VisualC++向导建一个单文档应用程序SDI,完成简单的显示功能。42SDI应用程序对象之间的相互访问关系43例.利用VisualC++向导建一个多文档应用程序MDI,完成简单的显示功能。44MDI应用程序对象之间的相互访问关系45本讲要点Windows的编程机制MFC应用程序框架MFC消息管理MFC应用实例46MFC消息管理MFC应用程序框架截取了Windows向应用程序发出的消息,再确定将消息发送给哪一个对象,可以根据需要利用函数重载对消息进行处理,但不需要处理的消息将由应用程序框架自动处理。消息管理包括消息的发送和处理。对于消息发送,MFC提供了类似于API函数功能的消息发送函数,而MFC消息处理的内部机制则相对复杂一些。从编程的角度出发,我们只需了解其大致的原理。47MFC的消息分类标准Windows消息:以WM_前缀(但不包括WM_COMMAND)开始的消息,包括鼠标消息、键盘消息和窗口消息,如WM_MOVE、WM_PAINT等。控件通知(ControlNotification)消息:对控件操作引起的消息,是控件和子窗口向其父窗口发出的WM_COMMAND通知消息。例如,当用户修改了编辑控件中的文本后,编辑控件向其父窗口发送WM_COMMAND通知消息。命令(Command)消息:由菜单项、工具栏按钮、快捷键等用户界面对象发出的WM_COMMAND消息。命令消息与其它消息不同,它可被更广泛的的对象如文档、文档模板、应用程序对象、窗口和视图等处理。自定义消息48MFC消息映射机制MFC采用消息映射机制取代C/C++语言中的switch-case结构来处理消息。MFC消息映射机制包括一组消息映射宏,一条消息映射宏把一个Windows消息和其消息处理函数联结起来。在类定义的结尾用DECLARE_MESSAGE_MAP()宏来声明使用消息映射。在类的实现源文件中用BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()宏来定义消息映射。ON_COMMAND宏:消息映射宏的第一个参数为消息ID,第二个参数为消息处理函数。如ON_COMMAND(ID_FILE_NEW,CWinApp::OnFileNew)。MFC使用ClassWizard帮助实现消息映射功能。4950例子:在AppWizard产生的应用程序类的源码中,应用程序类的定义(头文件)包含了类似如下的代码://{{AFX_MSG(CTttApp)afx_msgvoidOnAppAbout();//}}AFX_MSGDECLARE_MESSAGE_MAP()应用程序类的实现文件中包含了类似如下的代码:BEGIN_MESSAGE_MAP(CTApp,CWinApp)//{{AFX_MSG_MAP(CTttApp)ON_COMMAND(ID_APP_ABOUT,OnAppAbout)//}}AFX_MSG_MAPEND_MESSAGE_MAP()
51MFC应用程序MESSAGE_MAP消息映射形式BEGIN_MESSAGE_MAP(theclass,baseclass) //{{AFX_MSG_MAP(theclass) ON_......//MFC预定义的消息映射宏
ON_MESSAGE(message,memberFxn)
//用户自定义的消息映射宏
...... //}}AFX_MSG_MAPEND_MESSAGE_MAP()注意:特殊注解“//{{AFX_MSG_MAP”是ClassWizard类向导用于维护消息映射宏的标记,用户不要删除注解轻易修改注解内的代码。52例.利用ClassWizard为框架类添加消息WM_CLOSE、WM_DESTROY及菜单项“Edit|Copy”的消息处理函数,分析ClassWizard完成了哪些工作。
启动ClassWizard,添加要求的三个消息处理函数,ClassWizard将在类的实现文件中添加三个消息映射宏和消息处理函数。消息映射宏如下:
BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)//{{AFX_MSG_MAP(CMainFrame)ON_WM_CREATE()
//由MFCAppWizard程序向导自动生成的消息映射
ON_WM_CLOSE()//由ClassWizard类向导添加
ON_WM_DESTROY()ON_COMMAND(ID_EDIT_COPY,OnEditCopy)//}}AFX_MSG_MAPEND_MESSAGE_MAP()53ClassWizard在类的定义中声明了消息处理函数classCMainFrame:CFrameWnd{public:CMainFrame();protected://{{AFX_MSG(CMainFrame) //声明消息处理函数原形
afx_msgintOnCreate(LPCREATESTRUCTlpCreateStruct);
//由程序向导自动生成
afx_msgvoidOnClose();//由ClassWizard类向导添加
afx_msgvoidOnDestroy();afx_msgvoidOnEditCopy();//}}AFX_MSGDECLARE_MESSAGE_MAP()//声明使用消息映射宏};54例.对前面建的SDI应用程序,增加WM_LBUTTONDOWN消息,并弹窗显示鼠标左键的点击次数。55消息的发送发送消息到一个窗口可以采用传送(Send)或寄送(Post)方式,这两种方式之间的主要区别是消息被接收对象收到后是否立即被处理。Windows提供了三个API函数用于消息的发送。函数SendMessage()用于向一个或多个窗口传送消息,该函数将调用目标窗口的窗口函数,直到目标窗口处理完收到的消息,该函数才返回。函数PostMessage()用于向一个或多个窗口寄送消息,它把消息放在指定窗口创建的线程的消息队列中,然后不等消息处理完就返回。函数SendDlgItemMessage()函数用于向对话框中指定的控件发送消息,直到目标控件处理完收到的消息,该函数才返回。56MFC将这三个函数封装为CWnd窗口类的成员函数,封装了目标窗口句柄,它们将向调用它的窗口对象发送或寄送消息,如pMyView->SendMessage()的调用形式表示向pMyView所指对象发送消息。与用户输入相关的消息(如鼠标消息和键盘消息)通常是以寄送(Post)的方式发送,以便这些用户输入可以由运行较缓慢的系统进行缓冲处理。而其它消息通常是以传送(Send)的方式发送。57手工处理消息映射创建自己的消息映射的具体过程:定义自己的消息ID:MFC允许用户自定义消息,常量WM_USER(为0x0400)与第一个自定义消息值相对应,用户必须为自己的消息定义相对于WM_USER的偏移值。利用#define语句定义自己的消息,例如:
#defineWM_USER1WM_USER+0 #defineWM_USER2WM_USER+158定义消息映射:在BEGIN_MESSAGE_MAP()之后,END_MESSAGE_MAP()之前加入消息映射语句:
ON_MESSAGE(message,memberFxn)在适当的地方定义消息处理函数,对消息进行响应:
自定义消息处理函数的声明:必须在函数返回类型前面加上afx_msg标识,如:afx_msgLRESULTmemberFxn(WPARAMwParam,LPARAMlParam);其中,参数wParam、lParam用于传递消息的两个附加信息。在需要发送消息的地方发送消息:可用CWnd::SendMessage()函数或CWnd::PostMessage()函数发送消息。59例.编写一个自定义消息应用程序,程序启动后设置一个定时器,在WM_TIMER的消息处理函数中发送一个用户自定义消息,在对应的自定义消息处理函数中以动画的形式移动显示一行文本。基本思路:用WM_TIMER消息处理函数发送消息;启动定时器销毁定时器用自定义消息完成动画显示功能。自定义消息ID定义消息映射定义消息处理函数发送消息60具体过程:1.首先利用MFCAppWizard[exe]向导创建一个名为Move的应用程序。利用ClassWizard类向导为CMoveView类生成消息WM_CREATE的消息处理函数,通过设置定时器在指定的时间间隔向窗口发送WM_TIMER消息。
SetTimer(1,200,NULL);//启动定时器2.在文件MoveView.cpp开始位置定义一个用户自定义消息:
#defineWM_MYMESSAGEWM_USER+1
利用ClassWizard为CMoveView类生成消息WM_TIME的消息处理函数:SendMessage(WM_MYMESSAGE);613.在文件MoveView.cpp消息映射BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间添加自定义消息映射宏:
ON_MESSAGE(WM_MYMESSAGE,OnMyMyessage)在类CMoveView的定义中声明自定义消息处理函数:
afx_msgLRESULTOnMyMessage(WPARAMwParam,LPARAMlParam);4.在类CMoveView的定义中声明一个private属性、int型的成员变量m_dPositionX,它表示文本显示X位置,并在类CMoveView的构造函数中初始化:
m_dPositi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 现代物流运作模式的创新试题及答案
- 投资咨询工程师时间管理与规划技巧试题及答案
- 现代物流管理理论试题及答案
- 生态系统与人类活动:2024年试题及答案
- 二零二四年份二月国际船舶租赁合同燃油效率条款补充说明
- 2025年甘肃建筑安全员考试题库
- 安全教育防烧伤烫伤
- 2024人力资源考试解析性试题及答案
- 2024年份2月跨境展品运输海关担保金分期支付合同
- 特许另类投资分析师稳健投资方法试题及答案
- 家政保洁培训课件教学
- 医学生创新创业课件概述
- 《秤的发展史》课件
- 医院感染科护士对防控感染的终末消毒与彻底清洁
- 酒店饭店服务流程
- 英语八年级英语上册阅读理解100及答案经典
- GRR测量系统分析报告范例
- 钢筋分析表(电子版)
- 施工日志模板
- 冲压机作业指导书
- 产科麻醉指南
评论
0/150
提交评论