6.1.6 在应用程序中处理多个绘图对象 各种不同的绘图方法(矩形、形状、直线等等)通常放在工具栏和按钮面板中。应用程序可单击快速按钮以选取所需的绘图对象。
本节包括: · 跟踪所用的绘图工具。 · 使用快速按钮改变工具。 · 使用绘图工具。
1.跟踪所用的绘图工具 绘图程序需要实时跟踪用户可能要选择使用的绘图工具(如直线、矩形、椭圆形或圆角矩形)。通常,可以声明C++枚举类型来列出可用的绘图工具。因为枚举类型也是类型声明,可以使用C++的类型检查来确认这些值。 例如,下列代码声明枚举类型列出图形应用程序可用的绘图工具:

TDrawingTool类型的一个变量只能分配枚举值dtLine、dtRectangle、dtEllipse或dtRoundRect其中之一。习惯上,类型标识符是以字母T开头的,而一组相似的常数(如上述的枚举值)则以2个字母的前缀字符(如dt表示drawingtool)开头。
下列代码在窗体中添加一个用于跟踪窗体绘图工具的字段:

2.使用快速按钮改变工具 每个绘图工具都需要一个相关的OnClick事件处理程序。假定应用程序对于4个绘图工具(直线、矩形、椭圆形和圆角矩形)各有一个工具栏按钮。可将下列事件处理程序分配给4个绘图工具按钮的OnClick事件,把DrawingTool分别设为适当值:

3.使用绘图工具 当知道所用工具后,还必须指出如何绘制不同的形状。唯一可执行任何绘图操作的方法是鼠标移动和释放鼠标按钮的事件处理程序,且不管所选择的工具为何,都能绘制直线。要使用不同的绘图工具,需用代码指定如何使用所选的工具来绘图。并需将代码加到每个工具的事 件处理程序中。
本部分描述了: · 绘制形状。 · 在事件处理程序中共享程序代码。 (1) 绘制形状 绘制形状和绘制直线一样容易:每个形状都只有单一的状态,只需设置坐标即可。以下是重写的所有4个绘制形状工具的OnMouseUp事件处理程序:
当然,还需要更新事件处理程序来绘制形状:
通常在上例中所有重复的程序代码会包含在不同的例程中。下节将说明如何把绘制形状的代码放在单一的例程中,所有的鼠标事件处理程序都可调用。
(2) 在事件处理程序中共享程序代码 当发现在许多事件处理程序中使用相同代码时,可以把重复的代码移至可让事件处理程序共享的单一例程中,以增强程序的效率。
给窗体增加一个方法的步骤如下: 1) 将方法的声明加到窗体对象中。 可以把声明加到窗体对象声明结尾处的public或private部分。若程序代码只是共享一些事件处理的细节,那么较安全的作法是把共享方法加入private部分。 2) 在窗体单元的.cpp文件中编写方法的实现代码。 方法实现代码的头必须和声明完全匹配,并以相同顺序拥有相同参数。 下列代码给窗体增加一个DrawShape方法,并在每个事件处理程序中调用它。首先,把DrawShape的声明加到窗体对象的声明中:
然后,在窗体单元的.cpp文件中编写DrawShape的实现代码:
修改其他事件处理程序以调用DrawShape。
  
|