📄 chap35.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
<title>绘图物件的定义</title>
<link rel="stylesheet" href="../../../include/style.css">
</head>
<body>
<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>
<p align="left"><!--webbot bot="ImageMap" rectangle="(40,1) (71, 23) chap36.htm" rectangle="(4,1) (36, 23) chap34.htm" src="../ch1/NextBack.gif" width="72" height="24" alt="NextBack.gif (743字节)" border="0" startspan --><MAP NAME="FrontPageMap"><AREA SHAPE="RECT" COORDS="40, 1, 71, 23" HREF="chap36.htm"><AREA SHAPE="RECT" COORDS="4, 1, 36, 23" HREF="chap34.htm"></MAP><a href="../../../_vti_bin/shtml.exe/program/C++/ch3/chap35.htm/map"><img ismap usemap="#FrontPageMap" border="0" height="24" alt="NextBack.gif (743字节)" src="../ch1/NextBack.gif" width="72"></a><!--webbot bot="ImageMap" endspan i-checksum="23320" --></p>
</font><p><font SIZE="2"></font><font color="#FF0000" SIZE="2">·03绘图物件的定义</font></p><font SIZE="2">
<p>至目前为止,我们已经完成了一个简单的涂鸦程式,接下来,我希望将程式扩充为一个一般的绘图程式,它必须具备基本的画线、画圆、画方等功能。为了要实作出这些功能,我们必须先定义我们的绘图物件。</p>
<p>03-01绘图物件之始CShape</p>
<p>class CShape</p>
<p>{</p>
<p> protected:</p>
<p> TCanvas* m_pCanvas;</p>
<p> TColor m_Color;</p>
<p> int m_nWidth;</p>
<p> public:</p>
<p> CShape(TCanvas* pCanvas) {m_pCanvas = pCanvas;}</p>
<p> virtual ~CShape() {}</p>
<p> virtual void OnMouseMove(int,int)=0;</p>
<p> virtual void OnMouseDown(int,int)=0;</p>
<p> virtual void OnMouseUp(int,int)=0;</p>
<p>};</p>
<p>我们首先定义一个CShape类别,它是所有绘图物件之始,也因此它定义了一个绘图物件的基本行为。在此绘图程式中我希望它可以处理叁个不同的滑鼠事件并加以处理之,所以我在CShape中定义了叁个相对应的成员函式,而且它们都是纯虚拟函式,表示所有继承自CShape的类别都必须改写此叁个成员函式。
(关於物件导向的关念请参阅 <必要的C++ 基础章节>
或是相关书籍,在此尽作简短的解释)。这叁个函式名称称如下:</p>
<p>virtual void OnMouseMove(int,int)=0;</p>
<p>virtual void OnMouseDown(int,int)=0;</p>
<p>virtual void OnMouseUp(int,int)=0;</p>
<p>另外我们再定义一般性的绘图物件都会用到的基本特性,如颜色及线条宽度,再加上绘图时所需要的
Canvas,如此就组成了CShape的类别定义:</p>
<p>TCanvas* m_pCanvas; // 绘图所需的Canvas </p>
<p>TColor m_Color; // 颜色</p>
<p>int m_nWidth; // 宽度</p>
<p>至於CShape的解构函式为何也设成virtual呢?这关系到继承物件的毁灭方法。若是基础类别的解构函式没有定义成虚拟函式时,会造成特定情况下,子类别的解构函式没有被呼叫到的情形:</p>
<p>如:</p>
<p>CLine *pLine = new Line;</p>
<p>CShape* pShape=pLIne;</p>
<p>delete pShape;</p>
<p>上述的例子因为CLine为CShape的子类别,因此可以直接将pShape指标指向pLine,然而在後面delete
pShape时,若是pShape的解构函式不为虚拟函式,会造成pLine的解构函式不被呼叫到。这是一般C++
程式设计时很容易犯的错误。</p>
<p>我们可以将以上的经验法则归纳成一个原则,即是:只要该类别有可能被继承,就必须将其解构函式设为虚拟函式。如此就有了以下的定义了:</p>
<p>CShape(TCanvas* pCanvas) {m_pCanvas = pCanvas;}</p>
<p>virtual ~CShape() {}</p>
<p>CShape的建构函式必须传入Canvas以便绘图,而解构函式则不做任何事,只将其定义为虚拟函式。</p>
</font>
<p align="right"><font SIZE="2"><!--webbot bot="ImageMap" rectangle="(40,1) (71, 23) chap36.htm" rectangle="(4,1) (36, 23) chap34.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="chap36.htm"><AREA SHAPE="RECT" COORDS="4, 1, 36, 23" HREF="chap34.htm"></MAP><a href="../../../_vti_bin/shtml.exe/program/C++/ch3/chap35.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="41841" --></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 + -