17.3 第一个例子
我们的目标是定义一些类,能够用来创建可以在屏幕上显示的对象。例如,我们希望绘制一个由一系列相连的线构成的图形,下面程序给出了一个非常简单的版本:
运行该程序,屏幕显示如下。
我们来逐行分析这个程序,看看它做了什么。它首先包含图形接口库的头文件:
接着,在main()函数的开始处告知编译器在Graph_lib中查找图形工具:
然后,定义一个点作为窗口的左上角:
接下来在屏幕上创建一个窗口:
我们使用Graph_lib接口库中一个名为Simple_window的类表示窗口,此处定义了一个名为win的Simple_window对象,即win是Simple_window类的变量。初始化列表中的值将窗口win的左上角设置为tl,宽度和高度分别设置为600像素和400像素。我们随后会介绍更多细节,但此处的关键点就是通过给定宽度和高度来定义一个矩形。字符串Canvas用于标识该窗口,你可以在窗口框左上角的位置看到Canvas字样。
接下来,我们在窗口中放置一个对象:
我们定义了一个多边形对象poly,并向其添加顶点。在我们的图形库中,一个Polygon对象开始为空,可以向其中添加任意多个顶点。由于我们添加了三个顶点,因此得到了一个三角形。一个点是一个值对,给出了点在窗口内的x和y(水平和垂直)坐标。
纯粹是为了展示图形库的功能,我们接下来将多边形的边染为红色:
最后,我们将poly添加到窗口win:
如果程序执行得不是那么快的话,你会注意到,到现在为止,屏幕上没有任何显示,是的,什么都没有。我们创建了一个窗口(确切地说,是Simple_window类的一个对象),创建了一个多边形(名为poly)并将其染为红色(Color::red),最后将其添加到窗口(名为win),但我们还没有要求在屏幕上显示此窗口。显示操作由程序的最后一行代码来完成:
为了让GUI系统在屏幕上显示一个对象,你必须将控制权交给“系统”。wait_for_button()就是完成这个功能,另外,它还等待用户按下(点击)窗口中的“Next”按钮,以便执行下面的程序。这样,在程序结束和窗口消失之前,你就有机会看到窗口中的内容。当你按下按钮后,程序会结束,关闭该窗口。
单独地看这个窗口,效果如下图所示:
你可能注意到,我们小小地“作弊”了一下。标记为“Next”的按钮是从哪里来的?实际上它是Simple_window类内置的。在第21章中,我们将会从Simple_window类过渡到“普通”的Window类,它不包含任何可能造成混淆的内置功能。那时,我们还会介绍如何编写代码来控制与窗口的交互。
在接下来的三章里,当希望逐阶段(一帧一帧)地显示信息时,我们将简单地使用“Next”按钮来实现显示画面的转换。
对于操作系统为每个窗口添加窗口框(frame),你应该非常熟悉了,但可能没有特别留意过。不过,本章和后面章节中的图片都是在微软Windows系统下生成的,因此你“免费”得到了窗口框右上角的三个常用按钮。这些按钮是很有用的:如果你的程序变得杂乱无章(在调试过程中确实有可能出现这种情况),可以点击×按钮结束程序。当你在其他系统上运行程序时,根据系统惯例的不同,添加的窗口框也可能有所不同。在上面的示例程序中,我们对窗口框所做的仅仅是设置了一个标签(即Canvas)。