100165563.htm

来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 89 行

HTM
89
字号


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>
	
        20.1.4  使用剪切区域
</title></head>
<body>
    <div class="area">

        

        <div class="col1">
            <div class="lineBlue">
            </div>
            <!-- title -->
            <div class="arcTitle">
                <h1>
                    <a href="../16">
                        C#高级编程(第3版)【全文连载】
                    </a>
                </h1>
                <div style="text-align: center; font-size: 15px">
                    <a href="100165563.htm">
                        20.1.4  使用剪切区域
                    </a>
                </div>
                <div style="text-align: center; font-size: 15px">
                    <a class="url" href="../../default.htm">http://book.csdn.net/</a>
                    2006-10-13 14:41:00
                </div>
                <div style="margin: 0px auto; width: 700px; border: solid 1px #0b5f98;">
                    <div style="float: left; width: 16px; background-color: #0b5f98; color: White; padding: 1px;">
                        图书导读
                    </div>
                    <div style="float: right; width: 670px; text-align: left; line-height: 16pt; padding-left: 2px">
                        <!--导读-->
                        <h1 id="divCurrentNode" style="color: #b83507; width: 100%; text-align: left; font-size: 12px; padding-left: 2px">当前章节:<a href='100165563.htm'><font color='red'>20.1.4  使用剪切区域</font></a></h1>
                        <div id="divRelateNode" style="padding-left: 2px">
                        <div style='float:left;width:49%'>·<a href='100165560.htm'>20.1.1  GDI和GDI+</a></div><div style='float:right;width:49%'>·<a href='100165561.htm'>20.1.2  绘制图形</a></div><div style='float:left;width:49%'>·<a href='100165562.htm'>20.1.3  使用OnPaint()绘制图形</a></div><div style='float:right;width:49%'>·<a href='100165564.htm'>20.2  测量坐标和区域</a></div><div style='float:left;width:49%'>·<a href='100165565.htm'>20.2.1  Point和PointF结构</a></div><div style='float:right;width:49%'>·<a href='100165566.htm'>20.2.2  Size和SizeF结构</a></div></div>
                    </div>
                </div>
                </div>
            <!-- main -->
            <div id="main">
                <div id="text"> <link href="css.css" rel="stylesheet" type="text/css" /><h3 style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 0cm; MARGIN-RIGHT: 0cm; FTEL: 8.15pt"><a ftel="_Toc507815356"><span lang="EN-US">20.1.4&nbsp; </span></a><span style="FONT-FAMILY: 黑体">使用剪切区域</span></h3>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">上一节的</span><span lang="EN-US">DrawShapes</span><span style="FONT-FAMILY: 宋体">示例说明了在窗口中绘图的主要规则,但它并不是很高效。原因是它试图在窗口中绘图,而没有考虑需要绘制多少内容。如图</span><span lang="EN-US">20-2</span><span style="FONT-FAMILY: 宋体">所示的情形。运行</span><span lang="EN-US">DrawShapes</span><span style="FONT-FAMILY: 宋体">示例,当该示例在屏幕上绘图时,打开另一个窗口,把它移动到</span><span lang="EN-US">DrawShapes</span><span style="FONT-FAMILY: 宋体">窗体上,使之隐藏一部分窗体。</span></p>
