640 likes | 803 Views
数字图像处理 - VC ++介绍. 电子信息. 1 面向对象程序设计思想. 1.1 面向对象程序设计的特点 (1) 抽象性 用 C++ 语言可以将该图形描述如下: 圆形 (circle) : 数据抽象: double x , y , r ; 行为抽象: setx() ; sety() ; setr() ; draw() ;. (2) 封装性 (3) 继承性 (4) 多态性. 1.2 面向对象的标记 如 图给出了类的标记方法和一个 point 类的标记实例。. 图:类的标记图.
E N D
数字图像处理 -VC++介绍 电子信息
1 面向对象程序设计思想 1.1 面向对象程序设计的特点 (1) 抽象性 用C++语言可以将该图形描述如下: 圆形(circle): 数据抽象: double x,y,r; 行为抽象: setx();sety();setr();draw();
(2) 封装性 (3) 继承性 (4) 多态性
1.2 面向对象的标记 • 如图给出了类的标记方法和一个point类的标记实例。 图:类的标记图
2 类和对象 2.1 类的声明 类的声明即类的定义,声明一个类的语法与结构的声明类似,其一般形式为: class <类名> { private: <私有成员函数和数据成员的说明> public: <公有成员函数和数据成员的说明> }; <各个成员函数的实现>
其中,class是声明类的关键字;<类名>是标识符,表示声明的类的名字;类声明体内的函数和变量称为这个类的成员,分别称为成员函数和数据成员。其中,class是声明类的关键字;<类名>是标识符,表示声明的类的名字;类声明体内的函数和变量称为这个类的成员,分别称为成员函数和数据成员。 类的成员函数用于对数据成员进行处理,又称为“方法”,程序中通过类的成员函数来访问其内部的数据成员,成员函数是类与外部程序之间的接口。一般类中成员函数的原型声明写在类定义体内,用以说明该成员函数的形式参数和返回值类型,而成员函数的定义体一般写在类定义之外。通常采用下面的形式定义成员函数: <类型标识符> <类名>::<成员函数名>(<形参表>) { <函数体> }
例如: • class rectangle • { • private: • int x,y,weight,high; • public: • rectangle(int xx,int yy,int w,int h) • {x = xx; y = yy; weight = w; high = h;} • inline int area(); • }; • inline int rectangle::area() • { • return weight * high; • }
2.2 对象 类和对象的关系相当于普通数据类型与其变量的关系。类是一种逻辑抽象概念,声明一个类只是定义了一种新的数据类型,对象说明才真正创建了这种数据类型的物理实体。由同一个类创建的各个对象具有完全相同的数据结构,但它们的数据值可能不同。 一旦创建了一个类的对象,程序就可以用运算符“.”来引用类的公有成员,其一般形式为 <对象名>.<公有数据成员名>
或 <对象名>.<公有成员函数名(实参表)> 例如,前面我们定义一个rectangle类,现在我们定义一个rectangle的对象r1,通过对象r1完成对成员函数area()的调用。 rectangle r1(10,10,20,20); r1.area(); 需要注意,只有用public定义的公有成员才能使用圆点操作符访问,对象中的私有成员是类中隐藏的数据,不允许在类外的程序中被直接访问,只能通过该类的公有成员函数来访问它们。
2.3 构造函数和析构函数 (1) 构造函数 构造函数是在类中声明的一种特殊的成员函数,作用是在对象被创建时使用特定的值构造对象,将对象初始化为一个特定的状态。 构造函数的名字与它所属的类名相同,被声明为公有函数,且没有任何类型的返回值,在创建对象时被自动调用。 构造函数作为类的一个成员函数,具有一般成员函数所有的特性,它可以访问类的所有数据成员,可以是内联函数,可以带有参数表,还可以带默认的形参值。构造函数也可以重载,以提供初始化类对象的不同方法。
例如,前面定义的rectangle类的构造函数为 rectangle(int xx,int yy,int w,int h){x = xx; y = yy; weight = w; high = h;} 每个类都必须有构造函数,若类定义时没有定义任何构造函数,编译器会自动生成一个不带参数的缺省构造函数,其形式如下: <类名>::<缺省构造函数名>() { //…… }
(2) 析构函数 一个对象失效时,要调用该对象所属类的析构函数。析构函数的功能是用来释放一个对象的。析构函数本身并不实际删除对象,而是进行系统放弃对象内存之前的清理工作,使内存可用来保存新的数据,它与构造函数的功能正好相反。
例:构造函数和析构函数的例题。 • #include <iostream.h> • class point • { • private: • int x, y; • public: • point(int xx = 0, int yy = 0) • { • x = xx; • y = yy; • cout << "构造函数被调用"<< endl; • } • ~point(){ cout << "析构函数被调用"<< endl; } • int get_x() {return x;} • int get_y() {return y;} • };
void main () • { • point a(15, 22); • } • 程序的运行结果为: • 构造函数被调用 • 析构函数被调用
3 使用AppWizard开发MFC应用程序 3.1 生成MFC应用程序框架 例3-1使用MFC AppWizard生成一个简单的MFC应用程序。 建立MFC应用程序框架一般可以通过以下步骤来实现: (1) 启动MFC AppWizard:定义项目名称。在File菜单下选择New,出现如图3-l所示的New对话框。
在图3-1中选择MFC AppWizard[exe],在Project name文本输入框中输入新建的项目名如Mymfc后,单击OK按钮,将弹出MFC AppWizard-Step 1对话框,如图3-2所示。
(2) MFC AppWizard-Step 1对话框:选择应用程序的类型和语言。 在设置好上述选项后,单击Next按钮,将弹出MFC AppWizard-Step 2 对话框,如图3-3所示。
(3) MFC AppWizard-Step 2:修改类的信息。 • 在MFC AppWizard-Step 6 of 6对话框中,可以设置向导生成的文件名和类名。 • 在设置好文件名和类名后,单击Finish按钮,将弹出新建工程信息对话框,该对话框列出了关于新建立的应用程序项目文件的相关信息,如图3-4所示。
(4) 单击图3-4中的OK按钮,应用程序向导所有的工作就全部完成了,这时向导已经为用户生成了一个可执行的应用程序框架,如图3-5所示。
(5) 编译运行。MFC AppWizard已经生成了一个基本的应用程序,Mymfc应用程序的运行结果如图3-6所示。 图3-6 Mymfc应用程序的运行结果
3.2 查看AppWizard生成的信息 (1) 生成的C++类 • 这里建立的是一个基于文档/视图结构、单文档、无OLE、无数据库选项的最基本的程序框架所需的类(文档/视图结构将在后面详细介绍),所以MFC AppWizard为Mymfc程序生成了四个类。 • CMymfcApp:应用程序类,负责程序的初始化、运行以及结束处理; • CMainFrame:主窗口类,负责主窗口的创建、显示和搜索用户命令以及消息派发; • CMymfcDoc:文档类,负责应用程序文档的装载和维护,文档是应用程序需要保存的任何内容;
CMymfcView:视图类,负责为文档提供一个或几个视图,视图的作用是为显示和修改文档提供人机界面。CMymfcView:视图类,负责为文档提供一个或几个视图,视图的作用是为显示和修改文档提供人机界面。 • 它们的基类及其声明和定义文件如表3-1所示。
(2) 生成的文件 • AppWizard创建项目时,在指定的\Mymfc目录下创建了许多文件,这些文件包含了框架程序的所有的类、全局变量的声明和定义,如图3-7所示。
1) 工作区、项目和类信息文件 • AppWizard生成的应用程序框架是通过项目工作区来管理的。所以,无论选择什么类型的应用程序,AppWizard都要为应用程序生成相应的工作区、项目和类信息文件。本例的工作区、项目和类信息文件如表3-2所示。
表3-2 Mymfc应用程序的工作区、项目和类信息文件
2) 应用程序头文件和源文件 • 根据应用程序的类型——单文档、多文档或基于对话框,AppWizard将自动创建一些应用程序源文件和头文件,这些文件分别是应用程序类、对话窗口类等的声明文件和类实现文件。在本例中,AppWizard生成的头文件和源文件如表3-3所示。
3) 资源文件 • 4) StdAfx.cpp和StdAfx .h 3.3 浏览项目信息与添加代码 • (1) 浏览项目信息 • 前面生成的Mymfc应用程序在项目工作区窗口中显示如图3-8所示。
切换到ClassView中,展开ClassView顶层的文件夹后,显示Mymfc项目中所包含的所有的类。双击CMymfcApp类的图标(或单击图标旁的+号)时,ClassView展开该类并显示其类成员,如图3-9所示。切换到ClassView中,展开ClassView顶层的文件夹后,显示Mymfc项目中所包含的所有的类。双击CMymfcApp类的图标(或单击图标旁的+号)时,ClassView展开该类并显示其类成员,如图3-9所示。
项目中增减C++类或者在类中增减成员,都可以在ClassView中进行。项目中增减C++类或者在类中增减成员,都可以在ClassView中进行。 • 切换工作区视图到ResourceView,可以看到AppWizard自动为Mymfc程序生成的资源名称和类型,资源类型包括图标、菜单、加速键、工具栏、版本信息等,如图3-10所示。
(2) 添加代码 • 添加成员变量一般有两种方法: • 第一种方法是利用VC++的可视化编程工具,具体步骤为:在Workspace窗口的ClassView选项卡中选择要添加成员变量的类。右击此类,在弹出菜单中单击Add Member Variable选项,将出现如图3-11所示的Add Member Variable对话框。
4 MFC应用程序框架与Win32程序的关联 4.1 MFC应用程序框架对Win32程序的封装 (1) Windows程序的基本结构 • WinMain(…) • { • WNDCLASS wndclass ; • RegisterClass ( &wndclass); • CreateWindow (…); • ShowWindow (…) ; • UpdateWindow (…); • While (GetMessage (&msg,NULL,0,0))
{ • TranslateMessage (&msg); • DispatchMessage (&msg); • } • } • WndProc (hwnd, message, wParam, lParam)
{ • switch (message) • { • case … • case WM_DESTROY: • PostQuitMessage (0); • default: • return DefWindowProc (hwnd,message,wParam,lParam); • } • return (0); • }
(2).MFC类对WinMain和WndProc的封装 • 在MFC类中,与应用程序框架相关的类如图3-12所示。
通常在应用程序中,我们直接操作的不是上面这些类,而是以这些类为基类派生出来的类。例如,在Mymfc程序中,AppWizard生成的类与这些类的派生关系如下:通常在应用程序中,我们直接操作的不是上面这些类,而是以这些类为基类派生出来的类。例如,在Mymfc程序中,AppWizard生成的类与这些类的派生关系如下: • 基类派生类 • CWinApp CMymfcApp • CFrameWnd CMainFram • CDocument CMymfcDoc • CView CMymfcView
4.2 MFC应用程序的启动流程 • 下面是Mymfc程序的启动流程,如图3-13所示。