Visual C++程序设计--基础与实例分析ppt.ppt_第1页
Visual C++程序设计--基础与实例分析ppt.ppt_第2页
Visual C++程序设计--基础与实例分析ppt.ppt_第3页
Visual C++程序设计--基础与实例分析ppt.ppt_第4页
Visual C++程序设计--基础与实例分析ppt.ppt_第5页
已阅读5页,还剩306页未读 继续免费阅读

下载本文档

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

文档简介

Visual C+程序设计 基础与实例分析,朱晴婷,2019/4/2,2,第一章 VC开发环境,集成开发环境 集成平台基本操作 调试,2019/4/2,3,Developer Studio操作界面,标题栏 菜单栏 工具栏 状态栏,项目工作区: ClassView ResourceView FileView 编辑区 输出框,2019/4/2,4,图片:操作界面,项目工作区,编辑区,输出框,WizardBar,2019/4/2,5,项目工作区WorkSpace,Developer Studio以项目工作区的方式来组织文件、项目、项目配置。 创建项目工作区时,将创建: 一个项目工作区目录 一个项目工作区文件(.dsw) 一个项目文件(.dsp) 一个工作区选项文件(.opt),要打开一个项目, 只需要打开对应的 项目工作区文件.dsw,2019/4/2,6,项目,一个项目是由一组项目配置和一组源文件组成。 项目配置: Win32DeBug Win32Release Project/Setting,源文件 Header Files Source Files Resource Files,2019/4/2,7,项目工作区窗口,ClassView: 显示项目中定义的C类 Resource View: 显示项目中包含的资源 File View: 显示包含在项目工作区中的文件,2019/4/2,8,ClassView,类 成员变量 成员函数 访问类型 public private protected,2019/4/2,9,RecourceView,Accelerator Dialog Icon Menu String Table ToolBar Version,2019/4/2,10,FileView,查看文件 增加文件 Project/Add to Project/Fles 删除文件,文件操作是针对项目, 并不能从物理上删除或增加 一个文件,2019/4/2,11,File/New: Files Project WorkSpace others Documents MFC AppWizard(EXE),创建一个MFC应用程序,AppWizard Single Document Multiple Document Dialog based,! 工具按钮New只是新建一个文本文件,2019/4/2,12,类操作向导工具,Class Wizard:对话框 View/ClassWizard Ctrl+W 快捷菜单 Wizard Bar:工具栏,2019/4/2,13,ClassWizard的作用,支持从应用程序框架基类中派生新类 为类添加消息映射函数 查看和编辑消息处理函数 创建新类时,自动加入方法和属性,2019/4/2,14,集成平台基本操作,打开应用程序 关闭应用程序 编译运行应用程序,2019/4/2,15,任务1,通过AppWizard,建立MFC应用程序框架 详见实验1,2019/4/2,16,调试,调试命令 设置断点 使用Variables窗口 使用Watch窗口,2019/4/2,17,调试命令,Start Debug Go(F5) Run to Cursor Step Into Step Over Attach to Process Stop Debugging,2019/4/2,18,设置断点,Location 设置位置中断 Data 根据表达式的值设置中断 Message 设置消息中断,2019/4/2,19,Variables窗口,Auto Locals this,2019/4/2,20,Watch窗口,变量 表达式,2019/4/2,21,任务2,Visual C+ 集成开发环境下的程序调试 详见例1-1,2019/4/2,22,联机帮助,Help菜单 F1 MSDN,2019/4/2,23,任务3,实验2 实验3,第二章 面向对象程序设计的概念,C与C+的差别 引用 类和对象 构造函数和析构函数,2019/4/2,25,C对C的改进,一般语法的改进 指针和引用 函数的改进,2019/4/2,26,C的输入和输出,include “stdio.h” printf(“hello c”); scanf(“%d”,#include”iostream.h” cout sum; cout “sum is ” sum endl;,一般语法的改进,2019/4/2,27,注释,/*.*/ /,一般语法的改进,2019/4/2,28,变量定义,变量定义可以位于程序中的任何地方,下面的语句有问题吗? for( int i=0; i10; i+) int c; c*=2; int s; ,一般语法的改进,2019/4/2,29,符号常量的定义,define NULL 0 #define Length 100 #define PI 3.1415926 const int NULL=0 const int Length =100 const double PI=3.1415926,一般语法的改进,2019/4/2,30,强制转换类型,C的强制类型转换法 (类型名)表达式 函数表示法(仅限简单类型) 类型名(表达式) int i=int(1.35);,一般语法的改进,2019/4/2,31,结构体与枚举类型的用户标识名,enum traffic red,green,yellow; struct student int num; char name20; traffic Light; student stu1;,!不必在一个结构体名之前加struct,不用在一个枚举类型名之前加关键字enum。,一般语法的改进,2019/4/2,32,动态内存分配,new int*p,*q,*s; p=new int; s=new int(200); q=new int10; delete delete p; delete q;,一般语法的改进,#include “iostream.h” void main() int *p; p=new int; *p=10; cout*p; delete p; ,2019/4/2,33,引用类型的概念,引用是指给对象的地址取个别名,对引用的改动则是对目标的改动。 int int1; int 引用不是值,不占有存储空间 引用必须初始化,并且不再指向其他不同的变量,指针和引用,2019/4/2,34,什么能被引用,double ,指针和引用,2019/4/2,35,什么不能被引用,void ,指针和引用,2019/4/2,36,引用作为函数参数-地址传递,指针的代码可读性差,指针作为参数传递,用户调用知道函数是如何工作的。 解决大对象值传递会产生副本的问题 程序清单2-3,指针和引用,2019/4/2,37,引用作为函数参数-地址传递,存在的问题 引用隐藏了函数所使用的参数传递的类型,应避免重载匹配错误 void fn(int s); void fn(int 用const 限定引用 double fn(const double &pd),指针和引用,2019/4/2,38,函数原型,例: int func(int,int); C+ 要求所有函数都有函数原型 程序的顶部 头文件 C提供更强的类型检查,允许编译程序对下列情况报错误信息: 被调用函数参数类型定义和类型转换非法 函数的参数个数不相符 函数不能返回预定的数据类型,函数的改进,2019/4/2,39,内置函数inline,#include void main() int a(8),b(16),c; inline int max(int,int); c=max(a,b); cout”c=”cendl; int max(int x,int y); cout”c=”cendl; ,2019/4/2,40,内置函数inline,实质: 编译器为inline 函数创建代码,在每次碰到该函数的调用都用相应的一段代码替换 说明: 关键字inline一般放在函数声明的前面 inline放在函数定义的前面时,函数定义要在调用函数的前面 限制: 不能含有switch,while等复杂的结构控制语句,递归函数不能被用作inline函数,函数的改进,2019/4/2,41,inline 与宏定义,宏所作的是机械代换,在参数为表达式时会产生不可预知的错误 宏不能作类型检查 define f(m) m*m 宏定义调用:f(5+5) 5+5*5+5,函数的改进,2019/4/2,42,函数的默认参数,可以在函数声明时,对参数赋与默认值,调用没有给出实参时,就使用默认值。 void delay(int loops=1000); void delay(int loops) if (loops=0) return; for(int i=0;iloops;i+); delay(); delay(5000);,函数的改进,2019/4/2,43,默认参数的使用说明,默认参数只能在函数声明中提供 若一个函数有多个默认参数,则在形参分布中从右到左逐个定义,在调用函数时,自左向右逐分配实参。 默认值可以是全局变量,常量,甚至一个函数,但不能是局部变量。,分析下面语句的正确性: void func(int a=1,int b,int c=3,int d=4); void func(int a,int b=2,int c=3,int d=4); func(10,15,20,30); func(); func(12,12); func(2,15,20);,函数的改进,2019/4/2,44,重载函数,函数具有相同的名字,但有不同的参数,完成不同的操作 int abs(int i); long abs(long g ); double abs(double d);,函数的改进,2019/4/2,45,重载函数说明,重载函数至少在参数的个数、参数的类型、或参数的顺序上有所不同 不能用typedef 的类型名区分重载函数中的参数 typedef int Length; void func(int ); void func(Length); 让重载函数执行不同的功能,是不好的编程风格。,函数的改进,2019/4/2,46,避免二义性编译错误,void print(long) void print(double) 调用: void func(int a) print(a); ,函数的改进,2019/4/2,47,类和对象,类: 由用户定义的,将一组具有相关性的数据和操作封装在一起的抽象数据类型。数据称为数据成员,操作称为成员函数。 对象: 用类定义的变量,2019/4/2,48,类和对象,类的定义 对象的定义 构造函数和析构函数 this指针,2019/4/2,49,类的定义,class 类名 private: 私有段数据及函数 protected: 保护段数据及函数 public: 公有段数据及函数 ; 省略时默认为private,成员访问类型,2019/4/2,50,Point类的设计,class Point int x; int y; public: void set_x(int k)x=k; void set_y(int k)y=k; int get_x()return x; int get_y()return y; ;,2019/4/2,51,成员函数的类型,构造函数 析构函数 普通成员函数 虚函数 注:除析构函数不能重载外,其他成员函数都是可以重载的,2019/4/2,52,成员函数的实现,在类定义时实现 在类定义的外面实现 int Point:get_x() return x;,2019/4/2,53,对象的定义,对象的定义 Point p1; Point *p; Point pa100; Point *parray100;,2019/4/2,54,公有成员的使用,从类外访问公有段的数据成员或成员函数 对象名.公有段数据成员 对象名.公有段成员函数(实参表) 类名:公有段数据成员 类名:公有段成员函数(实参表) 例 p1.x p1.y p1.set_x(20); x=p1.get_x(); p-x p-y pai.x pai.y,2019/4/2,55,任务1,类和对象的定义 详见实验1,2019/4/2,56,构造函数,构造函数的作用是构造对象初始化形式 在定义对象时,由应用程序自动调用 构造函数是类的一个特殊成员函数 它的函数名与类名相同, 没有返回类型 它可以有任意类型的参数 可以重载,2019/4/2,57,默认构造函数,当类定义中没有用户定义的构造函数时,系统自动产生一个无参数的构造函数,称此构造函数为默认构造函数 当定义一个对象时,默认构造函数只是简单地把对象中的每个成员初始化为0或空.,2019/4/2,58,构造函数的类型,无参构造函数 Point(); Point p1; 带参构造函数 Point(int ,int); Point p2(100,200); 复制构造函数 Point(const Point,2019/4/2,59,拷贝构造函数示例,class A public: A(int); A(const A ,2019/4/2,60,析构函数,析构函数也是类的特殊成员函数,它的函数名与类名相同,但它的名字前面有一个“”.它没有参数,没有返回类型,而且不能重载.,2019/4/2,61,this 指针,this 是一个指向调用该函数的对象的常量指针。 成员函数可通过this指针直接使用同类的其它成员 this指针是隐含的 int get_length()return length; int get_length()return this-length;,2019/4/2,62,继承,在已有类的基础上定义新类的过程称为继承。 基类( base class)和派生类 派生类的定义 class : . . ,2019/4/2,63,继承的方式,2019/4/2,64,例2-22 单继承示例,2019/4/2,65,多继承,派生类从多个基类派生,派生类具有多个基类的特性 派生方法: class 派生类名:继承方式1 基类名1,继承方式2 基类名2,.继承方式n 基类名n . . ;,2019/4/2,66,例2-23 多继承示例,2019/4/2,67,多态性,在 基类和派生类中使用同样的函数名而定义不同的操作,从而实现“一种接口,多种方法”。 类型 静态多态性: 编译时实现,通过重载 动态多态性: 运行时实现,通过派生和虚函数,2019/4/2,68,虚函数,在继承体系中,如果在派生类中要对所继承的成员函数重新定义其功能,该函数应在基类中被定义为虚函数。 虚函数是指在基类中的成员函数前加上virtual,然后在派生类中再加以定义的函数。 当用指向派生类的对象的基类指针对函数进行访问时,系统将根据运行时指针所指向的实际对象来确定调用哪一个类的成员函数版本。,2019/4/2,69,例2-25 虚函数示例,第三章 MFC应用程序概述,Windows 应用程序概述 MFC应用程序框架 文档/视图结构 消息映射,2019/4/2,71,窗口编程基础,窗口 消息和消息队列 事件驱动的程序设计 资源管理,2019/4/2,72,窗口的界面元素,2019/4/2,73,窗口,窗口是应用程序与用户交互的界面 窗口元素以对象方式组织 一个应用程序由多个窗口组成 程序运行过程是窗口之间,窗口与系统,窗口与用户之间交换并处理数据的过程。,2019/4/2,74,消息和消息队列,消息用于通知某个事件的产生 消息机制 MSG 消息的类型,2019/4/2,75,消息机制,2019/4/2,76,派送消息,消息源1,消息源2,消息源n,否,捕获消息,处理消息,是否退出 消息,是, ,2019/4/2,77,MSG,typedef struct tagMSG HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; MSG;,2019/4/2,78,消息的类型,输入消息 控件消息 系统消息 用户消息,2019/4/2,79,事件驱动的程序设计,事件驱动的程序的逻辑顺序是按事件的产生而决定的 事件的产生不是预先定义的,有着随机性,2019/4/2,80,2019/4/2,81,资源管理,资源的类型 用户自定义资源 菜单 对话框 工具栏 系统资源 设备上下文 画刷 画笔 字体 通信端口,资源管理器 资源ID 资源模板 资源文件 资源编译程序 资源数据结构,2019/4/2,82,窗口应用程序剖析,窗口应用程序的构成 一个应用程序是如何开始的?,2019/4/2,83,窗口应用程序的构成元素,代码 winmain windows procedure 用户界面资源 库模块 DLL,2019/4/2,84,一个应用程序是如何开始?,操作系统创建一个新的进程和一个初始线程 应用程序代码装载到内存 动态链接库装载到内存(如果需要使用DLL) 为数据和堆栈分配物理内存,并映射到虚拟内存 应用程序开始执行,2019/4/2,85,窗口应用程序组成,The WinMain function A window procedure function message loop (消息循环) 例31,2019/4/2,86,The WinMain Function,在操作系统注册窗口类。 在内存中创建窗口,并初始化它的属性,使窗口正确显示。 创建一个消息循环,检查窗口是否产生消息进入消息队列 当消息循环检测到关闭窗口消息WM_QUIT时,终止程序运行,2019/4/2,87,The Window Procedure,用户自定义函数 决定窗口在客户区显示的内容,和窗口对用户输入如何反应 处理开发者添加的消息处理代码,如果不存在开发者添加的消息处理代码,将由 default window procedure函数处理 。,2019/4/2,88,消息循环,while (GetMessage( ,2019/4/2,89,任务1,分析使用AppWizard生成的Win32窗口程序示例Exam3_2,并修改该程序。 详见例3-2,2019/4/2,90,MFC应用程序概述,MFC类简介 构建Windows应用程序的基本类 文档/视图结构 剖析MFC SDI的文件结构,2019/4/2,91,MFC 类,application programming interface (API) MFC 封装了API的主要结构和通用组件,2019/4/2,92,MFC的特点,创建窗口方便,利用程序的应用程序框架 新的C+的类与早期版本的 MFC兼容 大量可重用的C+源代码 与 Visual C+集成,2019/4/2,93,MFC的特点,支持灵活快速的DAO或ODBC数据库访问方式 支持 ActiveX 和Internet 技术 支持先进的数据绑定技术 支持窗口消息 API 支持多线程,2019/4/2,94,MFC 的继承关系,MFC 类封装了 the win32 API 应用程序对象如: documents,views and applictions Activex,database, Internet 特点 MFC分类 CObject_derived 类 Non_CObject_derived 类,2019/4/2,95,CObject派生类,2019/4/2,96,非CObject派生类,通用工具类 CString CTime CTimeSpan CRect Cpoint CSize,MFC支持类 CArchive CDumpContext CRuntimeClass CFileStatus CMemoryState CTypePointerArray,2019/4/2,97,构建Windows应用程序基本类,应用程序类 主框架类,2019/4/2,98,应用程序类CExam1_1App,类定义头文件 一个空的类结构 类的实现文件 应用程序类的消息映射 空的构造函数 全局对象theApp InitInstance函数定义,2019/4/2,99,InitInstance,创建应用程序的主窗口 一个指向有效主窗口的指针 m_pMainWnd,2019/4/2,100,主框架类CMainFrame,管理除视图之外的其他主窗口部分 OnCreate m_wndToolBar m_wndStatusBar,2019/4/2,101,任务2,手工编写MFC应用程序 详见实验1,2019/4/2,102,文档,视图和应用程序框架,文档/视图结构 SDI 和 MDI 应用程序 在SDI应用程序中的对象 非文档/视图结构,2019/4/2,103,文档/视图结构,文档 : a data object with which the user interacts in an editing session 视图 a window object through which the user interacts with the document,2019/4/2,104,文档/视图应用程序的构成,2019/4/2,105,文档/视图结构,传递消息到窗口框架 传递消息到视图 信息在视图与文档对象间双向传递,2019/4/2,106,文档类,装载、存贮、 管理应用程序的数据 每一个文档对象维护一张与视图相关联的列表,每一个视图对象维护与其相关联的指针。 主要成员函数 OnOpenDocument OnNewDocument Serialize,2019/4/2,107,视图类,显示保存在文档类中的信息,允许用户输入 主要成员函数 GetDocument OnDraw OnInitialUpdate OnUpdate,2019/4/2,108,视图类的类型,CScrollView CFormView CEditView CRichEditView CListView CTreeView CRecordView CCtrlView,2019/4/2,109,文档模板类,绑定框架、视图、文档和一组应用程序资源的类 不需要开发者干涉其行为,所以不存在对应的文件 CDocTemplate CSingleDocTemplate CMultiDocTemplate,2019/4/2,110,文档模板类层次图,2019/4/2,111,SDI 和 MDI 应用程序,SDI 只能打开一个文档窗口 画图 MDI 可以打开多个文档窗口 Excel,2019/4/2,112,定义单文档的文档模板类型,CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CExam1_1Doc), RUNTIME_CLASS(CMainFrame), RUNTIME_CLASS(CExam1_1View); AddDocTemplate(pDocTemplate);,2019/4/2,113,SDI 应用程序组成,Application Object,Document Template,Document,Toolbar,View,Status Bar,Main Frame Window,2019/4/2,114,MFC SDI的文件结构,工作区文件、项目文件 Exam1_1.dsw Exam1_1.dsp Exam1_1.clw 应用程序源文件和头文件,资源文件 Exam1_1RC RESOURCE.H Exam1_1.rc2 预编译头文件 StdAfx.cpp StdAfx.h,2019/4/2,115,消息映射,消息的类别及描述 消息映射系统 消息处理的路径 自定义消息处理,2019/4/2,116,消息的类别,窗口消息 CView和CFrame及其派生类、及自定义窗口类处理窗口消息。 命令消息 从基类CCmdTarget派生的类都能处理命令消息 控件消息 控件消息由控件所属的对话框类处理,2019/4/2,117,窗口消息的描述,message:WM_XXX wParam和 lParam:随WM_XXX而变,2019/4/2,118,命令消息的描述,message :WM_COMMAND wParam:低16位为命令ID、高16位为0 lParam:0L,2019/4/2,119,控件消息的描述,message:WM_NOTIFY wParam:控件ID lParam:指向NMHDR的指针,NMHDR是包含了消息内容的一个结构,2019/4/2,120,消息宏前缀,2019/4/2,121,消息映射系统,CCmdTarget的派生类 每个子类都定义一个消息表 消息映射表 DECLARE_MESSAGE_MAP() BEGIN_MESSAGE_MAP() END_MESSAGE_MAP(),2019/4/2,122,MFC消息映射原理,应用程序开始运行后有一个从CWinApp派生的对象,等待和处理消息的函数是应用程序类的RUN()函数。 RUN() 函数将接收到的消息都交给主窗口的窗口函数OnWndMsg(),由OnWndMsg()函数负责将消息分类并交予不同的消息处理函数去处理。,2019/4/2,123,消息映射表,MFC在每一个能够接收和处理消息类中,定义一个消息和消息处理函数静态对照表,该表称为消息映射表。该类能够处理的所有的消息及其对应的消息处理函数的地址都列在该表中。,2019/4/2,124,在类中加入静态消息映射表,在.h 文件中加入: DECLARE_MESSAGE_MAP() 在.CPP文件中加入: BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd) ON_WM_PAINT() END_MESSAGE_MAp(),2019/4/2,125,消息映射表示例,BEGIN_MESSAGE_MAP(CExam1_1App, CWinApp) /AFX_MSG_MAP(CExam1_1App) ON_COMMAND(ID_APP_ABOUT, OnAppAbout) /AFX_MSG_MAP ON_COMMAND(ID_FILE_NEW, CWinApp:OnFileNew) ON_COMMAND(ID_FILE_OPEN, CWinApp:OnFileOpen) ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp:OnFilePrintSetup) END_MESSAGE_MAP(),2019/4/2,126,消息处理宏格式,2019/4/2,127,例3-3,创建一个单文档的MFC应用程序Exam3_3,并实现功能:当在视图中双击鼠标右键时,弹出对话框,显示鼠标的坐标。,2019/4/2,128,消息处理路径,窗口消息的处理 命令消息的处理 控件消息的处理,2019/4/2,129,如何处理窗口消息,所有基类均没定义该消息的处理函数,2019/4/2,130,窗口消息的处理,OnWndMsg()搜索窗口类的消息映射表,如果找到了匹配的消息处理函数,就执行消息处理函数 如果找不到,继续搜索该窗口类的基类,如果找到了匹配的消息处理函数,就执行消息处理函数; 如果还没有找到,则把消息交给默认窗口函数DefWindowProc()处理,2019/4/2,131,如何处理命令消息,从理论上讲,所有从基类 CCmdTarget类派生的类均可处理命令消息,MFC应用程序框架将依次检查基本类的消息映射表。,视图类,文档类,文档模板类,框架窗口类,应用程序类,界面变灰,2019/4/2,132,命令消息的处理,OnWndMsg()函数会将命令消息分发给窗口类的OnCommand()函数 OnCommand()函数调用成员函数OnCmdMsg()函数,该函数依次搜索视图类、文档类、文档模板类、框架窗口类和应用程序类及其基类中的消息映射表,搜索到消息处理函数, 搜索到消息处理函数则执行消息处理函数 如果全部查找完毕,依然不能处理,则该命令消息所对应的界面元素变灰。,2019/4/2,133,如何处理控件消息,2019/4/2,134,控件消息的处理,把消息交给控件所属的类,如果能够处理,执行消息处理函数 如果控件所属的类不能处理,调用控件的父窗口对应类的OnCmdMsg(),搜索父窗口对应类的消息映射表,以获得处理该消息的函数,2019/4/2,135,自定义窗口消息 的方法,自定义静态窗口消息 通过指定窗口消息对应的整数值来获得自定义窗口消息 自定义动态窗口消息 通过定义一个字符串名称来定义 一个窗口消息,2019/4/2,136,自定义静态窗口消息,首先在为类实现文件中定义消息 #define WM_MYMESSAGE WM_USER+100 在类中声明消息处理函数 Afx_msg LRESULT OnMyMessage(WPARAM wParam,LPARAM lParam) 在类的消息映射表中加入映射项 ON_MESSAGE(WM_MYMESSAGE,OnMyMessage) 在类上实现消息处理函数 使用SendMessage函数或PostMessage发送消息 pView-SendMessage(WM_MYMESSAGE,0L,0L);,2019/4/2,137,自定义动态窗口消息,首先定义并注册消息 #define MESSAGE_NAME “2001-8-1-THIS-IS-A-MESSAGE-TEST” UINT WM_MYMESSAGE=:RegisterWndMessage(MESSAGE_NAME) 在类中声明消息处理函数 在类的消息映射表中加入映射项 在类实现文件中实现消息处理函数 使用SendMessage函数或PostMessage函数发送消息,2019/4/2,138,任务3,实验3 实验4,第四章 资源和资源编辑器,资源符号和资源编辑器 菜单的使用 工具栏的使用 状态栏的使用,2019/4/2,140,资源,加速键(Accelerator) 位图(Bitmap) 光标(Cursor) 对话框(Dialog) 图标(Icon) 菜单(Menu) 字符串表(String Table) 工具栏(Toolbar) 版本信息(Version Information),2019/4/2,141,资源符号,View/Resource Symbol,2019/4/2,142,资源编辑器的公共操作,查看资源 使用资源模板 导入和导出资源 查看和编辑属性页,2019/4/2,143,创建新资源,Insert/Resource,2019/4/2,144,保存和删除资源,Resource View|* File|Save All Delete键直接删除,2019/4/2,145,菜单编辑器的使用,创建标准菜单和命令 创建弹出命令 设置快捷键、加速键和菜单命令项的状态栏消息 移动菜单命令,2019/4/2,146,加速键编辑器的使用,增加、删除、改变和浏览加速键列表 浏览并改变加速键表资源ID 将一个加速键与一个菜单命令相联系,2019/4/2,147,工具栏编辑器的使用,创建工具栏和按钮 将位图转化为工具栏资源 创建、移动和编辑工具栏按钮,2019/4/2,148,版本信息编辑器的使用,文本框的编辑,2019/4/2,149,字符串编辑器的使用,查找、增加、删除一个字符串 移动一个字符串到另一个段 移动一个字符串到另一个资源文件(*.rc) 改变一个字符串或它的ID 增加格式或特殊字符到一个字符串,2019/4/2,150,图形编辑器,绘制位图、图标、鼠标 绘制工具栏位图,2019/4/2,151,任务1,文本编辑器的使用 详见例41,2019/4/2,152,菜单的类型,顶层菜单(top-level menu) 弹出菜单(pop-up menu) 下拉菜单(Drop-down menu) 子菜单(Submenu) 快捷菜单(Shortcut menu),2019/4/2,153,菜单编辑器的操作,插入菜单项 插入分割线 增加子菜单 删除菜单项 调整菜单项位置 属性对话框的填写 ID Caption Prompt,2019/4/2,154,菜单消息命令的处理,WMCOMMAND ClassWizard,2019/4/2,155,更新菜单命令的处理,UPDATE_COMMAND_UI CCmdUI类及成员函数 Enable SetCheck SetRadio SetText,用户在选择有些菜单命令时,希望看到选择留下的痕迹,2019/4/2,156,任务2,更新菜单项举例 详见例42,2019/4/2,157,任务3,使用快捷菜单 增加一个快捷菜单 快捷菜单命令项命令处理函数 详见例43,使用Component Gallery增加一个快捷菜单,2019/4/2,158,任务4,在对话框应用程序中添加菜单栏 详见实验3,2019/4/2,159,工具栏和状态栏,CToolBar CStatusBar CMainFrame:OnCreate,2019/4/2,160,默认工具栏源代码剖析,定义工具栏成员变量 CToolBar m_wndToolBar 创建工具栏窗口 加载工具栏资源 设置工具栏停靠特性 设置框架窗口停靠特性 把工具栏停靠在框架窗口的具体位置,2019/4/2,161,自定义工具栏的创建,创建一个工具栏资源 定义一个CToolBar的对象 调用CToolBar:Create创建工具栏窗口 调用CToolBar:LoadToolBar装载工具栏资源 例44,2019/4/2,162,任务5,生成两个自定义的工具栏 详见实验1,2019/4/2,163,默认状态栏源代码剖析,定义状态栏成员变量 CStatusBar m_wndStatusBar 窗格数组 CStatusBar:Create创建状态栏窗口 CStatusBar:SetIndicator设置窗格,2019/4/2,164,修改状态栏的窗格,删除一个窗格 移动一个窗格 添加一个窗格 创建一个dummy menu菜单资源标识窗格 在Indicator数组中增加窗格资源 创建窗格ID的命令更新处理程序,2019/4/2,165,任务6,在状态栏添加时间显示 详见例45,第5章 图形和文本输出,图形设备接口 CGdiObject对象 CDC 文本处理 绘图处理,2019/4/2,167,图形设备接口GDI(graphics device interface),矢量图形 创建线和填充图形 光栅图形 位图 文本输出 以逻辑坐标为单位计算文本输出位置,2019/4/2,168,绘图工具GDI对象GdiObject,CGdiObject是一个抽象类,该类不能直接定义对象。必须使用它的派生类,2019/4/2,169,设备上下文DC device context,GDI创建用来代表设备连接的数据结构 主要功能: 允许应用程序使用一个输出设备 提供窗口应用程序,设备驱动,和输出设备之间的连接 保存当前信息,例如在一个窗口内绘图使用的颜色,画笔的宽度、画刷的类型等等 保存窗口剪取区域(clipping region),限制程序输出到输出设备中窗口覆盖的区域,2019/4/2,170,设备上下文类CDC,2019/4/2,171,OnDraw函数,void CMyView:OnDraw(CDC* pDC) CMyDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here pDC-TextOut(1,1,”hello world!”); ,2019/4/2,172,WM_PAINT消息,产生WM_PAINT消息的场合通常有 窗口移动后及最大化,最小化后的刷新。 被覆盖区域的刷新,如下拉菜单覆盖的区域。 无效区域产生后的刷新,如执行滚动条操作,将一区域移动至不可见。,2019/4/2,173,WM_PAINT消息,人为地生成一个绘制消息,重绘窗口 的方法: Invalidate(true); CRect rect(1,1,300,300); InvalidateRect(,2019/4/2,174,获取设备上下文 的方法,接受一个参数为指向CDC对象的指针 void CMyView:OnDraw(CDC* pDC); 构造CClientDC对象 CClientDC dc(this);,2019/4/2,175,接受一个参数为指向CDC对象的指针,void CMyView:OnDraw(CDC* pDC) CMyDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here /在坐标为10,10的位置上画一点,颜色黑色 pDC-SetPixel(CPoint(10,10),RGB(0,0,0); ,参数为指向CDC对象的指针,2019/4/2,176,构造CClientDC对象,构造CClientDC对象,Void CMyView:OnLButtonDown(UNIT nFlags,CPoint point) / TODO: add draw code for native data here CClientDC dc(this); /this 指针将CMyView赋值给创建的dc对象 dc.SetPixel(point,RGB(255,0,0); CView: OnLButtonDown( nFlags,point); ,2019/4/2,177,任务1,编写一个单文档MFC(EXE)程序,在视图类增加成员变量,追踪鼠标的左键双击位置的坐标,并输出 详见例5-1,2019/4/2,178,处理文本,设置文本颜色 设置文本显示属性 设置字体 格式化文本 文本输出函数,图形和文本并 没有明显的界限,2019/4/2,179,设置文本颜色,COLORREF SetTextColor(COLORREF crColor); COLORREF SetBkColor(COLORREF crColor);,2019/4/2,180,颜色的表示,2019/4/2,181,/基本三元色 COLORREF crRed=RGB(255,0,0); COLORREF crGreen=RGB(0,255,0); COLORREF crBlue=RGB(0,0,255) / 16-color设备支持颜色 const COLORREF g_crBlack = RGB(0,0,0); const COLORREF g_crYellow = RGB(255,255,0); const COLORREF g_crDkYellow = RGB(128,128,0); const COLORREF g_crRed = RGB(255,0,0); const COLORREF g_ crDkRed = RGB(128,0,0); const COLORREF g_crMagenta = RGB(255,0,255); const COLORREF g_ crDkMagenta = RGB(128,0,128); const COLORREF g_crBlue= RGB(0,0,255); const COLORREF g_ crDkBlue = RGB(0,0,128);,2019/4/2,182,void CMyView:OnDraw(CDC* pDC) CMyDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pDC-SetTextColor(RGB(255,0,0); pDC-SetBkColor(RGB(0,0,0); CString str; str.Format(“鼠标左键双击的位置是%d,%d“, m_LPoint.x, m_LPoint.y); pDC-TextOut(0,0,str); ,2019/4/2,183,设置文本显示属性,2019/4/2,184,设置字体,定义CFont对象 调用CreateFont函数创建字体 将创建的字体对象选入DC,并保存前一个被选入DC的字体对象,2019/4/2,185,void CMyView:OnDraw(CDC* pDC) CMyDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); CFont NewFont; NewFont.CreateFont (65,65,0,0,FW_DONTCARE, true,false,false,DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH|FF_DONTCARE, “黑体“); CFont *pOldFont; pOldFont=pDC-SelectObject ( ,2019/4/2,186,格式化文本,文本测量函数 GetTextExtent 获取字符串高度和宽度 GetTextMetrics 获取Textmetric类型数据,包含具体的字体测量信息,2019/4/2,187,2019/4/2,188,文本输出函数,2019/4/2,189,任务2,阅读单文档MFC(EXE)程序EXAM5_2中处理文本显示的OnDraw函数。请分析每一行的文本串作了哪些文本属性设置、格式设置和字体设置。 详见例5-2,2019/4/2,190,分析结果:,2019/4/2,191,任务1,文本处理 详见实验1,2019/4/2,192,处理绘图,简单的图形输出 库存对象 设置绘图坐标系 创建和使用自定义画笔和画刷,2019/4/2,193,点,pDC-SetPixel(CPoint(200,200),RGB(255,0,0); /在200,200的位置画一个红点,2019/4/2,194,线,pDC-MoveTo(0,0); /在视图的左上角一个X pDC-LineTo (100,100);

温馨提示

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

评论

0/150

提交评论