C程序设计第13章.ppt_第1页
C程序设计第13章.ppt_第2页
C程序设计第13章.ppt_第3页
C程序设计第13章.ppt_第4页
C程序设计第13章.ppt_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

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

文档简介

第13章 MFC编程基础,13.1 Windows编程及MFC简介了解 13.2 基于对话框的应用程序设计重点 13.3 单文档(SDI)和多文档(MDI)应用程序 了解,13.1 Windows编程及MFC简介,13.1.1 Windows API编程基础 1.Windows 编程中的基本概念 1)窗口 窗口是Windows程序的基本组成部分,它是用户与应用程序进行交互的场所。 图13.1是一个典型的windows窗口以及它的组成。,2)句柄 句柄是Windows编程中一个很重要的概念,它是由系统分配的用来唯一标识Windows程序中不同对象的一个4字节的整数值。常用的句柄类型有以下几种: HWND 窗口句柄 HINSTANS 实例句柄 HMENU 菜单句柄 HCURSOR 光标句柄 HICON 图标句柄 HDC 设备句柄 HPEN 画笔句柄 HBRUSH 画刷句柄,3)事件和消息 Windows程序是基于事件或消息驱动的,其基本思想是,用特定的事件确定应用程序的控制流程。程序要花费它的大部分时间来等待这些事件,并提供代码响应其中部分事件。当程序完成了对事件的响应之后,它就返回等待状态。,4)WinMain函数 WinMain函数是Windows API编程的入口函数,就象控制台程序的入口函数Main一样。它主要作用是显示主窗口,完成消息循环。 5)消息循环 Windows程序中每发生一个事件时,系统都把产生的消息放到应用程序的消息队列中。Winmain函数的消息循环语句从消息队列中逐个取出消息。并将其传递给窗口函数进行相应的处理。消息循环一般采用如下形式: while (GetMessage ( ,6)窗口函数 窗口函数是一个回调函数,所谓的回调函数就是用户按照系统规定的形式提供给系统调用的函数。它主要对消息循环发送来的消息进行分类处理。,7)窗口类 Windows编程中的窗口类不是指某个特定的C+类,而是一个描述Windows窗口属性的数据结构,它的定义如下: typedef struct _WNDCLASS UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HANDLE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCTSTR lpszMenuName; LPCTSTR lpszClassName; WNDCLASS ;,2.Windows 编程实例 本程序在在WinMain函数中创建一个主窗口,当鼠标左键单击主窗口时弹出一个消息框。 在VC+6.0中执行菜单FileNew,弹出如如图132所示对话框,输入工程名HelloWorld,选择Win32 Application。,点击OK按钮,完成HelloWorld.cpp文件的建立,然后输入【程序13.1】代码:,【程序13.1】 #include /窗口函数原型申明 LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; /WinMain函数 int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) HWND hwnd ; /主窗口句柄 MSG msg ; /消息变量 WNDCLASS wndclass ; /窗口类 wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.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 = “HelloWorld!“ ; /注册窗口类 if (!RegisterClass ( ,/创建主窗口 hwnd = CreateWindow (“HelloWorld!“, “HelloWorld!“,WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,NULL, NULL, hInstance, NULL) ; ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; /消息循环 while (GetMessage ( ,/窗口函数 LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam) switch (message) /处理鼠标左键按下消息 case WM_LBUTTONDOWN: MessageBox (NULL, “HelloWorld!“,“HelloWorld!“, MB_OK); break; /处理程序退出消息 case WM_DESTROY: PostQuitMessage (0) ; return 0 ; return DefWindowProc (hwnd, message, wParam, lParam) ; ,13.1.2 MFC编程简介,1. MFC基本类介绍 1) CObject类 CObject是大多数MFC类的根类或基类。 MFC从CObject派生出许多类,具备其中的一个或者多个特性。用户也可以从CObject类派生出自己的类,利用CObject类的这些特性。 2) CWinApp类 CWinApp为应用程序类,它用于 Windows 操作系统的应用程序的初始化、运行和终止。利用MFC开发Windwos应用程序时必须建立一个继承自CWinApp的类,并构造一个全局的该派生类的对象。,3) CDocument类 CDocument是应用程序的文档类的基类,它用于对应用程序的文档进行操作,例如文档的创建、加载和保存。 4) CView类 CView类是应用程序的视类的基类,一个视类与一个文档类相关联,视类封装了程序的视图功能。视图是在用户和文档之间建立了一个可视化的界面。,5)CFrameWnd类 CFrameWnd为应用程序框架窗口类的基类,它是CWnd类的子类,框架窗口一般包含了菜单项、工具栏、状态栏和视图窗口。 6) CWnd类 CWnd为MFC类库的窗口类提供了基本的功能。窗口是Windows应用程序的最基本的组成部分。CWnd提供了非常多的成员函数来封装了对窗口的各种操作。 7) CDialog类 CDialog类是对话框类的基类,它封装了对对话框的各种操作,它继承自CWnd,因为对话框本身就是一类特殊的窗口。,2.通过应用程序向导创建MFC应用程序 VC+6.0为提供了向导(AppWizard)来生成MFC应用程序的框架。 点击FileNew菜单,弹出如图14.1.2所示的新建工程对话框。选择MFC Appwizardexe,输入工程名HelloWorld MFC,点击OK按钮,弹出如图13.4所示的AppWizard对话框,选择Single document(单文档模式),点击next按钮会进入MFC AppWizard step 2,AppWizard 提供了设置功能。选择Finish按钮,使其余选项都保持默认,完成工程的创建。,执行以上操作以后,应用程序向导AppWizad建立了一个程序框架,点击工具栏执行按钮,将看到如图13.5所示的一个程序框架。,下面实现在窗口上单击鼠标后弹出消息框的功能。 回到VC编译环境后单击左边workspace窗口下方的classview选项卡,如图13.6所示。,CHelloWorldMFCView类上单击鼠标右键,选择Add Windows Message Handler,打开如图13.7所示对话框为类CHelloWorldMFCView添加消息处理,双击左边的WM_LBUTTONDOW 为应用程序填加鼠标左键按下消息处理。单击Edit Existing按钮可以在ClassView中发现类CHelloWorldMFCView已多了一个成员函数OnLButtonDown,这就是鼠标左键按下的消息处理回调函数,为它填加如下代码。 void CHelloWorldMFCView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default MessageBox(“HelloWorld MFC!“); CView:OnLButtonDown(nFlags, point); ,13.2 基于对话框的应用程序设计,13.2.1利用MFC的AppWizard创建基于对话框的应用程序 可以利用VC+6.0为我们提供的工程向导建立基于对话框的应用程序,步骤如下: 1打开VC+6.0,选择菜单FileNew。弹出如图13.9所示的新建工程对话框,选择MFC AppWizard(exe)填入工程名DialogApp,单击OK按钮进入如图13.10所示的MFC AppWizard-Step 1对话框。,2MFC AppWizard-Step 1对话框中选择Dialog based单选按钮,点击Finish按钮完成工程的创建。 3这系统为我们建立了一个默认的对话框模板如图13.22所示:,13.2.2 Windows控件简介,Windows为我们提供的标准控件有按钮控件、编辑框控件、列表框控件、组和框、滚动条控件、进度条控件和静态控件等等。相对应的类分别为:CButton、CEdit、CList、CCombBox、CScrollBar、CProgressCtrl、CSpinButtonCtrl和CStatic。,1按钮控件,按钮控件包括普通按钮、单选按钮、复选按钮、组框按钮等。其中组框主要是为了对控件进行分组说明。除组框外其它按钮都处理鼠标消息,当接收到鼠标消息时向其父窗口(装载按钮的对话框窗口)发送一个命令消息(WM_COMMAND消息),对话框的窗口过程函数根据消息的字参数确定出发送消息按钮的ID,然后调用相应的消息处理函数。而其分窗口一般都提供一个消息处理函数来执行一定的操作。例如在对话框中点击确定按钮时,系统将向对话框发送一个WM_COMMAND消息,并调用消息处理函数关闭对话框。 在MFC中与按钮对应的类为CButton,CButton类的主要方法有如下几个:,2编辑框控件,编辑框控件一般用来向应用程序输入消息或向用户显示程序的输出结果,它分为单行的和多行的。 当用户操作编辑框时,编辑框向其父窗口发送WM_COMMAND消息,该消息的字参数wParam的低字节为发送消息的控件ID号,高字节为标识用户对编辑框操作的消息通知码,在MFC中对这些消息通知码都进行了消息映射,将其映射到一个回调函数中,用户只需要在消息通知码的回调函数中编写自己的代码,程序会在用户对编辑框进行某种操作时自动调用这个消息映射回调函数。这种消息映射机制是MFC中常见的一种处理消息的方法。 在MFC中与编辑框对应的类为CEdit,CEdit的主要方法如表14.2.2所示。,13.2.3基于对话框应用程序实例解析,1程序界面设计 继续使用13.2.1节中创建的工程来完成程序的设计,选择WorkSpace窗口的ResourceView选项卡,展开Dialog文件夹前面的小十字。双击其下的IDD_DIALOGAPP_DIALOG,进入主对话框模板编辑状态。这时在VC窗口的右边就能看到如图13.25所示的控件窗口,控件属性的设置 选择中某个控件点击右键菜单上的Properties或者选中控件后直接按下回车键都会退出如图13.26所示的控件属性对话框。通过它可以设置控件的ID、标题(Caption)、风格等一些属性。其中控件ID是每个控件都必须设置的内容,它唯一标识了整个程序中用到的控件,可以输入任意合法的标识符,VC会将其定义为一个宏,并为其分配一个唯一的整数值。,成员变量的绑定 执行菜单ViewClassWizard或快捷键Ctrl+打开如图13.27所示的ClassWizard对话框,选择MemberVariables选项卡,在Class name中选择主对话框类CDialogAppDlg类,在下面的控件ID中选择IDE_MULTI1,点击Add Variable为表示被乘数的编辑框绑定变量,弹出如图13.28所示的填加成员变量对话框,变量名输如m_multi1,绑定类型为Value,变量类型为float。此方法为其它的控件绑定变量如表13.4所示:,4添加消息处理,完成程序功能 打开ClassWizard对话框,选择Message Maps选项卡,确保类名为CDialogAppDlg,在左边选择IDB_COMPUT,右边选择BN_CLICKED,点击按钮Add Fuction后点击Edit Code按钮。这时MFC向导将自动为主对话框类CDialogAppDlg添加一个成员函数,函数原型为CDialogAppDlg:OnComput(),这个函数就是“计算”按钮的消息处理函数,在该函数中添加如下代码:,void CDialogAppDlg:OnComput() / TODO: Add your control notification handler code here UpdateData(true); switch(m_radioType) case 0: /当选中“加法“ 按钮时 m_type=“; m_result=m_multi1+m_multi2; break; case 1: /当选中“减法“ 按钮时 m_type=“; m_result=m_multi1-m_multi2; break;,case 2: /当选中“乘法“ 按钮时 m_type=“; m_result=m_multi1*m_multi2; break; case 3: /当选中“除法“ 按钮时 m_type=“; if(m_multi2=0) MessageBox(“除数不能为零!“); break; else m_result=m_multi1/m_multi2; break; UpdateData(false); ,5编译运行程序,13.3 单文档(SDI)和多文档(MDI)应用程序,13.3.1文档/视图结构概述,13.3.2文档/视图结构中的一些重要概念,1文档视图之间的互操作 文档和视图之间存在一现互操作的接口,如下所示: CView:GetDocument()函数:检索其文档的指针。 CDocument:UpdateAllViews()函数:更新与某文档相连的视图。 CDocument:OnNewDocument()函数:初始化文档成员。 CFrameWnd:GetActiveDocument()函数:从任何CFrameWnd的派生类中,访问目前活动的文档。,2文档类的处理 MFC的文档视图结构中对文档的处理一般采用以下几步: 从CDocument类派生出自己的文档类; 在文档类中填加描述程序数据结构的数据成员; 在用户的文档中覆盖基类的串行化虚函数Serialize,该函数可以完成将数据存储到永久介质上或从永久介质上读取数据。,3文档的串行化 文档的串行化是指将文档类中数据成员的值保存在磁盘文件中,或者将存储在文件中的数据读取到相应的成员变量中的过程。文档的串行化一般通过在自己的文档类中覆盖基类CDocument的成员函数Serialize来实现,该函数的形式如下所示: void CMyDoc:Serialize(CArchive& ar) if (ar.IsStoring( ) / TODO: add storing code here else / TODO: add loading code here ,4视图类的处理 从视图类CView派生出自己的视图类 重载视图类的OnDraw函数,该函数根据文档类将Windows消息和用户界面对象(如菜单项)与视图类中的消息处理函数连接 实现消息处理函数,以解释用户的输入 根据需要,在派生的视图类中重载CView的其他成员函数,13.3.3菜单的编辑和使用,基于文档视图结构的单文档或多文档应用程序中经常要用到菜单资源。AppWizard已经在单文档和多文档程序中建立了一个主菜单资源。 新建一个单文档应用程序,展开资源视图。双击Menu子项下的ID为IDR_MAINFRAME的菜单资源,就会进入菜单资源的编辑状态,如图13.31所示:可以发现AppWizard已经在该菜单资源中添加了“文件”、“编辑”等一些常用的子菜单,,在菜单资源中通过鼠标点击就能很容易的为菜单资源增加子菜单和菜单项。为主菜单增加一个子菜单,名字为“显示”,为该子菜单增加一个菜单项“消息”,设置它的ID为IDM_MSG,如图13.32所示:,打开ClassWizard对话框。按图13.33设置后点击Add Function按钮,就会为菜单项在CMainFrame类中增加一个消息处理函数OnMsg()。,在OnMsg函数中完成如下代码: void CMainFrame:OnMsg() / TODO: Add your command handler code here MessageBox(“菜单被点击!“); 编译运行程序后点击菜单”显示”消息”后就会弹出一个消息框。,13.3.4单文档应用程序实例解析,1新建一个MFC(EXE)工程,工程名取sdi,选择基于单文档,在本节将给大家介绍一单文档应用程序的例子,该例子实现如图13-34所示的界面。该程序主要实现以下功能: 可以将界面上的学生信息通过串行化保存到文件中。 可以对保存了学生信息的文件打开预览。 可以对学生信息进行修改。,AppWizard的第6步选择Bas

温馨提示

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

评论

0/150

提交评论