




已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1. Win32以WinMain为程序入口点,以窗口名称、窗口处理函数、窗口位置、应用程序句柄、鼠标句柄、程序图标句柄、菜单句柄等注册窗口类,创建该类型窗口,并更新窗口【WM_PAINT消息显示窗口】,建立消息循环,实现窗口处理函数,在该函数中处理各种消息。2.1. 消息循环while(GetMessage(&msg,NULL,0,0)/抓取消息TranslateMessage(&msg); /将消息进行处理一下DispatchMessage(&msg); /将消息变量msg传给窗口处理函数GetMessage/PeekMessage获取到WM_QUIT时,返回0,结束消息循环,退出程序。GetMessage和PeekMessage的差异:当没有自己的消息时,GetMessage释放cpu,而PeekMessage还可以运行一段时间。2.2. 窗口处理函数当不是自己要处理的消息时,即,default时必须调用DefWindowProc,以便系统处理该消息。WM_DESTROY消息必须处理,并必须调用PostQuitMessage,后者会触发WM_QUIT。2.3. 几个常见窗口消息1.1.1. WM_CLOSE 关闭窗口。它的默认响应函数是直接调用DestroyWindow(hwnd),DestroyWindow(hwnd); 是销毁窗口(但没有不是退出消息循环),然后销毁过程中会产生WM_DESTROY消息放入消息队列, 操作系统就会进行一系列的删除动作,先发送WM_DESTROY消息,接着发送WM_NCDESTROY消息。如果这个窗口还有子窗口或者是其它窗口的所有者,就需要给所有子窗口发送删除消息。);DefWindowProc处理WM_CLOSE时,会调用DestroyWindow(hwnd)。因此,这个消息可以不被程序员显示处理。1.1.2. WM_DESTROY 关闭程序。默认是调用PostQuitMessage(0)作用是产生WM_QUIT并放入消息队列。DefWindowProc不处理这个消息,它必须被显示处理用来结束程序。一般处理 WM_DESTROY时都是释放资源(例如申请的内存等),然后调用PostQuitMessage。1.1.3. WM_QUIT 关闭消息循环。GetMessage(&msg,NULL,0,0)获取到WM_QUIT后返回假,导致消息循环退出。WM_QUIT是唯一可以使GetMessage(&msg,NULL,0,0)返回假值的消息,也从来不会被显示处理。2. MFC2.4. MFC类的主要继承体系CObjectCObject是MFC的基本类,它的派生类具有RTTI、Persistence、Dynmic Creation和Dynamic Diagonistic能力。CCmdTarget CCmdTarget提供消息映射和传递的能力,并且只有其子类能够处理WM_COMMAND消息。CWinThreadCWinThread windows的一个线程。CWinApp CWinApp windows的进程。CWndCWnd 所有窗口类的基类。CView用户的操作界面,显示、编辑用户数据,一个没有边框的窗口,其外围是Frame窗口。CDocment存储用户数据,可以有多个view以不同的方式显示数据。2.5. MFC宏DECLARE_DYNAMICIMPLEMENT_DYNAMICDECLARE_DYNCREATEIMPLEMENT_DYNCREATEDECLARE_SERIALIMPLEMENT_SERIALDECLARE_MESSAGE_MAPBEGIN_MESSAGE_MAPEND_MESSAGE_MAP2.6. MFC程序运行2.7. MFC消息消息处理函数的类型为afx_msg void。1.1.4. 标准的windows消息WM_XXX此类消息对应的处理函数名已由系统决定,宏名称为ON_WM_XXX,下表列出部分该类消息:WM_CHARON_WM_CHAROnCharWM_CREATEON_WM_CREATEOnCreateWM_DESTROYON_WM_DESTROYOnDestroyDestroyWindow发起WM_PAINTON_WM_PAINTOnPaint(调用OnDraw)界面重绘1.1.5. command消息WM_COMMANDON_COMMAND(, ),比如:ON_COMMAND(IDM_ABOUT, OnAbout)ON_COMMAND(IDM_FILENEW,OpenFileNew)ON_COMMAND(IDM_FILEOPEN,OpenFileOpen)1.1.6. Notification message(控件产生的,比如BN_XXX)控件宏处理函数ButtonON_BN_CLICKED(id,memberfxn)memberfxnEditON_EN_SETFOCUS(id,memberfxn)memberfxnComboBoxON_CBN_DBLCLK(id,memberfxn)memberfxn2.8. CDocument_CView结构CDocTemplate负责管理CDocument/CView/CFrameWnd,当有多个数据类型需要处理时,就需要定义多个CDocTemplate,使用AddDocTemplate函数加入系统中;和MDI是两个概念:MDI是一次打开同一类型数据的多个文件,相应地,SDI一次只打开某一类型数据的一个文件。CDocTemplate其派生类有CMultiDocTemplate/CSingleDocTemplate,前者对应多个文件,后者对应单个文件。1.1.7. CWinApp/CDocManager/CDocTemplate/CDocument/CFrame/Document/View之间的关系。 CWinApp拥有一个对象指针CDocManager* m_pDocManager。 CDocManager拥有一个指针链表 CPtrList m_templateList,用来维护一系列的Document Template。一个程序若支持两种文件类型,就该有两份 Document Templates,应用程序就该在 CMyWinApp: :lnitlnstance中以AddDocTemplate将这些 Document Templates加入到CDocManager所维 护的链表之中。 CDocTempLate 拥有三个成员变量,分别为Document、View、Fram的CRunTimeClass指针。另一个成员变量m_nIDResource,代表其Document对象显示时的UI资源。 CDocument 有一个成员变量 CDocTemplate* myDocTemplate,回指其 Document Template,另有一个成员变量 CPtrList m_viewList, 表示其可以维护一系列的 View。 CFrameWnd 有一个成员变量CView* m_pVievvActive时,指向当前活动的View。 CView 有一个成员变量 CDocument* m_pDocument,指向相关的 Document。1.1.8. Serialize写文件CDocument负责处理文件close、save和save as命令。当save as命令时,还会调用DoPromptFileName让用户选择目标文件名;CMyDocument和其数据成员继承自CObject只需要重载Serialize函数,并且所有其数据成员储存在CObList中,CDocument:OnSaveDocument会以目标文件名为参数创建一个CArchive对象,CArchive:WriteObject/WriteClass写入数据成员类信息,新类以0xffff标识,类名称,类的索引;然后调用数据成员的serialize函数写入具体数据。1.1.9. Serialize读文件CWinApp处理文件open命令。CWinApp:OnOpenFile()-CDocManager:OnOpenFile(),后者调用DoPromptFileName让用户选择目标文件名,-CWinApp:OpenDocumentFile()- CDocManager:OpenDocumentFile(),取得相应的CDocTemplate,再次CDocTemplate- OpenDocumentFile(),创建CMyDocument、CMyFrame和CMyView;调用CMyDocument:OnOpenDocument(),这个虚函数必须调用CDocument:OnOpenDocument();CDocument:OnOpenDocument()以文件名为参数实例化CArchive变量,调用CMyDocument:Serialize(CArchive*);CArchive:ReadClass读取类的信息,并调用CRunTimeClass:CreateObject创建类实例;最后调用相应类的Serialize函数,完成信息读取。1.1.10. DYNAMIC/DYNCREATE/SERIALIZE宏struct CRuntimeClass/ AttributesLPCSTR m_lpszClassName;int m_nObjectSize;UINT m_wSchema; / schema number of the loaded classCObject* (PASCAL* m_pfnCreateObject)(); / NULL = abstract class#ifdef _AFXDLLCRuntimeClass* (PASCAL* m_pfnGetBaseClass)();#elseCRuntimeClass* m_pBaseClass;#endif/ OperationsCObject* CreateObject();BOOL IsDerivedFrom(const CRuntimeClass* pBaseClass) const;/ dynamic name lookup and creationstatic CRuntimeClass* PASCAL FromName(LPCSTR lpszClassName);static CRuntimeClass* PASCAL FromName(LPCWSTR lpszClassName);static CObject* PASCAL CreateObject(LPCSTR lpszClassName);static CObject* PASCAL CreateObject(LPCWSTR lpszClassName);/ Implementationvoid Store(CArchive& ar) const;static CRuntimeClass* PASCAL Load(CArchive& ar, UINT* pwSchemaNum);/ CRuntimeClass objects linked together in simple listCRuntimeClass* m_pNextClass; / linked list of registered classesconst AFX_CLASSINIT* m_pClassInit;DECLARE_DYNAMIC/IMPLEMENT_DYNAMICDYNAMIC定义了一个静态变量CRunTimeClass classxxx存储类名称、大小、Schema no(用于序列化,0xffff表示不能)、创建函数地址(用于动态创建)、获取直接父类的CRunTimeClass实例函数以及,下一个关联类CRunTimeClass实例指针,两个静态函数_GetBaseClass()获取直接父类的CRunTimeClass实例、GetThisClass()获取本类的CRunTimeClass,以及一个虚函数GetRunTimeClass()获取本类的CRunTimeClass。DECLARE_DYNCREATE/IMPLEMENT_DYNCREATE与DYNAMIC不同的是,DYNCREATE定义了一个静态函数CreateObject()满足动态创建需求。DECLARE_SERIAL/IMPLEMENT_SERIAL与前两者相比较,SERIALIZE的Schema no不再为0xffff,ClassInit为有效值,Serializable的必要条件1. 从CObject 派生下来。如此一来拥有 RTTI、 Dynamic Creation等机能。2. 类的声明部分必须有 DECLARE_SERIAL 宏。此宏面要一个参数:类名称。3. 类的实现部分必须有IMPLEMENT_SERIAL此宏需耍二气个参数:类名称,基类名称,schama no。4. 改写Serialize虚函数,使它能够适当地把类的成员变量写入文件中。5. 为此类加上一个 default 构造函数( 也就是无参数之构造函数 )。这个条件常为人所忽略,它是必要的, 因为若一个对象来自文件,MFC 必须先动态创建它,向且在没有任何参数的怕况下调用只构造函数,然后才从文件中读出对象数据。这张表包含多个单链表:多个继承体系链表和所有FMC类的链表。RTTI沿着m_pBaseClass链表检索;一般的动态创建使用m_pfnCreateObject;序列化的动态创建和存储使用m_pNextClass链表。VC2008下,CRunTimeClass不再有pFirstClass,而是使用AFX_MODULE_STATE类的成员变量CTypedSimpleList m_classList保存这张表的头部。CRunTimeClass:CreateObject(LPCWSTR lpszClassName)和Load()序列化时使用这两个函数都会调用CRuntimeClass:FromName(LPCWSTR lpszClassName),后者以类名称为关键字遍历这张表直到查到符合条件的CRunTimeClass。一个模块维护一张这样的表。CObject:CreateObject()是个虚函数,直接创建类实例,由CRunTimeClass:m_pfnCreateObject维护。2.9. 消息映射及传递CWnd可以处理任何windows消息,CDocument/CWinApp只能处理命令消息。菜单和工具栏都可以产生命令消息。消息映射是一个巨大的数据结构,负责将诸如WM_PAINT消息交给父类去处理,也可以将WM_COMMAND/WM_NOTIFY消息转发给类继承的旁支处理。消息映射功能由以上三个宏实现,定义了虚函数GetMessageMap()、静态函数GetThisMessageMap(),前者直接调用后者。GetThisMessageMap()定义两个静态变量,一个是AFX_MSGMAP_ENTRY数组,一个是AFX_MSGMAP,后者维护前者的指针;函数返回A
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 消防国考考试题目及答案
- kmp算法数据结构考试试题及答案
- 护理管理正考试题及答案
- 护理编内操作考试题及答案
- 2025教资考试教知真题及答案
- 2025交规考试真题及答案
- 2025护士求职考试真题及答案
- 考点解析-人教版八年级上册物理声现象《噪声的危害和控制》综合练习练习题(含答案解析)
- 单招培训第八类考试题及答案
- 洱源县期中考试卷及答案
- 冷冻食品供货方案
- 2024年小学生航空航天知识竞赛题库附答案 (共150题)
- 军体拳第一套全套图文教程
- 主动脉内球囊反搏术的应用与护理
- 针刺伤预防与处理-2024中华护理学会团体标准
- 店长周工作总结数据报表模板
- 羽绒原料购销合同
- 2-2新能源汽车充电系统检修
- 敦煌舞智慧树知到期末考试答案章节答案2024年兰州文理学院
- 机械工程学科研究前沿
- 涉外建设项目视频安防监控系统设计规范 DG-TJ08-2054-2013
评论
0/150
提交评论