📄 chap391.htm
字号:
<p>(1) 在表格上加入TPanel元件。
<ol START="2">
<li>设定TPanel的Align性质为 alTop。因为我们希望工具列置於表格上方,所以将它设定为浮贴於表格的上方。如此一来当表格大小改变时,工具列的宽度为跟着改变,而高度则维持原先的高度。</li>
<li VALUE="3">将TSpeedButton加入TPanel原件上。</li>
</ol>
<p>你可以在表格中加入多个上述的工具列,它们会依序自动排列於表格的上方,因此你不需费心去处理这些额外的动作。</p>
<p>04-01 TSpeedButton 元件解析及设定</p>
<p>ToolBar的几个基本要素是:</p>
<p>(1) 代表该功能的图形。</p>
<p>(2) 可依状况切换其状态。
<ol START="3">
<li>当使用者点取该功能时,必须执行该功能。</li>
</ol>
<p>我们来看看TSpeedButton如何达到以上的要求。</p>
<p>首先,TSpeedButton具备Glyph性质,可以指定其图形,所以第一个要求不成问题,再来TSpeedButton具备以下叁种状态:
<ul>
<li>一般按钮的功能。</li>
<li>可以除能/致能。</li>
<li>具备群组特性。(也就是说同一群组的TSpeedButton会互相影响,因此可轻易做出互斥的功能,以绘图程式为例,一次只能使用一种工具,因此当使用者选取工具时,除了被选取的工具之外,其他的工具应该都呈浮起状态)</li>
</ul>
<p>由上可知,TSpeedButton确实是实作ToolBar的适当人选。</p>
<p>04-02将SpeedButton加入ToolBar</p>
<p>依照我们先前的需求,我们需要一个可以切换绘图工具的工具列,因此我们就照前面所说的方式来完成它。</p>
<p><img SRC="Image14.gif" WIDTH="464" HEIGHT="35"></p>
<p>图07工具列</p>
<p>图07就是我所加入的SpeedButton,除此之外还有几个程序必须完成
<ul>
<li>为SpeedButton命名。取一个有意义的名字。</li>
<li>依需要设定其高度及位置。</li>
<li>设定图形。</li>
<li>设定SpeedButton状态初值。</li>
<li>设定群组特性。</li>
</ul>
<p>◎ 设定事件处理函式。</p>
<p>SpeedButton的命名原则和一般变数的命名原则相同,简单明了就好。以本程式为例,我们就可以LineButton、RectangleButton等名字命名之。命名时只要改变SpeedButton的Name性质即可。</p>
<p>至於设定图形,只要先选取该SpeedButton,然後至物件检视器点取Glyph性质,然後将欲选取的点阵图Load进来,即可完成设定图形的程序了。</p>
<p><img SRC="Image15.gif" WIDTH="294" HEIGHT="254"></p>
<p>图08 Glyph图形之选取。</p>
<p>设定状态初值:由於我们希望本程式执行的初始值是使用CLine元件,因此我将LineButton的Down属性为True,其馀则为
False。</p>
<p><img SRC="Image16.gif" WIDTH="464" HEIGHT="35"></p>
<p>图09选取後的状态</p>
<p>设定群组特性:群组特性是SpeedButton用以实作出ToolBar的重要功能之一。我们可以将一群SpeedButton设为同一群组,如此一来在此一群组的SpeedButton就具备了互斥特性,也就是说在任何一个SpeedButton按下时,会导致其他的SpeedButton浮起。此为实作ToolBar的必备条件,而利用SpeedButton可以轻易达成此目的。</p>
<p>设定群组特性其实很简单,只要把该群组的SpeedButton的Groupindex性质设为相同数字即可,在此例中我们希望将所有绘图工具列按钮设为同一群组,因此我把该相关工具的Groupindex性质都设为1。</p>
<p>另外,相信你已经发现在上面的工具列中,除了前面所谈到的绘图工具之外,我还多加了两个额外的SpeedButton
,它们是用来设定笔及笔刷的工具。在此例中,我们是以它来叫出另外两个设定笔及笔刷的工具列,因此它必须具备所谓Toggle
On/Off的开关功能。也就是类似CheckBox的功能。</p>
<p>SpeedButton也可轻易达到以上的要求,只要设定该SpeedButton的AllowAllUp属性为True即可以做到此功能。</p>
<p>最後我们必须将设定笔及笔刷的两个SpeedButton,PenButton及BrushButton的Groupindex分别设为
2、3,如此才不会和绘图工具的SpeedButton的群组特性相干扰。</p>
<p>05工具列的事件处理函式</p>
<p>完成的工具列的设定之後,接着我们要设定工具列的处理函式,由於此工具列是用来切换绘图工具的,因此我们只要处理SpeedButton的OnClick事件,再分别根据不同的事件做处理即可。</p>
<p>在此例中,OnClick的事件处理函式其很简单,只要删除原来使用的绘图工具物件,再重新启始一个新的绘图工具即可。</p>
<p>//---------------------------------------------------------------------</p>
<p>void __fastcall TGraphEx::LineButtonClick(TObject *Sender)</p>
<p>{</p>
<p> delete m_pObj;</p>
<p> m_pObj = new CLine(Canvas);</p>
<p>}</p>
<p>//---------------------------------------------------------------------</p>
<p>void __fastcall TGraphEx::PolylineButtonClick(TObject *Sender)</p>
<p>{</p>
<p> delete m_pObj;</p>
<p> m_pObj = new CPolyline(Canvas);</p>
<p>}</p>
<p>//---------------------------------------------------------------------</p>
<p>void __fastcall TGraphEx::PolygonButtonClick(TObject *Sender)</p>
<p>{</p>
<p> delete m_pObj;</p>
<p> m_pObj = new CPolygon(Canvas);</p>
<p>}</p>
<p>//---------------------------------------------------------------------</p>
<p>void __fastcall TGraphEx::RectangleButtonClick(TObject *Sender)</p>
<p>{</p>
<p> delete m_pObj;</p>
<p> m_pObj = new CRectangle(Canvas);</p>
<p>}</p>
<p>//---------------------------------------------------------------------</p>
<p>void __fastcall TGraphEx::EllipseButtonClick(TObject *Sender)</p>
<p>{</p>
<p> delete m_pObj;</p>
<p> m_pObj = new CEllipse(Canvas);</p>
<p>}</p>
<p>//---------------------------------------------------------------------</p>
<p>void __fastcall TGraphEx::RoundRectButtonClick(TObject *Sender)</p>
<p>{</p>
<p> delete m_pObj;</p>
<p> m_pObj = new CRoundRect(Canvas);</p>
<p>}</p>
<p>//---------------------------------------------------------------------</p>
<p>在完成了以上的设定之後,此程式就具备了利用绘图工具列来切换绘图工具的功能。</p>
<p><img SRC="Image17.gif" WIDTH="460" HEIGHT="382"></p>
<p>图10具备绘图工具列的绘图程式范例。</p>
</font>
<p align="right"><font SIZE="2"><!--webbot bot="ImageMap" rectangle="(40,1) (71, 23) ../ch4/chap04.htm" rectangle="(4,1) (36, 23) chap39.htm" src="../ch1/NextBack.gif" width="72" height="24" alt="NextBack.gif (743字节)" border="0" startspan --><MAP NAME="FrontPageMap1"><AREA SHAPE="RECT" COORDS="40, 1, 71, 23" HREF="../ch4/chap04.htm"><AREA SHAPE="RECT" COORDS="4, 1, 36, 23" HREF="chap39.htm"></MAP><a href="../../../_vti_bin/shtml.exe/program/C++/ch3/chap391.htm/map1"><img ismap usemap="#FrontPageMap1" border="0" height="24" alt="NextBack.gif (743字节)" src="../ch1/NextBack.gif" width="72"></a><!--webbot bot="ImageMap" endspan i-checksum="1093" --></font></p>
<font SIZE="2">
<p><small><a href="../../../index.htm">首页</a> >> <a href="../../program.htm">程序设计</a>
>> <a href="../cbuilder.htm">C++ Builder</a> >> </small><font>具体而微的绘图程式</font>·小结</p>
</font>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -