图XX-01XX-02-02 OnMouseMove事件的处理 在加上了OnMouseDown及OnMouseUp处理函式之後,我们只能画出一条条直线,若是我们想要以滑鼠画出不规则线段时,就必须再处理OnMouseMove事件,利用OnMouseMove事件,我们可以追纵到滑鼠移动的位置,简单的OnMouseMove事件处理函式如下: void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift, int X,int Y){Canvas->LineTo(X,Y);} 此程式的意义即在於将滑鼠所经过的每个点,以线条连接起来,在加上OnMouseMove 事件处理函式之後,它的执行结果会变成图XX-02:
图XX-02XX-02-03 滑鼠的处理的加强 前面的程式对於滑鼠的移动处理有部份考虑的不够周详,因为它在滑鼠移动时不分青红皂白就将线画在萤慕上,造成萤幕上的线条混乱,这并不是正规的处理方法,正确的处理方法应该如下: (1) 滑鼠键按下时,将记录滑鼠按下的旗标设为True.同时将该点记录下来,谓之原点。
XX-03 绘图物件的定义 至目前为止,我们已经完成了一个简单的涂鸦程式,接下来,我希望将程式扩充为一个一般的绘图程式,它必须具备基本的画线、画圆、画方等功能。为了要实作出这些功能,我们必须先定义我们的绘图物件。 XX-03-01 绘图物件之始CShape class CShape
图XX-04 CLine绘图物件范例。
图XX-05 CPolyline绘图物件范例(将程式改成new CPolyline) XX-04 工具列(ToolBar)的使用 到目前为止我们已经将所有绘图物件定义完成,因此理论上你的程式应该可以画出各种不同的绘图物件了。但是前面我提到,目前我们尚未将绘图物件的选择功能实作出来,因此我们是以直接修改程式的方式来绘制不同的图形。这是为了说明方便的权宜之计。 在一般的绘图程式中都是以工具列的方式来实作出绘图功能的切换功能,如Windows 95内的小画家即是一典型例子。因此接下来我就为你说明在C++ Builder中实作出工具列的方法。
图XX-06小画家使用的工具列 在C++ Builder中实作工具列的方式和其他的程式如Visual C++,Borland C++ 不同。後两者都是直接使用Windows 95内建的工具列型别来达到此功能。然而在C++ Builder中因为有一种更为简单且直接的方式来做到,因此就不采用上述作法 (当然C++ Builder也可以用Windows 95内建的ToolBar型别,只是用法较为复杂。)。 那麽在C++ Builder中是如何来实作出工具列呢?说穿了其实很简单:那就是利用TPanel和TSpeedButton。 CPanel是一个多功能的容器元件,因此我们可以用它来做为工具列的平台,使用CPanel是因为它是少数几个可做为容器元件的元件,所以它会自动调整置於其上的软体元件的位置,因此很适合做为放置工具列的平台。 注:在C++ Builder的程式模式中大量使用TPanel来做为容器元件。它除了可以做为ToolBar的平台外,另外如状态列 (StatusBar)也可以用它来完成,而且它也可以用来做为画面分割的工具,来达成在MFC中类似分割视窗(Splitter Window)效果。 TSpeedButton快速按钮元件在功能上本来就和工具列有几分类似,现在我们可以将相同属性的快速按钮元件整合在一个TPanel中即可完成我们所要的工具列了。 最後我再将工具列的作法按部就班详述之: (1) 在表格上加入TPanel元件。
图XX-08 Glyph图形之选取。 设定状态初值:由於我们希望本程式执行的初始值是使用CLine元件,因此我将LineButton的Down属性为True,其馀则为 False。
图XX-10具备绘图工具列的绘图程式范例。新闻热点
疑难解答