📄 00000002.htm
字号:
<BR>void __fastcall TForm1::FormClose(TObject *Sender, <BR>TCloseAction &Action) <BR>{ <BR>delete m_pObj; <BR>} <BR> <BR>// 更改後的OnMouseDown物件处理函式。 <BR>// 1.将m_bDraw旗标设为 TRUE。 <BR>// 2.呼叫绘图物件的OnMouseDown函式。 <BR>void __fastcall TForm1::FormMouseDown(TObject *Sender, <BR>TMouseButton Button, <BR>TShiftState Shift, int X, int Y) <BR>{ <BR>m_bDraw = TRUE; <BR>m_pObj->OnMouseDown(X,Y); <BR>} <BR> <BR>// 更改後的OnMouseMove物件处理函式。 <BR>// 1.判断m_bDraw旗标是否为 TRUE。 <BR>// 2.若是则呼叫绘图物件的OnMouseMove函式。 <BR> <BR>void __fastcall TForm1::FormMouseMove(TObject *Sender, <BR>TShiftState Shift, <BR>int X, int Y) <BR>{ <BR>if (m_bDraw) <BR>m_pObj->OnMouseMove(X,Y); <BR>} <BR> <BR>// 更改後的OnMouseUp物件处理函式。 <BR>// 1.将m_bDraw旗标设为 FALSE。 <BR>// 2.若是则呼叫绘图物件的OnMouseUp函式。 <BR> <BR>void __fastcall TForm1::FormMouseUp(TObject *Sender, <BR>TMouseButton Button, <BR>TShiftState Shift, int X, int Y) <BR>{ <BR>m_bDraw = FALSE; <BR>m_pObj->OnMouseUp(X,Y); <BR>} <BR> <BR>瞧!这就是更改後的程式,是不是变得格外简洁呢?除此之外, <BR>它最大的优点在於,无论我们日後加入了多少绘图物件,你都 <BR>不需再修改以上程式中关於绘图物件的处理部份,只要再自行 <BR>增加一个物件宣告即可。和原先Borland公司产品内附由Object <BR>Pascal修改而来的范例,它的C++ 血统纯正多了。而且若是 <BR>日後你想要将其修改成为一个物件式的绘图系统,也只需要很 <BR>简单的修改而已。 <BR> <BR>好吧!让我们先检阅现在的成果。 <BR> <BR> <BR>图XX-04 CLine绘图物件范例。 <BR> <BR>图XX-05 CPolyline绘图物件范例(将程式改成new CPolyline) <BR> <BR>XX-04 工具列(ToolBar)的使用 <BR> <BR>到目前为止我们已经将所有绘图物件定义完成,因此理论上你 <BR>的程式应该可以画出各种不同的绘图物件了。但是前面我提 <BR>到,目前我们尚未将绘图物件的选择功能实作出来,因此我们 <BR>是以直接修改程式的方式来绘制不同的图形。这是为了说明方 <BR>便的权宜之计。 <BR> <BR>在一般的绘图程式中都是以工具列的方式来实作出绘图功能的 <BR>切换功能,如Windows 95内的小画家即是一典型例子。因此 <BR>接下来我就为你说明在C++ <BR>Builder中实作出工具列的方法。 <BR> <BR> <BR>图XX-06小画家使用的工具列 <BR> <BR>在C++ Builder中实作工具列的方式和其他的程式如Visual <BR>C++,Borland C++ 不同。後两者都是直接使用Windows <BR>95内建的工具列型别来达到此功能。然而在C++ Builder中因 <BR>为有一种更为简单且直接的方式来做到,因此就不采用上述作 <BR>法 (当然C++ <BR>Builder也可以用Windows 95内建的ToolBar型别,只是用法 <BR>较为复杂。)。 <BR> <BR>那麽在C++ Builder中是如何来实作出工具列呢?说穿了其实 <BR>很简单:那就是利用TPanel和TSpeedButton。 <BR> <BR>CPanel是一个多功能的容器元件,因此我们可以用它来做为工 <BR>具列的平台,使用CPanel是因为它是少数几个可做为容器元 <BR>件的元件,所以它会自动调整置於其上的软体元件的位置,因 <BR>此很适合做为放置工具列的平台。 <BR> <BR>注:在C++ Builder的程式模式中大量使用TPanel来做为容 <BR>器元件。它除了可以做为ToolBar的平台外,另外如状态列 <BR>(StatusBar)也可以用它来完成,而且它也可以用来做为画面 <BR>分割的工具,来达成在MFC中类似分割视窗(Splitter Window) <BR>效果。 <BR> <BR>TSpeedButton快速按钮元件在功能上本来就和工具列有几分类 <BR>似,现在我们可以将相同属性的快速按钮元件整合在一个 <BR>TPanel中即可完成我们所要的工具列了。 <BR> <BR>最後我再将工具列的作法按部就班详述之: <BR> <BR>(1) 在表格上加入TPanel元件。 <BR> 设定TPanel的Align性质为 <BR> alTop。因为我们希望工具列置於表格上方,所以将它设 <BR>定为浮贴於表格的上方。如此一来当表格大小改变时,工具列 <BR>的宽度为跟着改变,而高度则维持原先的高度。 <BR> 将TSpeedButton加入TPanel原件上。 <BR> <BR>你可以在表格中加入多个上述的工具列,它们会依序自动排列 <BR>於表格的上方,因此你不需费心去处理这些额外的动作。 <BR> <BR>XX-04-01 TSpeedButton 元件解析及设定 <BR> <BR>ToolBar的几个基本要素是: <BR>(1) 代表该功能的图形。 <BR>(2) 可依状况切换其状态。 <BR> 当使用者点取该功能时,必须执行该功能。 <BR> <BR>我们来看看TSpeedButton如何达到以上的要求。 <BR> <BR>首先,TSpeedButton具备Glyph性质,可以指定其图形,所以 <BR>第一个要求不成问题,再来TSpeedButton具备以下三种状态: <BR> <BR> 一般按钮的功能。 <BR> 可以除能/致能。 <BR> 具备群组特性。(也就是说同一群组的TSpeedButton会互 <BR>相影响,因此可轻易做出互斥的功能,以绘图程式为例,一次 <BR>只能使用一种工具,因此当使用者选取工具时,除了被选取的 <BR>工具之外,其他的工具应该都呈浮起状态) <BR> <BR>由上可知,TSpeedButton确实是实作ToolBar的适当人选。 <BR> <BR>XX-04-02将SpeedButton加入ToolBar <BR> <BR>依照我们先前的需求,我们需要一个可以切换绘图工具的工具 <BR>列,因此我们就照前面所说的方式来完成它。 <BR> <BR> <BR>图XX-07工具列 <BR> <BR>图XX-07就是我所加入的SpeedButton,除此之外还有几个程 <BR>序必须完成 <BR> 为SpeedButton命名。取一个有意义的名字。 <BR> 依需要设定其高度及位置。 <BR> 设定图形。 <BR> 设定SpeedButton状态初值。 <BR> 设定群组特性。 <BR>◎ 设定事件处理函式。 <BR> <BR>SpeedButton的命名原则和一般变数的命名原则相同,简单明 <BR>了就好。以本程式为例,我们就可以LineButton、 <BR>RectangleButton等名字命名之。命名时只要改变SpeedButton <BR>的Name性质即可。 <BR> <BR>至於设定图形,只要先选取该SpeedButton,然後至物件检视 <BR>器点取Glyph性质,然後将欲选取的点阵图Load进来,即可 <BR>完成设定图形的程序了。 <BR> <BR> <BR>图XX-08 Glyph图形之选取。 <BR> <BR>设定状态初值:由於我们希望本程式执行的初始值是使用CLine <BR>元件,因此我将LineButton的Down属性为True,其馀则为 <BR>False。 <BR> <BR>图XX-09选取後的状态 <BR> <BR>设定群组特性:群组特性是SpeedButton用以实作出ToolBar <BR>的重要功能之一。我们可以将一群SpeedButton设为同一群组, <BR>如此一来在此一群组的SpeedButton就具备了互斥特性,也就 <BR>是说在任何一个SpeedButton按下时,会导致其他的 <BR>SpeedButton浮起。此为实作ToolBar的必备条件,而利用 <BR>SpeedButton可以轻易达成此目的。 <BR> <BR>设定群组特性其实很简单,只要把该群组的SpeedButton的 <BR>GroupIndex性质设为相同数字即可,在此例中我们希望将所有 <BR>绘图工具列按钮设为同一群组,因此我把该相关工具的 <BR>GroupIndex性质都设为1。 <BR> <BR>另外,相信你已经发现在上面的工具列中,除了前面所谈到的 <BR>绘图工具之外,我还多加了两个额外的SpeedButton <BR>,它们是用来设定笔及笔刷的工具。在此例中,我们是以它来 <BR>叫出另外两个设定笔及笔刷的工具列,因此它必须具备所谓 <BR>Toggle <BR>On/Off的开关功能。也就是类似CheckBox的功能。 <BR> <BR>SpeedButton也可轻易达到以上的要求,只要设定该 <BR>SpeedButton的AllowAllUp属性为True即可以做到此功能。 <BR> <BR>最後我们必须将设定笔及笔刷的两个SpeedButton,PenButton <BR>及BrushButton的GroupIndex分别设为 <BR>2、3,如此才不会和绘图工具的SpeedButton的群组特性相干 <BR>扰。 <BR> <BR>XX-05工具列的事件处理函式 <BR> <BR>完成的工具列的设定之後,接着我们要设定工具列的处理函 <BR>式,由於此工具列是用来切换绘图工具的,因此我们只要处理 <BR>SpeedButton的OnClick事件,再分别根据不同的事件做处理 <BR>即可。 <BR> <BR>在此例中,OnClick的事件处理函式其很简单,只要删除原来 <BR>使用的绘图工具物件,再重新启始一个新的绘图工具即可。 <BR> <BR>//---------------------------------------------------- <BR>----------------- <BR>void __fastcall TGraphEx::LineButtonClick(TObject <BR>*Sender) <BR>{ <BR>delete m_pObj; <BR>m_pObj = new CLine(Canvas); <BR>} <BR>//---------------------------------------------------- <BR>----------------- <BR>void __fastcall TGraphEx::PolylineButtonClick(TObject <BR>*Sender) <BR>{ <BR>delete m_pObj; <BR>m_pObj = new CPolyline(Canvas); <BR>} <BR>//---------------------------------------------------- <BR>----------------- <BR>void __fastcall TGraphEx::PolygonButtonClick(TObject <BR>*Sender) <BR>{ <BR>delete m_pObj; <BR>m_pObj = new CPolygon(Canvas); <BR>} <BR>//---------------------------------------------------- <BR>----------------- <BR>void __fastcall TGraphEx::RectangleButtonClick(TObject <BR>*Sender) <BR>{ <BR>delete m_pObj; <BR>m_pObj = new CRectangle(Canvas); <BR>} <BR>//---------------------------------------------------- <BR>----------------- <BR>void __fastcall TGraphEx::EllipseButtonClick(TObject <BR>*Sender) <BR>{ <BR>delete m_pObj; <BR>m_pObj = new CEllipse(Canvas); <BR>} <BR>//---------------------------------------------------- <BR>----------------- <BR>void __fastcall TGraphEx::RoundRectButtonClick(TObject <BR>*Sender) <BR>{ <BR>delete m_pObj; <BR>m_pObj = new CRoundRect(Canvas); <BR>} <BR>//---------------------------------------------------- <BR>----------------- <BR> <BR>在完成了以上的设定之後,此程式就具备了利用绘图工具列来 <BR>切换绘图工具的功能。 <BR> <BR>图XX-10具备绘图工具列的绘图程式范例。 <BR> <BR>-- <BR> <BR> 面对未知的世界因恐惧而发抖 <BR> <BR> <BR> <BR> <BR> <BR>※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 166.111.49.104] <BR><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -