1 / 64

数字图像处理 - VC ++介绍

数字图像处理 - VC ++介绍. 电子信息. 1 面向对象程序设计思想. 1.1 面向对象程序设计的特点 (1) 抽象性 用 C++ 语言可以将该图形描述如下: 圆形 (circle) : 数据抽象: double x , y , r ; 行为抽象: setx() ; sety() ; setr() ; draw() ;. (2) 封装性 (3) 继承性 (4) 多态性. 1.2 面向对象的标记 如 图给出了类的标记方法和一个 point 类的标记实例。. 图:类的标记图.

Télécharger la présentation

数字图像处理 - VC ++介绍

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 数字图像处理 -VC++介绍 电子信息

  2. 1 面向对象程序设计思想 1.1 面向对象程序设计的特点 (1) 抽象性 用C++语言可以将该图形描述如下: 圆形(circle): 数据抽象: double x,y,r; 行为抽象: setx();sety();setr();draw();

  3. (2) 封装性 (3) 继承性 (4) 多态性

  4. 1.2 面向对象的标记 • 如图给出了类的标记方法和一个point类的标记实例。 图:类的标记图

  5. 对象是类的实例,在Cord/Yourdon标记中,对象是在相应类标记外加一个圆角矩形框,如图所示。 对象的标记图

  6. 2 类和对象 2.1 类的声明 类的声明即类的定义,声明一个类的语法与结构的声明类似,其一般形式为: class <类名> { private: <私有成员函数和数据成员的说明> public: <公有成员函数和数据成员的说明> }; <各个成员函数的实现>

  7. 其中,class是声明类的关键字;<类名>是标识符,表示声明的类的名字;类声明体内的函数和变量称为这个类的成员,分别称为成员函数和数据成员。其中,class是声明类的关键字;<类名>是标识符,表示声明的类的名字;类声明体内的函数和变量称为这个类的成员,分别称为成员函数和数据成员。 类的成员函数用于对数据成员进行处理,又称为“方法”,程序中通过类的成员函数来访问其内部的数据成员,成员函数是类与外部程序之间的接口。一般类中成员函数的原型声明写在类定义体内,用以说明该成员函数的形式参数和返回值类型,而成员函数的定义体一般写在类定义之外。通常采用下面的形式定义成员函数: <类型标识符> <类名>::<成员函数名>(<形参表>) { <函数体> }

  8. 例如: • 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; • }

  9. 2.2 对象 类和对象的关系相当于普通数据类型与其变量的关系。类是一种逻辑抽象概念,声明一个类只是定义了一种新的数据类型,对象说明才真正创建了这种数据类型的物理实体。由同一个类创建的各个对象具有完全相同的数据结构,但它们的数据值可能不同。 一旦创建了一个类的对象,程序就可以用运算符“.”来引用类的公有成员,其一般形式为 <对象名>.<公有数据成员名>

  10. <对象名>.<公有成员函数名(实参表)> 例如,前面我们定义一个rectangle类,现在我们定义一个rectangle的对象r1,通过对象r1完成对成员函数area()的调用。 rectangle r1(10,10,20,20); r1.area(); 需要注意,只有用public定义的公有成员才能使用圆点操作符访问,对象中的私有成员是类中隐藏的数据,不允许在类外的程序中被直接访问,只能通过该类的公有成员函数来访问它们。

  11. 2.3 构造函数和析构函数 (1) 构造函数 构造函数是在类中声明的一种特殊的成员函数,作用是在对象被创建时使用特定的值构造对象,将对象初始化为一个特定的状态。 构造函数的名字与它所属的类名相同,被声明为公有函数,且没有任何类型的返回值,在创建对象时被自动调用。 构造函数作为类的一个成员函数,具有一般成员函数所有的特性,它可以访问类的所有数据成员,可以是内联函数,可以带有参数表,还可以带默认的形参值。构造函数也可以重载,以提供初始化类对象的不同方法。

  12. 例如,前面定义的rectangle类的构造函数为 rectangle(int xx,int yy,int w,int h){x = xx; y = yy; weight = w; high = h;} 每个类都必须有构造函数,若类定义时没有定义任何构造函数,编译器会自动生成一个不带参数的缺省构造函数,其形式如下: <类名>::<缺省构造函数名>() { //…… }

  13. (2) 析构函数 一个对象失效时,要调用该对象所属类的析构函数。析构函数的功能是用来释放一个对象的。析构函数本身并不实际删除对象,而是进行系统放弃对象内存之前的清理工作,使内存可用来保存新的数据,它与构造函数的功能正好相反。

  14. 例:构造函数和析构函数的例题。 • #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;} • };

  15. void main () • { • point a(15, 22); • } • 程序的运行结果为: • 构造函数被调用 • 析构函数被调用

  16. 3 使用AppWizard开发MFC应用程序 3.1 生成MFC应用程序框架 例3-1使用MFC AppWizard生成一个简单的MFC应用程序。 建立MFC应用程序框架一般可以通过以下步骤来实现: (1) 启动MFC AppWizard:定义项目名称。在File菜单下选择New,出现如图3-l所示的New对话框。

  17. 图3-1 New对话框

  18. 在图3-1中选择MFC AppWizard[exe],在Project name文本输入框中输入新建的项目名如Mymfc后,单击OK按钮,将弹出MFC AppWizard-Step 1对话框,如图3-2所示。

  19. 图3-2 MFC AppWizard-Step 1对话框

  20. (2)  MFC AppWizard-Step 1对话框:选择应用程序的类型和语言。 在设置好上述选项后,单击Next按钮,将弹出MFC AppWizard-Step 2 对话框,如图3-3所示。

  21. 图3-3 MFC AppWizard-Step 2对话框

  22. (3) MFC AppWizard-Step 2:修改类的信息。 • 在MFC AppWizard-Step 6 of 6对话框中,可以设置向导生成的文件名和类名。 • 在设置好文件名和类名后,单击Finish按钮,将弹出新建工程信息对话框,该对话框列出了关于新建立的应用程序项目文件的相关信息,如图3-4所示。

  23. 图3-4 新建项目信息对话框

  24. (4) 单击图3-4中的OK按钮,应用程序向导所有的工作就全部完成了,这时向导已经为用户生成了一个可执行的应用程序框架,如图3-5所示。

  25. 图3-5 MFC自动生成的应用程序框架

  26. (5) 编译运行。MFC AppWizard已经生成了一个基本的应用程序,Mymfc应用程序的运行结果如图3-6所示。 图3-6 Mymfc应用程序的运行结果

  27. 3.2 查看AppWizard生成的信息 (1) 生成的C++类 • 这里建立的是一个基于文档/视图结构、单文档、无OLE、无数据库选项的最基本的程序框架所需的类(文档/视图结构将在后面详细介绍),所以MFC AppWizard为Mymfc程序生成了四个类。 • CMymfcApp:应用程序类,负责程序的初始化、运行以及结束处理; • CMainFrame:主窗口类,负责主窗口的创建、显示和搜索用户命令以及消息派发; • CMymfcDoc:文档类,负责应用程序文档的装载和维护,文档是应用程序需要保存的任何内容;

  28. CMymfcView:视图类,负责为文档提供一个或几个视图,视图的作用是为显示和修改文档提供人机界面。CMymfcView:视图类,负责为文档提供一个或几个视图,视图的作用是为显示和修改文档提供人机界面。 • 它们的基类及其声明和定义文件如表3-1所示。

  29. 表3-1 MFC AppWizard生成的类

  30. (2) 生成的文件 • AppWizard创建项目时,在指定的\Mymfc目录下创建了许多文件,这些文件包含了框架程序的所有的类、全局变量的声明和定义,如图3-7所示。

  31. 图3-7 \ Mymfc目录下创建的文件

  32. 1) 工作区、项目和类信息文件 • AppWizard生成的应用程序框架是通过项目工作区来管理的。所以,无论选择什么类型的应用程序,AppWizard都要为应用程序生成相应的工作区、项目和类信息文件。本例的工作区、项目和类信息文件如表3-2所示。

  33. 表3-2 Mymfc应用程序的工作区、项目和类信息文件

  34. 2) 应用程序头文件和源文件 • 根据应用程序的类型——单文档、多文档或基于对话框,AppWizard将自动创建一些应用程序源文件和头文件,这些文件分别是应用程序类、对话窗口类等的声明文件和类实现文件。在本例中,AppWizard生成的头文件和源文件如表3-3所示。

  35. 表3-3 Mymfc应用程序的头文件和源文件

  36. 3) 资源文件 • 4) StdAfx.cpp和StdAfx .h 3.3 浏览项目信息与添加代码 • (1) 浏览项目信息 • 前面生成的Mymfc应用程序在项目工作区窗口中显示如图3-8所示。

  37. 图3-8 Mymfc项目工作区窗口

  38. 切换到ClassView中,展开ClassView顶层的文件夹后,显示Mymfc项目中所包含的所有的类。双击CMymfcApp类的图标(或单击图标旁的+号)时,ClassView展开该类并显示其类成员,如图3-9所示。切换到ClassView中,展开ClassView顶层的文件夹后,显示Mymfc项目中所包含的所有的类。双击CMymfcApp类的图标(或单击图标旁的+号)时,ClassView展开该类并显示其类成员,如图3-9所示。

  39. 图3-9 项目Mymfc的类视图

  40. 项目中增减C++类或者在类中增减成员,都可以在ClassView中进行。项目中增减C++类或者在类中增减成员,都可以在ClassView中进行。 • 切换工作区视图到ResourceView,可以看到AppWizard自动为Mymfc程序生成的资源名称和类型,资源类型包括图标、菜单、加速键、工具栏、版本信息等,如图3-10所示。

  41. 图3-10 项目Mymfc的资源视图

  42. (2) 添加代码 • 添加成员变量一般有两种方法: • 第一种方法是利用VC++的可视化编程工具,具体步骤为:在Workspace窗口的ClassView选项卡中选择要添加成员变量的类。右击此类,在弹出菜单中单击Add Member Variable选项,将出现如图3-11所示的Add Member Variable对话框。

  43. 图3-11 Add Member Variable对话框

  44. 4 MFC应用程序框架与Win32程序的关联 4.1 MFC应用程序框架对Win32程序的封装 (1) Windows程序的基本结构 • WinMain(…) • { • WNDCLASS wndclass ; • RegisterClass ( &wndclass); • CreateWindow (…); • ShowWindow (…) ; • UpdateWindow (…); • While (GetMessage (&msg,NULL,0,0))

  45. { • TranslateMessage (&msg); • DispatchMessage (&msg); • } • } • WndProc (hwnd, message, wParam, lParam)

  46. { • switch (message) • { • case … • case WM_DESTROY: • PostQuitMessage (0); • default: • return DefWindowProc (hwnd,message,wParam,lParam); • } • return (0); • }

  47. (2).MFC类对WinMain和WndProc的封装 • 在MFC类中,与应用程序框架相关的类如图3-12所示。

  48. 图3-12 MFC应用程序相关的几个类

  49. 通常在应用程序中,我们直接操作的不是上面这些类,而是以这些类为基类派生出来的类。例如,在Mymfc程序中,AppWizard生成的类与这些类的派生关系如下:通常在应用程序中,我们直接操作的不是上面这些类,而是以这些类为基类派生出来的类。例如,在Mymfc程序中,AppWizard生成的类与这些类的派生关系如下: • 基类派生类 • CWinApp CMymfcApp • CFrameWnd CMainFram • CDocument CMymfcDoc • CView CMymfcView

  50. 4.2 MFC应用程序的启动流程 • 下面是Mymfc程序的启动流程,如图3-13所示。

More Related