MFCWindows应用程序设计-课件

上传人:文**** 文档编号:191392866 上传时间:2023-03-03 格式:PPT 页数:176 大小:10.60MB
返回 下载 相关 举报
MFCWindows应用程序设计-课件_第1页
第1页 / 共176页
MFCWindows应用程序设计-课件_第2页
第2页 / 共176页
MFCWindows应用程序设计-课件_第3页
第3页 / 共176页
点击查看更多>>
资源描述
图1-1 Windows应用程序的图形窗口界面(a)基于窗口的应用程序(b)基于窗体(对话框)的应用程序图1-2 Windows应用程序的基本结构主函数 创建窗口;while()接收用户事件;将事件信息发送给系统;事件处理函数 switch()case1:事件1处理代码;case2:事件2处理代码;返回;Windows系统事件源事件源初始化及创建窗口有事件消息?N向系统发送事件消息根据消息类型处理消息系统程序结束消息?开始结束主函数事件消息处理函数图1-3 Windows程序主函数、事件消息处理函数与系统之间的关系图1-4 带有窗口的MSDOS界面微机硬件系统DOSWindows平台入口名:mainWindows应用程序入口名:WinMainDOS应用程序入口名:main微机硬件系统Windows操作系统Windows应用程序入口:WinMainConsole Application(控制台程序)入口名:mainMSDOS(a)早期的Windows(b)后来的Windows图1-5 Windows与DOS的关系微机硬件系统Windows操作系统Windows应用程序Java应用程序(a)Java与Windows的关系(b).NET与Windows的关系图1-6 Java、.NET与Windows的关系Java虚拟机微机硬件系统Windows操作系统Windows应用程序C#等应用程序.NET平台指针指针指针对象对象对象图1-7 句柄的两种可能的实现方式示意图对象对象指针指针指针型句柄A0A1索引型句柄void main()指向程序堆栈的指针程序控制块程序代码程序堆栈前一个程序控制块的指针下一个程序控制块的指针图1-8 程序控制块的一种结构id程序内存控制块虚存空间结构物理空间结构mm 断点(PC)程序上下文 控制块程序代码简化画法指针1指针2指针3进程控制块1进程控制块2进程控制块3图1-9 HINSTANCE 类型句柄的概念程序1代码程序2代码共有3个进程(程序)实例HINSTANCE类型句柄 进程控制块链表style lpfnWndProc lpszClassName 窗口函数1图1-10 窗口类WNDCLASS实例与代码的关系 窗口类实例1hInstance 进程控制块程序代码HINSTANCE style lpfnWndProc lpszClassName 窗口函数n窗口类实例nhInstance style lpfnWndProc lpszClassName 图1-11 窗口类实例注册表 style lpfnWndProc lpszClassName 窗口类实例1窗口类实例nWindowstypedef struct _WNDCLASS UINT style;WNDPROC lpfnWndProc;int cbClsExtra;int cbWndExtra;HANDLE hInstance;HICON hIcon;HCURSOR hCursor;HBRUSH hbrBackground;LPCTSTR lpszMenuName;LPCTSTRlpszClassName;窗口函数WinMain函数HINSTANCE实例窗口类注册表注册RegisterClass(wc)CreateWindow(LPCTSTR lpClassName,LPCTSTR lpWindowName,DWORDdwStyle,int x,int y,int nWidth,int nHeight,HWND hWndParent,HMENU hMenu,HANDLE hInstance,LPVOID lpParam );创建HWND图1-12 窗口的定义及创建 创建过程就是部件安装过程系统消息队列事件转换为消息Windows系统应用程序用于处理消息的窗口函数图1-13 事件、消息、消息循环及消息的传递处理过程鼠标、键盘等事件应用程序的消息循环while(GetMessage()TranslateMessage(&msg);DispatchMessage(&msg);非队列消息进程消息队列窗口消息图1-14 Windows系统收到执行一个Windows应用程序命令之后的行为将程序文件加载到内存为程序分配控制块形成HINSTANCE实例将HINSTANCE实例加入HINSTANCE实例链表以本程序实例与前一个程序实例为参数调用WinMain()创建并显示程序窗口自消息队列获取消息将消息派送到系统并由系统调用窗口函数处理消息调用系统默认处理函数终止消息程序终止有用户消息处理代码无用户消息处理代码消息处理图1-15 例1-2程序运行结果WM_LBUTTONDOWNOn_LButtonDownWM_PAINTOn_PaintWM_RESTROYOn_Restroy消息标识消息处理函数指针图1-16 消息映射表WM_LBUTTONDOWNOn_LButtonDownWM_PAINTOn_PaintWM_RESTROYOn_Restroy消息标识消息处理函数指针图1-17 最简单的观察者模式for()消息处理函数消息处理函数消息处理函数被观察者观察者int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)WinMain()代码前一个控制块指针后一个控制块指针WinMain()代码前一个控制块指针后一个控制块指针系统中各个程序的 HINSTANCE实例链表图1-13 系统在调用WinMain()时传递的两个HINSTANCE实例当前程序代码把事件变换为消息WinMain()while(GetMessage()WndProc()switch()case:case:Windows系统图1-14 Windows 系统、Windows应用程序与窗口函数三者之间的关系负责程序的安装及消息接收和派送负责消息的处理图2-1 例2-1应用程序运行结果图2-2 例2-2应用程序运行结果LRESULT CALLBACK WndProc()调用AfxWndProc();AfxWndProc();原窗口函数代码 int APIENTRY WinMain()return ResultCode=pApp-Run();Windows系统封装窗口函数的类主函数原窗口函数图2-3 AfxWndProc()函数与原窗口函数的关系消息 消息 消息 消息 消息 事件 图2-4 例2-4应用程序运行结果 WM_LBUTTONDOWN OnLButtonDownWM_PAINT OnDrawWM_DESTROY OnDestroyAFX_MSGMAP_ENTRY _messageEntries 图2-5 类的消息映射表_messageEntries2_messageEntries1_messageEntries0A:_messageEntries B:_messageEntries 图2-6 类族消息映射表的结构_messageEntries _messageEntries _messageEntries Class AClass BClass ClpEntriespBaseMaplpEntriespBaseMaplpEntriespBaseMap图2-7 类 B 接受消息后调用消息处理函数的过程pBaseMaplpEntries消息及pfn消息及pfn消息及pfn消息处理函数1消息处理函数2消息处理函数n类 ApBaseMaplpEntries消息及pfn消息及pfn消息及pfn消息处理函数1消息处理函数2消息处理函数n类 B图2-8 例2-5应用程序的运行结果CFrameWndCWndCCmdTargetCObject图3-2 窗口类在类族中的位置CWinAppCWinThreadCCmdTargetCObject图3-3 应用程序类在类族中的位置图3-4 创建工作空间图3-5 向工程加入源文件图3-6 设置工程选项图3-7 框架窗口类、视图类、文档类、文档模板、应用程序类之间的关系目前,用MFC设计的Windows应用程序几乎都采用文档/视图结构。这种程序框架与简单程序框架之间的重要区别就在于形成应用程序的主窗口不只需要一个类的对象,而是需要三个类的对象:框架窗口类CFrameWnd对象、视图类CView对象和文档类CDocument对象。框架窗口类CFrameWnd对象作为窗口的框架,视图类CView的对象作为帖附在框架窗口上的用户区,它们两者共同形成了应用程序的界面,而文档类CDocument对象则在幕对数据进行存储和管理。上面三个类对象之间的关系类似于房屋的窗户,窗口框架类CFrameWnd相当于窗框,视图类CView相当于窗框上的玻璃,而文档类CDocument就相当于室内的物品。在房屋的外面,透过玻璃可以窥见室内的部分物品。作为房屋,它可以有多个窗户可以从不文档(数据)视图框架窗口应用程序文档模板图3-8 Windows的NotePad记事本程序 界面图3-9 多文档应用程序界面图3-10 文档模板的类继承关系应用程序对象文档模板文档对象框架窗口对象视图对象图3-11 应用程序创建各对象的顺序系统应用程序对象图3-12 应用程序与文档模板对象对象链表文档模板文档模板文档模板文档模板文档模板文档模板文档模板视图对象文档对象框架窗口视图对象视图对象视图对象视图对象文档模板活动视图图3-13 文档模板、文档对象、框架窗口对象、视图之间关系示意图视图指针链表视图链表应用程序对象窗口框架(CMainFrame)对象GetActiveDocument()GetActiveView()文档对象视图对象GetDocument()UpdateAllView()GetParent()GetParentFrame()GetFirstVewPositio()GetNextView()AfxGetApp()AfxGetMainWnd()图3-14 SDI应用程序框架各对象之间的联系方法应用程序对象窗口框架(CMainFrame)对象子窗口框架(CChildFrame)对象MDIGetActive()GetActiveFrame()GetActiveDocument()GetActiveView()文档对象视图对象GetDocument()UpdateAllView()GetParent()GetParentFrame()GetFirstVewPositio()GetNextView()AfxGetApp()AfxGetMainWnd()图3-15 MDI应用程序框架各对象之间的联系方法图3-16 例3-2应用程序运行结果活动的视图对象文档模板对象框架窗口对象文档对象应用程序对象:DefWindowProc()图3-17 文档/视图程序消息流动顺序 图3-18 在新建文档时程序会询问所建文档的类型图3-19 在试图打开一个文件时程序也会提出相应的询问CMyDoc m_pfnCreateObject CreateObject()CMyWnd m_pfnCreateObject CreateObject()CMyView m_pfnCreateObject CreateObject()类名指针类名指针类名指针图3-20 类名与对象创建函数关联(映射)表图3-21 类中的类名与类对象构建函数映射表 CMyDocCMyWnd CMyView CMyDoc m_pfnCreateObject CreateObject()m_pNextClass CMyWnd m_pfnCreateObject CreateObject()m_pNextClass CMyView m_pfnCreateObject CreateObject()m_pNextClass 图3-22 例3-5运行结果a)正确创建了对象时的结果b)未正确创建对象时的结果“类名1”指向下一个链表项的指针类的信息“类名2”指向下一个链表项的指针类的信息“类名3”指向下一个链表项的指针类的信息“类名n”指向下一个链表项的指针类的信息NULL图3-23 类信息链表的结构物理图形显示设备设备驱动程序图形设备描述环境应用程序图4-1 图形设备描述表的基本概念CPaintDCCWindowDCCDCCObject图4-2 MFC设备描述环境类层次结构CClientDCCMetaFileDC图4-3 例4-1程序运行结果CPenCGdiObjectCObject图4-4 画笔在MFC类层次结构的位置图4-5 例4-2程序的运行结果图4-6 例4-3程序的运行结果CBrushCGdiObjectCObject图4-7 画刷在MFC类层次结构的位置图4-8 例4-4程序的运行结果图4-9 例4-5程序的运行结果图4-10 例4-6程序的运行结果图4-11 例4-7的程序运行结果图4-12 例4-8程序运行的结果图4-13 例4-9程序的运行结果图4-14 例4-10程序运行结果(l,t)(r,b)图5-1 矩形的坐标(left,top)(right,bottom)图5-2 尺寸cxcyinitCXinitCY图5-3 例5-1程序运行并响应鼠标左键单击后的结果CArrayCMapCObject图5-4 群体类在MFC类继承层次中的位置CList图5-5 例5-2程序运行结果图6-1 基本MDI程序界面图6-2 可以在框架窗口中打开多个子窗口SDI窗口程序MDI窗口程序基于对话框的程序图6-3 MFC AppWizard-Step1的选项上下文帮助普通窗口浏览器外观窗口3D(立体)外观菜单中有打印预览选项工具条状态条图6-4 MFC AppWizard-Step4的选项可拆分的窗口带最小化按钮带最大化按钮使用系统菜单粗边框最大化窗口最小化窗口图6-5 Advanced Options中的选项图6-6 框架窗口类的成员函数PreCreateWindow()图6-7 例6-1程序运行结果图6-8 例6-1修改后的程序运行结果(a)(b)图6-9 可拆分窗口的界面选中该项后,向导即可生成可拆分窗口的程序界面图6-10 在向导的选项中选择可拆分窗口的界面图6-11 可同步更新的可拆分窗口图6-12无效显示区域的概念需要新绘制的圆形该矩形区为无效显示区UpdateAllViews(CView*pSender,LPARAM lHint=0L,CObject*pHint=NULL);OnUpdate(CView*pSender,LPARAM lHint,CObject*pHint);InvalidateRect(LPCRECT lpRect,BOOL bErase=TRUE);含有无效区信息的对象图6-13无效显示区域信息的传递图6-14 在MFC Wizard-Step6中选择视图类的基类虚函数OnInitialUpdate设置滚动条参数的函数图6-15虚函数OnInitialUpdate()sizeTotal.cxsizeTotal.cy鼠标单击此处向右滚动sizePage.cx鼠标单击此处向右滚动sizePage.cx鼠标单击此处向右滚动sizeLine.cx鼠标单击此处向左滚动sizeLine.cx鼠标单击此处向上滚动sizeLine.cy鼠标单击此处向下滚动sizePage.cy鼠标单击此处向上滚动sizePage.cy鼠标单击此处向下滚动sizeLine.cyDocumentView图6-16 函数SetScrollSizes()参数的含义使用水平滚动条可以看到这几个贴近边框画的圆图6-17 例6-4程序的运行结果画图时鼠标单击的实际位置+画出的圆的实际位置图6-18 视图的坐标原点仍是文档的原点2211+画图时鼠标单击的实际位置画出的圆的实际位置21图6-17 视图的坐标原点仍是文档的原点用户区图7-1 用户区图7-2 选择添加消息处理函数图7-3 选择鼠标消息选择该项鼠标光标图7-5 例7-3程序运行结果鼠标光标位置图7-6 例7-4程序运行结果图7-7 例7-5程序运行结果图7-8 例7-7 程序运行结果对话框编辑器图片编辑器字体编辑器对话框位图字体 图标光标资源描述文件.rc资源编译器资源.res 头文件.h程序源文件.cppC+编译器目标文件.obj 连接器可执行文件.exe图8-1 资源文件与程序文件的关系资源头文件.h库文件.lib 图8-2 一个两级菜单的文本文件菜单的名称及其标识ID子菜单标题子菜单标题子菜单标题菜单子菜单3子菜单2子菜单1菜单命令选项图8-3 菜单脚本与实际菜单的对照图8-4 以文本方式打开资源文件IDR_MAINFRAME MENU PRELOAD DISCARDABLE IDR_MAINFRAME MENU PRELOAD DISCARDABLE BEGINBEGINPOPUP POPUP 文件文件(&F)(&F)BEGINBEGINMENUITEM MENUITEM 新建新建(&N)tCtrl+N,ID_(&N)tCtrl+N,ID_MENUITEM MENUITEM 打开打开(&O).tCtrl+O,ID_(&O).tCtrl+O,ID_MENUITEM MENUITEM 保存保存(&S)tCtrl+S,ID_(&S)tCtrl+S,ID_MENUITEM MENUITEM 另存为另存为(&A).,ID_(&A).,ID_MENUITEM SEPARATORMENUITEM SEPARATORMENUITEM MENUITEM 最近文件最近文件,ID_,ID_MENUITEM MENUITEM 打印字符打印字符(&P)tCtrl+P,ID_ (&P)tCtrl+P,ID_ MENUITEM SEPARATORMENUITEM SEPARATORMENUITEM MENUITEM 退出退出(&X),ID_APP_EXIT(&X),ID_APP_EXITENDENDPOPUP POPUP 编辑编辑(&E)(&E)BEGINBEGINMENUITEM MENUITEM 撤消撤消(&U)tCtrl+Z,ID_EDIT_UNDO(&U)tCtrl+Z,ID_EDIT_UNDOMENUITEM SEPARATORMENUITEM SEPARATORMENUITEM MENUITEM 剪切剪切(&T)tCtrl+X,ID_EDIT_CUT(&T)tCtrl+X,ID_EDIT_CUTMENUITEM MENUITEM 复制复制(&C)tCtrl+C,ID_EDIT_COPY(&C)tCtrl+C,ID_EDIT_COPYMENUITEM MENUITEM 粘贴粘贴(&P)tCtrl+V,ID_EDIT_PASTE(&P)tCtrl+V,ID_EDIT_PASTEENDENDPOPUP POPUP 帮助帮助(&H)(&H)BEGINBEGINMENUITEM MENUITEM 关于关于 ).,ID_APP_ABOUT).,ID_APP_ABOUTENDENDENDEND图8-5 添加菜单命令选项添加的菜单命令选项图8-6例8-1程序运行结果图8-7 菜单编辑器双击此处可打开菜单编辑器图形化的菜单编辑器图8-8 使用菜单编辑器编辑菜单项图8-9 例8-3应用程序运行结果双击此处可以打开快捷键编辑器双击此处可以打开该快捷键的属性编辑器快捷键属性编辑器图8-10 使用快捷键编辑器编辑快捷键表双击此处可以打开图标编辑器 选择图标的规格 绘制图标的工具箱 图8-11 图标编辑器图8-12 添加文件到工程图8-13 BitBlt函数中各参数的意义图8-14 例8-4程序运行结果图9-1 例9-1程序运行后会在当前目录中创建一个文件图9-2 例9-2程序运行后会在当前目录中创建一个文件图9-3 例9-3程序运行后单击鼠标左键会得到位图文件信息 CArchive类对象磁盘CFile对象缓冲区插入数据(写)提取数据(读)图9-4 CArchive类对象与CFile类对象之间的关系图9-5 例9-4程序运行后结果图9-6一个带有内嵌对象的复杂对象的示意图对象A对象B对象C对象D对象E图9-7 对象序列化示意图文件调用B的读写函数读出写入写顺序读顺序调用D的读写函数调用C的读写函数调用E的读写函数对象A对象B对象C对象D对象E调用C的读写函数调用E的读写函数调用B的读写函数调用D的读写函数图9-8 CObject类的虚函数成员A.Serialize(CArchive&ar)if(ar.IsStoring()/写入数据成员代码else/读取数据成员代码B.Serialize(ar);C.Serialize(ar);B.Serialize(CArchive&ar)if(ar.IsStoring()/写入数据成员代码else/读取数据成员代码D.Serialize(ar);D.:Serialize(CArchive&ar)if(ar.IsStoring()/写入数据成员代码else/读取数据成员代码 B.Serialize(CArchive&ar)if(ar.IsStoring()/写入数据成员代码else/读取数据成员代码D.Serialize(ar);图9-9 用Serialize()函数实现序列化CArchive&arA:Serialize()B:Serialize()C:Serialize()D:Serialize()E:Serialize()写顺序 读顺序 图9-10 图9-6对象按图9-9用Serialize()函数实现序列化的过程菜单命令 On()On()On()文件对象缓冲区图9-11 分别按下鼠标左键和右键显示大写字母M和小写字母m图9-12 打开文件后的结果CArchive类的对象ar磁盘永久性类(为CObject的派生类)DECLARE_DYNCREATE()IMPLEMENT_DYNCREATE()类信息表声明和实现DECLARE_SERIAL()IMPLEMENT_SERIAL()序列化声明和实现对象的数据成员Serialize()图9-13 具有永久性能力类的示意图CFile对象调用内嵌对象的Serialize()缓冲区图9-14 例9-6运行后用鼠标点击出的图形图9-15 当用户试图关闭该文件时程序会给出保存的提示CWndCCmdTargetCStaticCObject图10-1 CStatic类的继承关系图10-2 例10-1程序运行结果 CWndCCmdTargetCButtonCObject图10-3 CButton类的继承关系图10-4 例10-2程序运行结果CWndCCmdTargetCEditCObject图10-5 CEdit类的继承关系图10-6 例10-3程序运行结果图10-8 微调器的外观编辑框微调器图10-11 例10-5程序运行结果图10-12 例10-6程序运行结果载入对话框模板OnInitDialog()OnCancel()OK按钮消息消息循环EndDialog()UpdateData()EndDialog()图11-5 DoModal()函数的执行过程OnOK()Cancel按钮消息UpdateData()return IDCANCELreturn IDOK图11-6 对话框的外观图11-7 系统提供的对话框外观图11-8 Adding a Class对话框图11-9 New Class对话框图11-10 在按下了OK按钮后会出现一个消息框(CDataExchange*pDX,控件的ID,成员变量)DDX_Radio DDX_Check DDX_Scroll DDX_Slider DDX_Text DDX_Control DDX_CBString DDX_Control DDX_LBString DDX_Control图11-11 部分控件与对应成员变量的数据交换函数图11-12 Class Wizard的类成员变量选项卡图11-13 例11-2应用程序的对话框图11-14 在Properties对话框中修改控件属性图11-15 Class Wizard的消息映射选项卡图11-18 声明例11-3的两个按钮单击消息响应函数图11-20带有提示信息框的保存文件对话框图11-22 例11-6程序运行结果图11-23 属性页的外观属性页属性页面(选项卡)图11-24 自CPropertyPage来派生属性页面类图11-25 自CPropertySheet来派生属性页类图11-26 例11-7的属性页图12-1 在单CPU计算机上按某种规则轮流运行各个线程线程线程线程线程线程线程线程线程CPU图12-2 例12-1程序运行结果图12-3 例12-2程序运行结果线程n线程2线程1资源图12-4 多个线程需要访问同一个资源的情况编辑表格的线程读取表格的线程图12-5 在运行编辑表格线程时不能允许读取表格线程运行a)按下鼠标左键启动了两个线程c)关闭了信息框后,再按下鼠标右键使第一个被挂起的线程恢复了运行b)关闭了信息框后,再按下鼠标右键使第一个被挂起的线程恢复了运行d)关闭了信息框后,再按下鼠标右键使第一个被挂起的线程恢复了运行图12-6 例12-3程序运行结果a)按下鼠标左键启动了两个线程b)关闭了信息框后,再按下鼠标右键使所有被挂起的线程恢复了运行图12-7 例12-4程序运行结果a)线程1先获得临界段b)关闭了信息框后,线程2获得了临界段图12-8 例12-5程序运行结果a)第一个进程的线程1先获得互斥体b)在未关闭第一个进程的信息框前,第二个进程的线程1不能获得了互斥体图12-9 例12-6程序运行结果a)线程1和线程2先获得信号b)关闭了线程1的信息框后,线程3获得了信号图12-10 例12-7程序运行结果图12-11 程序界面图12-12 例12-8程序运行结果
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!