<p align="center"><span lang="EN-US"><img height="205" src="20/image002.jpg" width="204" alt="" /></span></p>
<p style="FTEL: 8.15pt" align="center"><span style="COLOR: black; FONT-FAMILY: 宋体">图</span><span lang="EN-US" style="COLOR: black">&nbsp; 20-2</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">到现在为止一切正常。但移动上面的窗口时,</span><span lang="EN-US">DrawShapes</span><span style="FONT-FAMILY: 宋体">窗口会再次全部显示出来,</span><span lang="EN-US">Windows</span><span style="FONT-FAMILY: 宋体">通常会给窗体发送一个</span><span lang="EN-US">Paint</span><span style="FONT-FAMILY: 宋体">事件,要求它重新绘制本身。矩形和椭圆都位于客户区域的左上角,所以在任何时候都是可见的,在本例中不需要重新绘制这部分,而只需要重新绘制白色背景区域。但是,</span><span lang="EN-US">Windows</span><span style="FONT-FAMILY: 宋体">并不知道这一点,它认为应引发</span><span lang="EN-US">Paint</span><span style="FONT-FAMILY: 宋体">事件,调用</span><span lang="EN-US">OnPaint()</span><span style="FONT-FAMILY: 宋体">方法。</span><span lang="EN-US">OnPaint()</span><span style="FONT-FAMILY: 宋体">不必重新绘制矩形和椭圆。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">在本例中,没有重新绘制图形。原因是我们使用了设备环境。</span><span lang="EN-US">Windows</span><span style="FONT-FAMILY: 宋体">将利用重新绘制某些区域所需要的信息预先初始化设备环境。在</span><span lang="EN-US">GDI</span><span style="FONT-FAMILY: 宋体">中,被标记出来的重绘区域称为无效区域,但在</span><span lang="EN-US">GDI+</span><span style="FONT-FAMILY: 宋体">中,该术语被改为剪切区域,设备环境知道这个区域的内容,它截取在这个区域外部的绘图操作,且不把相关的绘图命令传送给图形卡。这听起来不错,但仍有一个潜在的性能损失。在确定是在无效区域外部绘图前,我们不知道必须进行多少设备环境处理。在某些情况下,要处理的任务比较多,因为计算哪些像素需要改变为什么颜色,将会占用许多处理器时间</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">好的图形卡会提供硬件加速,对此有一定的帮助</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">其底线是让</span><span lang="EN-US">Graphics</span><span style="FONT-FAMILY: 宋体">实例完成在无效区域外部的绘图工作,肯定会浪费处理器时间,减慢应用程序的运行。在结构优良的应用程序中,代码将执行一些检查,以查看需要进行哪些绘图工作,然后调用相关的</span><span lang="EN-US">Graphics</span><span style="FONT-FAMILY: 宋体">实例方法。本节将编写一个新示例</span><span lang="EN-US">DrawShapesWithClipping</span><span style="FONT-FAMILY: 宋体">,修改</span><span lang="EN-US">DisplayShapes</span><span style="FONT-FAMILY: 宋体">示例,只完成需要的重新绘制工作。在</span><span lang="EN-US">OnPaint()</span><span style="FONT-FAMILY: 宋体">代码中,进行一个简单的测试,看看无效区域是否与需要绘制的区域重叠,如果是,就调用绘图方法。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">首先,需要获得剪切区域的信息。这需要使用</span><span lang="EN-US">PaintEventArgs</span><span style="FONT-FAMILY: 宋体">的另一个属性。这个属性叫做</span><span lang="EN-US">ClipRectangle</span><span style="FONT-FAMILY: 宋体">,包含要重绘区域的坐标,并包装在一个结构实例</span><span lang="EN-US">System.Drawing.Rectangle</span><span style="FONT-FAMILY: 宋体">中。</span><span lang="EN-US">Rectangle</span><span style="FONT-FAMILY: 宋体">是一个相当简单的结构,包含</span><span lang="EN-US">4</span><span style="FONT-FAMILY: 宋体">个属性:</span><span lang="EN-US">Top</span><span style="FONT-FAMILY: 宋体">、</span><span lang="EN-US">Bottom</span><span style="FONT-FAMILY: 宋体">、</span><span lang="EN-US">Left</span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US"> Right</span><span style="FONT-FAMILY: 宋体">。它们分别包含矩形的上下的垂直坐标、左右的水平坐标。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">接着,需要确定进行什么测试,以决定是否进行绘制。这里进行一个简单的测试。注意,在我们的绘图过程中,矩形和椭圆完全包含在</span><span lang="EN-US">(0,0)</span><span style="FONT-FAMILY: 宋体">到</span><span lang="EN-US">(80,130)</span><span style="FONT-FAMILY: 宋体">的矩形客户区域中,实际上,点</span><span lang="EN-US">(82,132)</span><span style="FONT-FAMILY: 宋体">就已经在安全区域中了,因为线条大约偏离这个区域一个像素。所以我们要看看剪切区域的左上角是否在这个矩形区域内。如果是,就继续绘制,如果不是,就不必麻烦了。</span></p>
<p class="a6" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected override void OnPaint( PaintEventArgs e )</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; base.OnPaint(e);</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Graphics dc = e.Graphics;</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (e.ClipRectangle.Top &lt; 132 &amp;&amp; e.ClipRectangle.Left &lt; 82)</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pen bluePen = new Pen(Color.Blue, 3);</span><span class="MsoCommentReference"><span lang="EN-US" style="DISPLAY: none; FONT-SIZE: 8pt; COLOR: black; LETTER-SPACING: 0.2pt"> </span></span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dc.DrawRectangle(bluePen, 0,0,50,50);</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pen redPen = new Pen(Color.Red, 2);</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;dc.DrawEllipse(redPen, 0, 50, 80, 60);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p class="a6" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">注意,显示的结果与以前显示的结果完全相同</span><span lang="EN-US" style="LETTER-SPACING: -1pt">&mdash;&mdash; </span><span style="FONT-FAMILY: 宋体">但这次进行了早期测试,确定了哪些区域不需要绘制,提高了性能。还要注意这个是否进行绘图的测试是非常粗略的。还可以进行更精细的测试,确定矩形或者椭圆是否要重新绘制。这里有一个平衡。可以在</span><span lang="EN-US">OnPaint()</span><span style="FONT-FAMILY: 宋体">中进行更复杂的测试,以提高性能,也可以使</span><span lang="EN-US">OnPaint()</span><span style="FONT-FAMILY: 宋体">代码复杂一些。</span></p></div>
                <!-- page -->
                <div class="page" style="text-align: center">
                    <a href="100165562.htm">上一页</a>&nbsp;&nbsp;&nbsp;<a href="index.html">首页</a>&nbsp;&nbsp;&nbsp;<a href="100165564.htm">下一页</a>
                </div>
                <div style="margin: 0px auto; width: 700px; border: solid 1px #0b5f98;">
                    <div style="float: left; width: 16px; background-color: #0b5f98; color: White; padding: 1px;">
                        图书导读
                    </div>
                    <div style="float: right; width: 670px; text-align: left; line-height: 16pt; padding-left: 2px">
                        <!--导读-->
                        <h1 id="divCurrentNode2" style="color: #b83507; width: 100%; text-align: left; font-size: 12px; padding-left: 2px">当前章节:<a href='100165563.htm'><font color='red'>20.1.4  使用剪切区域</font></a></h1>
                        <div id="divRealteNod2" style="padding-left: 2px">
                        <div style='float:left;width:49%'>·<a href='100165560.htm'>20.1.1  GDI和GDI+</a></div><div style='float:right;width:49%'>·<a href='100165561.htm'>20.1.2  绘制图形</a></div><div style='float:left;width:49%'>·<a href='100165562.htm'>20.1.3  使用OnPaint()绘制图形</a></div><div style='float:right;width:49%'>·<a href='100165564.htm'>20.2  测量坐标和区域</a></div><div style='float:left;width:49%'>·<a href='100165565.htm'>20.2.1  Point和PointF结构</a></div><div style='float:right;width:49%'>·<a href='100165566.htm'>20.2.2  Size和SizeF结构</a></div></div>
                    </div>
                </div>
                </div>
        </div>
</body>
</html>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?