C++程序设计:原理与实践(进阶篇)17.8 让图形程序运行起来

简介:

17.8 让图形程序运行起来


我们已经看到了如何创建窗口以及如何在窗口中绘制各种各样的形状。在后续章节中,我们将会看到这些Shape类是如何定义的,以及它们更多的使用方法。

为了使这个图形程序运行起来,还需要其他程序的帮助。除了主函数中已有的代码外,我们还需要编译接口库代码,安装FLTK库(或者所使用的任何GUI系统),并将它与我们的代码正确地链接在一起,才能让这个图形程序运行起来。

我们可以将这个程序看作由4个不同的部分构成:

我们编写的代码(main()函数等);

接口库(Window、Shape、Polygon等);

FLTK库;

C++标准库。

另外,程序还间接用到了操作系统。忽略了操作系统和标准库之后,我们的图形代码的组织结构可描述如下:

 

附录D说明了如何让所有这些组成部分一起运转起来。

17.8.1 源文件

我们的图形和GUI接口库由5个头文件和3个代码文件组成:

头文件:

Point.h;

Window.h;

Simple_window.h;

Graph.h;

GUI.h。

代码文件:

Window.cpp;

Graph.cpp;

GUI.cpp。

在学习第21章之前,你可以忽略GUI文件。

简单练习

本练习是与“Hello, World!”程序有相同功能的一个图形程序,目的是让你熟悉最简单的图形工具。

1. 创建一个空窗口Simple_window,尺寸为600×400,标签为My window,编译这个程序,然后链接并运行。注意:必须以附录D描述的方法链接FLTK库,在代码中包含头文件Graph.h和Simple_window.h,并将Graph.cpp和Window.cpp加入你的项目中。

2. 逐个添加17.7节中的例子,每添加一个就测试一下。

3. 检查并简单修改每个例子(例如颜色、位置、点的数量等)。

思考题

1. 我们为什么要使用图形?

2. 什么时候我们尽量不使用图形?

3. 为什么图形对程序员来说是有趣的?

4. 什么是窗口?

5. 我们的图形接口类(图形库)在哪个名字空间中?

6. 使用我们的图形库实现基本的图形功能,需要哪些头文件?

7. 我们使用的最简单的窗口是怎样的?

8. 什么是最小化的窗口?

9. 窗口标签是什么?

10. 如何设置窗口标签?

11. 屏幕坐标系是如何工作的?窗口坐标系呢?数学中的坐标系呢?

12. 我们能显示的简单“形状”有哪些?

13. 将形状添加到窗口的命令是什么?

14. 你使用哪种基本形状来绘制六边形?

15. 如何在窗口中的某个位置显示文本?

16. 如何将你最好的朋友的照片显示在窗口中(使用你自己编写的程序)?

17. 你创建了一个Window对象,但屏幕上没有显示任何内容,可能的原因有哪些?

18. 你创建了一个形状,但窗口中没有显示任何内容,可能的原因有哪些?

术语

color(颜色) graphics(图形) JPEG

coordinates(坐标) GUI line style(线型)

display(显示) GUI library(GUI库) software layer(软件层)

f?ill color(填充颜色) HTML window(窗口)

FLTK image(图像) XML

习题

我们建议使用Simple_window完成下面的练习。

1. 分别用Rectangle和Polygon绘制矩形,并将Polygon的边设置为红色,Rectangle的边设置为蓝色。

2. 绘制一个100×30的Rectangle,并在其内显示文本“Howdy!”。

3. 绘制你名字的首字母,高度为150个像素,使用粗线,每个字母使用不同的颜色。

4. 绘制一个3×3的红白交替的井字棋棋盘。

5. 在矩形周围绘制一个1/4英寸宽的红色框,矩形的高度为屏幕高度的3/4,宽度为屏幕宽度的2/3。

6. 当绘制的Shape不能完全放在窗口内时会发生什么现象?当绘制的窗口不能完全置于屏幕内时又会发生什么现象?编写两个程序说明这两种现象。

7. 绘制一个二维的房屋正视图,包括一个门、两个窗户、带烟囱的屋顶,可以随意添加其他的细节,比如从烟囱“冒烟”等。

8. 绘制奥林匹克五环旗。如果你记不得颜色了,请查找相关资料。

9. 在屏幕上显示一个图像,例如一个朋友的照片,并使用窗口标题和窗口内的描述文字进行说明。

10. 绘制17.8节中的文件结构图。

11. 由外向内绘制一系列正多边形,最里面的是一个等边三角形,外边是一个正方形,再外边是一个正五边形,依此类推。数学专业的人士请注意:让N-边形的所有顶点都落在(N+1)-边形的边上。提示:三角函数被包含在<cmath>中(参见24.8节和附录C9.2)。

12. 超椭圆是一个由下面的方程定义的二维形状:

 

请在互联网上查找超椭圆,以便对这种形状有更感性的认识。编写程序,通过连接超椭圆上的点构成“星状”模式。程序接受参数a、b、m、n和N,在由a、b、m和n定义的超椭圆上选择N个等间隔(按某种“等间隔”的定义)的点,然后将每个点连接到其他一个或多个点(可以用一个参数k之处连接的点数,或者直接使用N-1,即连接其他所有点)。

13. 设计一种为上一题中的超椭圆形状添加颜色的方法。可以为某些线指定一种颜色,其他线使用另一种或另几种颜色。

附言

理想的程序设计是将我们的概念直接表示为程序中的实体。因此,我们通常使用类表示思想,使用类对象表示现实世界的实体,使用函数表示行为和计算。这种思路显然可以用于图形领域。当我们有了概念,例如圆和多边形,就可以在程序中用Circle类和Polygon类来表示。图形应用的不同寻常之处在于,当我们编写图形程序时,还有机会在屏幕上看到那些类对象。也就是说,程序状态可以直接呈现出来,供我们观察,而在大多数应用中我们是没这么幸运的。思想、代码和输出的直接对应是图形程序设计如此有吸引力的重要原因。不过,请记住,图形只是体现了在代码中使用类直接表达概念的思想而已。这种思想才是最重要的,它非常有效、通用:我们想到的任何东西都可以在代码中用类、类对象或者一组类来描述。

 

相关文章
|
2月前
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
158 77
|
2月前
|
存储 C++
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
【数据结构——树】哈夫曼树(头歌实践教学平台习题)【合集】目录 任务描述 相关知识 测试说明 我的通关代码: 测试结果:任务描述 本关任务:编写一个程序构建哈夫曼树和生成哈夫曼编码。 相关知识 为了完成本关任务,你需要掌握: 1.如何构建哈夫曼树, 2.如何生成哈夫曼编码。 测试说明 平台会对你编写的代码进行测试: 测试输入: 1192677541518462450242195190181174157138124123 (用户分别输入所列单词的频度) 预
71 14
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
|
2月前
|
存储 C++ 索引
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】初始化队列、销毁队列、判断队列是否为空、进队列、出队列等。本关任务:编写一个程序实现环形队列的基本运算。(6)出队列序列:yzopq2*(5)依次进队列元素:opq2*(6)出队列序列:bcdef。(2)依次进队列元素:abc。(5)依次进队列元素:def。(2)依次进队列元素:xyz。开始你的任务吧,祝你成功!(4)出队一个元素a。(4)出队一个元素x。
52 13
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
|
2月前
|
C++ 芯片
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
74 19
|
2月前
|
存储 编译器 数据安全/隐私保护
【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。​ 相关知识 类的声明和使用。 类的声明和对象的声明。 构造函数和析构函数的执行。 一、类的声明和使用 1.类的声明基础 在C++中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下: classMyClass{ public: int
64 13
|
2月前
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
60 12
|
2月前
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
58 10
|
2月前
|
算法 C++
【C++数据结构——图】最小生成树(头歌实践教学平台习题) 【合集】
【数据结构——图】最小生成树(头歌实践教学平台习题)目录 任务描述 相关知识 测试说明 我的通关代码: 测试结果:【合集】任务描述 本关任务:编写一个程序求图的最小生成树。相关知识 为了完成本关任务,你需要掌握:1.建立邻接矩阵,2.Prim算法。建立邻接矩阵 上述带权无向图对应的二维数组,根据它建立邻接矩阵,如图1建立下列邻接矩阵。注意:INF表示无穷大,表示整数:32767 intA[MAXV][MAXV];Prim算法 普里姆(Prim)算法是一种构造性算法,从候选边中挑
48 10
|
2月前
|
存储 算法 C++
【C++数据结构——图】图的邻接矩阵和邻接表的存储(头歌实践教学平台习题)【合集】
本任务要求编写程序实现图的邻接矩阵和邻接表的存储。需掌握带权有向图、图的邻接矩阵及邻接表的概念。邻接矩阵用于表示顶点间的连接关系,邻接表则通过链表结构存储图信息。测试输入为图的顶点数、边数及邻接矩阵,预期输出为Prim算法求解结果。通关代码提供了完整的C++实现,包括输入、构建和打印邻接矩阵与邻接表的功能。
53 10
|
2月前
|
C++
【C++数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】
【数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】(1)遇到左括号:进栈Push()(2)遇到右括号:若栈顶元素为左括号,则出栈Pop();否则返回false。(3)当遍历表达式结束,且栈为空时,则返回true,否则返回false。本关任务:编写一个程序利用栈判断左、右圆括号是否配对。为了完成本关任务,你需要掌握:栈对括号的处理。(1)遇到左括号:进栈Push()开始你的任务吧,祝你成功!测试输入:(()))
43 7