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

 

相关文章
|
21天前
|
存储 缓存 算法
【C/C++ 性能优化】提高C++程序的缓存命中率以优化性能
【C/C++ 性能优化】提高C++程序的缓存命中率以优化性能
110 0
|
23天前
|
存储 安全 编译器
【C++ 17 新功能 std::visit 】深入解析 C++17 中的 std::visit:从原理到实践
【C++ 17 新功能 std::visit 】深入解析 C++17 中的 std::visit:从原理到实践
69 0
|
22天前
|
监控 Linux 编译器
Linux C++ 定时器任务接口深度解析: 从理论到实践
Linux C++ 定时器任务接口深度解析: 从理论到实践
63 2
|
22天前
|
设计模式 算法 中间件
【C/C++ CommonAPI入门篇】深入浅出:CommonAPI Core与CommonAPI DBus的协同工作原理
【C/C++ CommonAPI入门篇】深入浅出:CommonAPI Core与CommonAPI DBus的协同工作原理
50 0
|
22天前
|
存储 并行计算 算法
C++动态规划的全面解析:从原理到实践
C++动态规划的全面解析:从原理到实践
89 0
|
22天前
|
存储 算法 C语言
【C/C++ 数据结构 树】探索C/C++中的二叉树:从理论到实践
【C/C++ 数据结构 树】探索C/C++中的二叉树:从理论到实践
60 0
|
20天前
|
存储 C++ 容器
C++入门指南:string类文档详细解析(非常经典,建议收藏)
C++入门指南:string类文档详细解析(非常经典,建议收藏)
31 0
|
20天前
|
存储 编译器 C语言
C++入门: 类和对象笔记总结(上)
C++入门: 类和对象笔记总结(上)
30 0
|
1天前
|
C++
【C++成长记】C++入门 | 类和对象(下) |Static成员、 友元
【C++成长记】C++入门 | 类和对象(下) |Static成员、 友元
|
1天前
|
存储 编译器 C++
【C++成长记】C++入门 | 类和对象(中) |拷贝构造函数、赋值运算符重载、const成员函数、 取地址及const取地址操作符重载
【C++成长记】C++入门 | 类和对象(中) |拷贝构造函数、赋值运算符重载、const成员函数、 取地址及const取地址操作符重载

热门文章

最新文章