<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8">
<meta name="generator" content="pdf2htmlEX">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<link rel="stylesheet" href="https://static.pudn.com/base/css/base.min.css">
<link rel="stylesheet" href="https://static.pudn.com/base/css/fancy.min.css">
<link rel="stylesheet" href="https://static.pudn.com/prod/directory_preview_static/6240d690d62d7b1199464c9b/raw.css">
<script src="https://static.pudn.com/base/js/compatibility.min.js"></script>
<script src="https://static.pudn.com/base/js/pdf2htmlEX.min.js"></script>
<script>
try{
pdf2htmlEX.defaultViewer = new pdf2htmlEX.Viewer({});
}catch(e){}
</script>
<title></title>
</head>
<body>
<div id="sidebar" style="display: none">
<div id="outline">
</div>
</div>
<div id="pf1" class="pf w0 h0" data-page-no="1"><div class="pc pc1 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/6240d690d62d7b1199464c9b/bg1.jpg"><div class="t m0 x1 h2 y1 ff1 fs0 fc0 sc0 ls0 ws0"> </div><div class="t m0 x2 h2 y2 ff1 fs0 fc0 sc0 ls0 ws1">– 328 – </div><div class="t m0 x3 h3 y3 ff2 fs1 fc0 sc0 ls0 ws0">第<span class="ff1 ls1"> </span>章<span class="ff1 fs2"> </span></div><div class="t m0 x4 h4 y4 ff3 fs3 fc1 sc0 ls0 ws0">1</div><div class="t m0 x5 h4 y5 ff3 fs3 fc0 sc0 ls0 ws0">1</div><div class="t m0 x6 h4 y4 ff3 fs3 fc1 sc0 ls0 ws0">7</div><div class="t m0 x7 h4 y5 ff3 fs3 fc0 sc0 ls0 ws0">7</div><div class="t m0 x8 h5 y6 ff3 fs4 fc1 sc0 ls0 ws0"> </div><div class="t m0 x9 h5 y7 ff3 fs4 fc0 sc0 ls0 ws0"> </div><div class="t m0 xa h5 y8 ff3 fs4 fc1 sc0 ls0 ws0">图</div><div class="t m0 x3 h5 y9 ff3 fs4 fc0 sc0 ls0 ws0">图</div><div class="t m0 xb h5 y8 ff3 fs4 fc1 sc0 ls0 ws0"> </div><div class="t m0 xc h5 y9 ff3 fs4 fc0 sc0 ls0 ws0"> </div><div class="t m0 xd h5 y8 ff3 fs4 fc1 sc0 ls0 ws0">形</div><div class="t m0 x4 h5 y9 ff3 fs4 fc0 sc0 ls0 ws0">形</div><div class="t m0 xe h5 y8 ff3 fs4 fc1 sc0 ls0 ws0"> </div><div class="t m0 xf h5 y9 ff3 fs4 fc0 sc0 ls0 ws0"> </div><div class="t m0 x10 h5 y8 ff3 fs4 fc1 sc0 ls0 ws0">显</div><div class="t m0 x11 h5 y9 ff3 fs4 fc0 sc0 ls0 ws0">显</div><div class="t m0 x12 h5 y8 ff3 fs4 fc1 sc0 ls0 ws0"> </div><div class="t m0 x13 h5 y9 ff3 fs4 fc0 sc0 ls0 ws0"> </div><div class="t m0 x14 h5 y8 ff3 fs4 fc1 sc0 ls0 ws0">示</div><div class="t m0 x15 h5 y9 ff3 fs4 fc0 sc0 ls0 ws0">示</div><div class="t m0 x16 h5 y8 ff3 fs4 fc1 sc0 ls0 ws0"> </div><div class="t m0 x17 h5 y9 ff3 fs4 fc0 sc0 ls0 ws0"> </div><div class="t m0 x18 h6 ya ff4 fs2 fc0 sc0 ls2 ws0">在前几章中,<span class="_ _0"></span>我们已经开始熟悉<span class="_ _1"> </span><span class="ff1 ls3">GUI</span><span class="ls4">,<span class="_ _0"></span>在还没有对<span class="_ _2"> </span><span class="ff1 ls5">Symbian<span class="_"> </span></span><span class="ls2">操作系统图形深入理解的情况下<span class="_ _3"></span>,</span></span></div><div class="t m0 x2 h6 yb ff4 fs2 fc0 sc0 ls2 ws0">我们就已经开始程序设计了。<span class="_ _3"></span>尽管在第<span class="_ _1"> </span><span class="ff1 ls6">15<span class="_"> </span></span>章看到了在应<span class="_ _3"></span>用程序视图中进行绘制的一些具体<span class="_ _3"></span>例子,</div><div class="t m0 x2 h6 yc ff4 fs2 fc0 sc0 ls4 ws0">但是在菜单、对话框以及标准控件中的大多数其他绘制则是由<span class="_ _4"> </span><span class="ff1 ls7">Uikon</span><span class="ls0">、<span class="_ _5"></span><span class="ff1 ls8">UIQ<span class="_"> </span></span></span>或者<span class="_ _1"> </span><span class="ff1 ls5">S60<span class="_"> </span></span>框架完成。<span class="ff1 ls0"> </span></div><div class="t m0 x19 h6 yd ff4 fs2 fc0 sc0 ls7 ws0">现在是更详细地探讨图形的时<span class="_ _3"></span>候了。<span class="_ _6"></span>本章介绍关于屏幕绘制所需<span class="_ _3"></span>要知道的更复杂更有效的知识:<span class="_ _7"></span><span class="ff1 ls0"> </span></div><div class="t m0 x1a h6 ye ff5 fs2 fc0 sc0 ls0 ws0">•<span class="_ _5"></span><span class="ff1"> <span class="_ _8"> </span><span class="ff4 ls4">如何在屏幕上得到图形;</span> </span></div><div class="t m0 x1a h6 yf ff5 fs2 fc0 sc0 ls0 ws0">•<span class="_ _5"></span><span class="ff1"> <span class="_ _8"> </span><span class="ff4 ls4">如何使用<span class="_ _1"> </span></span><span class="ls9 ws2">CGraphicsContext API<span class="_ _5"></span></span><span class="ff4">;<span class="_ _5"></span></span> </span></div><div class="t m0 x1a h6 y10 ff5 fs2 fc0 sc0 ls0 ws0">•<span class="_ _5"></span><span class="ff1"> <span class="_ _8"> </span><span class="ff4 ls4">模型-视图-<span class="_ _3"></span>控制器范例(<span class="ff1 lsa">MVC</span><span class="ls0">)<span class="_ _9"></span>;<span class="_ _5"></span><span class="ff1"> </span></span></span></span></div><div class="t m0 x1a h6 y11 ff5 fs2 fc0 sc0 ls0 ws0">•<span class="_ _5"></span><span class="ff1"> <span class="_ _8"> </span><span class="ff4 ls4">如何更新屏幕且不产生视觉闪烁;</span> </span></div><div class="t m0 x1a h6 y12 ff5 fs2 fc0 sc0 ls0 ws0">•<span class="_ _5"></span><span class="ff1"> <span class="_ _8"> </span><span class="ff4 ls4">如何使用窗口(</span><span class="lsb">R<span class="_ _a"></span>Window<span class="_ _3"></span><span class="ff4 ls4">)和控件(<span class="ff1 lsc">CCoeControl</span>)来共享屏幕;<span class="ff1 ls0"> </span></span></span></span></div><div class="t m0 x1a h6 y13 ff5 fs2 fc0 sc0 ls0 ws0">•<span class="_ _5"></span><span class="ff1 ls5 ws3"> Sym<span class="_ _3"></span>bian<span class="_ _1"> </span><span class="ff4 ls4 ws0">操作系统图形系统支持的特殊效果;<span class="_ _5"></span><span class="ff1 ls0"> </span></span></span></div><div class="t m0 x1a h6 y14 ff5 fs2 fc0 sc0 ls0 ws0">•<span class="_ _5"></span><span class="ff1"> <span class="_ _8"> </span><span class="ff4 ls4">窗口服务器与绘制相关的功能;</span> </span></div><div class="t m0 x1a h6 y15 ff5 fs2 fc0 sc0 ls0 ws0">•<span class="_ _5"></span><span class="ff1"> <span class="_ _8"> </span><span class="ff4 ls4">与尺寸无关的绘制,包括缩放;</span> </span></div><div class="t m0 x1a h6 y16 ff5 fs2 fc0 sc0 ls0 ws0">•<span class="_ _5"></span><span class="ff1"> <span class="_ _8"> </span><span class="ff4 ls4">与目标无关的绘制以及绘制到多于一个的输出设备上;</span> </span></div><div class="t m0 x1a h6 y17 ff5 fs2 fc0 sc0 ls0 ws0">•<span class="_ _5"></span><span class="ff1"> <span class="_ _8"> </span><span class="ff4 ls4">设备特性。</span> </span></div><div class="t m0 x18 h6 y18 ff4 fs2 fc0 sc0 ls4 ws0">在第<span class="_ _1"> </span><span class="ff1 ls7">18<span class="_"> </span></span>章,我们将介绍支持基于键盘和触笔设备的用户交互的内容。<span class="ff1 ls0"> </span></div><div class="t m0 x2 h7 y19 ff6 fs1 fc0 sc0 lsd ws0">1<span class="_ _3"></span>7.<span class="_ _a"></span>1 <span class="_ _2"> </span> <span class="_ _2"> </span>绘图基础 </div><div class="t m0 x18 h6 y1a ff1 fs2 fc0 sc0 lse ws0">GUI<span class="_"> </span><span class="ff4 ls2">比控制台程序提供了多得<span class="_ _3"></span>多的显示数据的机会。即使是在只<span class="_ _3"></span>显示“<span class="ff1 lsf ws4">Hello W<span class="_ _a"></span>orld<span class="ff4 ls2 ws0">”这么简</span></span></span></div><div class="t m0 x2 h6 y1b ff4 fs2 fc0 sc0 ls4 ws0">单的程序中,也要面对这些问题:<span class="ff1 ls0"> </span></div><div class="t m0 x1a h6 y1c ff5 fs2 fc0 sc0 ls0 ws0">•<span class="_ _5"></span><span class="ff1"> <span class="_ _8"> </span><span class="ff4 ls4">应该使用什么字体;</span> </span></div><div class="t m0 x1a h6 y1d ff5 fs2 fc0 sc0 ls0 ws0">•<span class="_ _5"></span><span class="ff1"> <span class="_ _8"> </span><span class="ff4 ls4">前景和背景应该使用什么颜色;</span> </span></div><div class="t m0 x1a h6 y1e ff5 fs2 fc0 sc0 ls0 ws0">•<span class="_ _5"></span><span class="ff1"> <span class="_ _8"> </span><span class="ff4 ls4">在哪里放置文本;</span> </span></div><div class="t m0 x1a h6 y1f ff5 fs2 fc0 sc0 ls0 ws0">•<span class="_ _5"></span><span class="ff1"> <span class="_ _8"> </span><span class="ff4 ls4">在某些类型的边框和框架中应不应该将文本设置为关闭;</span> </span></div><div class="t m0 x1a h6 y20 ff5 fs2 fc0 sc0 ls0 ws0">•<span class="_ _5"></span><span class="ff1"> <span class="_ _8"> </span><span class="ff4 ls4">屏幕有多大,以及可以使用多大来绘制文本。</span> </span></div><div class="t m0 x18 h6 y21 ff4 fs2 fc0 sc0 ls2 ws0">不论以何种方式来看待它,都<span class="_ _3"></span>必须做出上述决定,因此程<span class="_ _3"></span>序中显示“<span class="ff1 ls10 ws5">Hello world</span>”的部分不</div><div class="t m0 x2 h6 y22 ff4 fs2 fc0 sc0 ls2 ws0">可避免地要比文本模式程序的<span class="_ _3"></span>相应部分要大。<span class="_ _7"></span><span class="ls4">同样,<span class="_ _7"></span><span class="ls2">下面是典型的图形<span class="_ _7"></span><span class="ls0">“<span class="_ _5"></span><span class="ff1 ls10 ws6">Hello W<span class="_ _a"></span>orld<span class="ff4 ls0 ws0">”<span class="_ _9"></span><span class="ls4">程序的<span class="_ _b"> </span><span class="ff1 ls5">Draw()</span></span></span></span></span></span></span></div><div class="t m0 x2 h6 y23 ff4 fs2 fc0 sc0 ls4 ws0">函数。<span class="ff1 ls0"> </span></div><div class="t m0 x2 h8 y24 ff1 fs5 fc0 sc0 ls0 ws0"> </div><div class="t m1 x1a h9 y25 ff7 fs6 fc0 sc0 ls11 ws0">void CHelloWorldAppView::Draw(const TRect& /*aRect*/) const </div><div class="t m1 x1a h9 y26 ff7 fs6 fc0 sc0 ls12 ws0"> {<span class="_ _c"></span> </div></div><div class="pi" data-data='{"ctm":[1.841248,0.000000,0.000000,1.841248,0.000000,0.000000]}'></div></div>
</body>
</html>
<div id="pf2" class="pf w0 h0" data-page-no="2"><div class="pc pc2 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/6240d690d62d7b1199464c9b/bg2.jpg"><div class="t m0 x1b h2 y27 ff1 fs0 fc0 sc0 ls13 ws7">17.1 <span class="ff8 ls0 ws0">绘图基础<span class="ff1"> </span></span></div><div class="t m0 x1c h2 y28 ff1 fs0 fc0 sc0 ls0 ws1">– 329 – </div><div class="t m1 x1a h9 y29 ff7 fs6 fc0 sc0 ls11 ws0"> <span class="_ _d"></span> <span class="_ _d"></span>CWindowGc& gc = SystemGc(); </div><div class="t m1 x1a h9 y2a ff7 fs6 fc0 sc0 ls11 ws8"> gc.Clear(); </div><div class="t m1 x1a h9 y2b ff7 fs6 fc0 sc0 ls11 ws0"> <span class="_ _d"></span> <span class="_ _d"></span>TRect rect = Rect(); </div><div class="t m1 x1a h9 y2c ff7 fs6 fc0 sc0 ls11 ws8"> rect.Shrink(10, <span class="_ _c"></span>10); </div><div class="t m1 x1a h9 y2d ff7 fs6 fc0 sc0 ls11 ws8"> gc.DrawRect(rect); </div><div class="t m1 x1a h9 y2e ff7 fs6 fc0 sc0 ls11 ws8"> rect.Shrink(1, <span class="_ _c"></span>1); </div><div class="t m1 x1a h9 y2f ff7 fs6 fc0 sc0 ls11 ws0"> <span class="_ _d"></span> <span class="_ _d"></span>const CFont* font = iEikonEnv->TitleFont(); </div><div class="t m1 x1a h9 y30 ff7 fs6 fc0 sc0 ls11 ws8"> gc.UseFont(font); </div><div class="t m1 x1a h9 y31 ff7 fs6 fc0 sc0 ls11 ws0"> <span class="_ _d"></span> <span class="_ _d"></span>TInt baseline = rect.Height() / 2 + font->AscentInPixels() / 2; </div><div class="t m1 x1a h9 y32 ff7 fs6 fc0 sc0 ls11 ws0"> <span class="_ _d"></span> <span class="_ _d"></span>gc.DrawText(*iHelloWorld, rect, baseline, CGraphicsContext::ECenter); </div><div class="t m1 x1a h9 y33 ff7 fs6 fc0 sc0 ls11 ws8"> gc.DiscardFont(); </div><div class="t m1 x1a h9 y34 ff7 fs6 fc0 sc0 ls12 ws0"> }<span class="_ _c"></span> </div><div class="t m0 x2 h8 y35 ff1 fs5 fc0 sc0 ls0 ws0"> </div><div class="t m0 x18 h6 y36 ff4 fs2 fc0 sc0 ls4 ws0">这里有<span class="_ _4"> </span><span class="ff1 ls14">11<span class="_ _2"> </span></span><span class="ls2">行代码,<span class="_ _d"></span>在基于控制台的程序中,<span class="_ _e"></span>这些代码足够了。<span class="_ _e"></span>不过,<span class="_ _e"></span>所幸的是,<span class="_ _e"></span>用户可以根</span></div><div class="t m0 x2 h6 y37 ff4 fs2 fc0 sc0 ls4 ws0">据需要做出决策,并且编写实现所做决策的代码相当容易。上面的示例演示了绘制的要点:<span class="ff1 ls0"> </span></div><div class="t m0 x1a h6 y38 ff5 fs2 fc0 sc0 ls0 ws0">•<span class="_ _5"></span><span class="ff1"> <span class="_ _8"> </span><span class="ff4 ls4">在控件上绘制图形。在本例中,</span><span class="ls7">CHelloW<span class="_ _d"></span>orldAppV<span class="_ _a"></span>iew<span class="_"> </span><span class="ff4 ls4">是从<span class="_ _4"> </span></span><span class="lsc">CCoeControl<span class="_"> </span><span class="ff4 ls4">派生而来的;</span><span class="ls0"> </span></span></span></span></div><div class="t m0 x1a h6 y39 ff5 fs2 fc0 sc0 ls0 ws0">•<span class="_ _5"></span><span class="ff1"> <span class="_ _8"> </span><span class="ff4 ls4">使用<span class="_ _1"> </span></span><span class="ls9 ws2">CGraphicsContext API<span class="_ _2"> </span></span><span class="ff4 ls4">来绘制图形本身。</span> </span></div><div class="t m0 x2 ha y3a ff1 fs7 fc0 sc0 ls15 ws9">17.1.1 <span class="ff4 ls16 ws0">控件<span class="ff1 ls0"> </span></span></div><div class="t m0 x1a h6 y3b ff4 fs2 fc0 sc0 ls0 ws0">第<span class="_ _f"> </span><span class="ff1 ls6">15<span class="_ _10"> </span></span><span class="ls2">章已经解释了所有的绘制都是<span class="_ _3"></span>在控件中完成的。</span></div><div class="t m0 x2 hb y3c ff4 fs2 fc0 sc0 ls2 ws0">控件是屏幕上占据某一窗口的<span class="_ _3"></span>全部或部分的矩形区域。所<span class="_ _3"></span>有</div><div class="t m0 x2 h6 y3d ff4 fs2 fc0 sc0 ls17 ws0">控件的基类是<span class="_ _f"> </span><span class="ff1 ls18">CCoeControl<span class="_ _5"></span></span>,它由<span class="_ _f"> </span><span class="ff1 ls5">Symbian<span class="_ _11"> </span></span>操作系统中的</div><div class="t m0 x2 h6 y3e ff1 fs2 fc0 sc0 ls19 ws0">CONE<span class="_"> </span><span class="ff4 ls4">组件定义。</span><span class="ls0"> </span></div><div class="t m0 x18 h6 y3f ff4 fs2 fc0 sc0 ls0 ws0">图<span class="_ _b"> </span><span class="ff1 ls1a">17.1<span class="_ _12"> </span></span><span class="ls2">中的屏幕包含两个窗口</span></div><div class="t m2 x1d hb y40 ff4 fs2 fc0 sc0 ls0 ws0">—</div><div class="t m0 x1e hb y40 ff4 fs2 fc0 sc0 ls2 ws0">应用程序视图和按钮</div><div class="t m0 x2 hb y41 ff4 fs2 fc0 sc0 ls2 ws0">栏。应用程序视图是单个控件<span class="_ _3"></span>,而按钮栏由几个控件组成<span class="_ _3"></span>:</div><div class="t m0 x2 h6 y42 ff4 fs2 fc0 sc0 ls2 ws0">整个按钮栏的容器<span class="_ _7"></span><span class="ls0">(<span class="_ _5"></span><span class="ff1 ls9">container</span>)<span class="_ _13"></span>,<span class="_ _13"></span><span class="ls2">它是一个复合控件<span class="_ _7"></span><span class="ls0">(<span class="_ _5"></span><span class="ff1 ls7">compound </span></span></span></span></div><div class="t m0 x2 h6 y43 ff1 fs2 fc0 sc0 ls1b ws0">control<span class="ff4 ls0">)<span class="_ _9"></span>,<span class="_ _14"></span><span class="ls2">以及组件控件<span class="_ _0"></span><span class="ls0">(<span class="ff1 lsb wsa">c<span class="_ _5"></span>omponent control</span>)<span class="_ _9"></span>,<span class="_ _14"></span><span class="ls4">包含<span class="_ _4"> </span><span class="ff1 ls0">4<span class="_ _2"> </span></span><span class="ls2">个按钮。<span class="_ _7"></span><span class="ff1 ls0"> </span></span></span></span></span></span></div><div class="t m0 x18 h6 y44 ff4 fs2 fc0 sc0 ls4 ws0">通过这个应用程序,我们已经可以概括控件如下:<span class="ff1 ls0"> </span></div><div class="t m0 x1a h6 y45 ff5 fs2 fc0 sc0 ls0 ws0">•<span class="_ _5"></span><span class="ff1"> <span class="_ _8"> </span><span class="ff4 ls2">对于应用程序,控件是<span class="_ _1"> </span></span><span class="lse">GUI<span class="_"> </span><span class="ff4 ls2">交互的基本单位。控件</span></span></span></div><div class="t m0 x1f h6 y46 ff4 fs2 fc0 sc0 ls4 ws0">可以完成任何切合实际的绘制、触笔处理以及键处理的组合;<span class="ff1 ls0"> </span></div><div class="t m0 x1a h6 y47 ff5 fs2 fc0 sc0 ls0 ws0">•<span class="_ _5"></span><span class="ff1"> <span class="_ _8"> </span><span class="ff4 ls4">窗口是系统的基本交互单位。控件总是使用全部或部分窗口;</span> </span></div><div class="t m0 x1a h6 y48 ff5 fs2 fc0 sc0 ls0 ws0">•<span class="_ _5"></span><span class="ff1"> <span class="_ _8"> </span><span class="ff4 ls4">控件可以是复合的,即控件可以包含组件控件。复合控件有时候被称作容器。</span> </span></div><div class="t m0 x2 ha y49 ff1 fs7 fc0 sc0 ls15 ws9">17.1.2 <span class="ff4 ls16 ws0">获取图形上下文<span class="ff1 ls0"> </span></span></div><div class="t m0 x18 h6 y4a ff4 fs2 fc0 sc0 ls0 ws0">在<span class="_ _11"> </span><span class="ff1 ls1b">Sy<span class="_ _5"></span>m<span class="_ _3"></span>bian<span class="_ _f"> </span><span class="ff4 ls1c">操作系统中,所有的绘制是通过图形上下文(</span><span class="ls7 wsb">graphics context</span><span class="ff4 ls0">,<span class="_ _5"></span></span><span class="ls3">GC<span class="ff4 ls1c">)完成的。</span></span></span></div><div class="t m0 x2 h6 y4b ff1 fs2 fc0 sc0 ls1d ws0">CHelloGuiApp<span class="_ _5"></span>V<span class="_ _d"></span>iew::Draw()<span class="_ _5"></span><span class="ff4 ls4">使用<span class="_ _1"> </span></span><span class="lsf">SystemGc()<span class="ff4 ls2">获取对图形上下文的控制,<span class="_ _e"></span><span class="ff1 ls1e">SystemGc()<span class="ff4 ls0">是<span class="_ _15"> </span></span><span class="ls18">CCoeControl</span></span></span></span></div><div class="t m0 x2 h6 y4c ff4 fs2 fc0 sc0 ls4 ws0">中的一个函数。<span class="ff1 ls0"> </span></div><div class="t m0 x2 h8 y4d ff1 fs5 fc0 sc0 ls0 ws0"> </div><div class="t m1 x1a h9 y4e ff7 fs6 fc0 sc0 ls11 ws0">CWindowGc& gc = SystemGc(); </div><div class="t m0 x2 h8 y4f ff1 fs5 fc0 sc0 ls0 ws0"> </div><div class="t m0 x1a h6 y50 ff4 fs2 fc0 sc0 ls1f ws0">所有图形上下文类都是从<span class="_ _f"> </span><span class="ff1 ls20">CGraphi<span class="_ _5"></span>csContext<span class="_ _f"> </span></span>中派生的。每一个派生的类</div><div class="t m2 x20 hb y50 ff4 fs2 fc0 sc0 ls0 ws0">—</div><div class="t m0 x21 hb y50 ff4 fs2 fc0 sc0 ls1f ws0">比如这里</div><div class="t m0 x2 h6 y51 ff4 fs2 fc0 sc0 ls0 ws0">的<span class="_ _16"> </span><span class="ff1 ls21">CWindowGc</span></div><div class="t m2 x22 hb y52 ff4 fs2 fc0 sc0 ls0 ws0">—</div><div class="t m0 x23 hb y52 ff4 fs2 fc0 sc0 ls1f ws0">都用来在特定的图形设备上<span class="_ _5"></span>(在本例中是一个窗口)绘制。它实现了基</div><div class="t m0 x2 hb y53 ff4 fs2 fc0 sc0 ls22 ws0">类指定的所有功能,还可<span class="_ _3"></span>能实现适用于所提设备的附<span class="_ _3"></span>加功能。因此,能够通<span class="_ _3"></span>过图形上下文</div><div class="t m0 x2 h6 y54 ff4 fs2 fc0 sc0 ls1f ws0">清除屏幕。<span class="ff1 ls0"> </span></div><div class="t m0 x2 h8 y55 ff1 fs5 fc0 sc0 ls0 ws0"> </div><div class="t m1 x1a h9 y56 ff7 fs6 fc0 sc0 ls11 ws0">gc.Clear(); </div><div class="t m0 x24 hc y57 ff1 fs8 fc0 sc0 ls0 ws0"> </div><div class="t m0 x25 hd y58 ff4 fs6 fc0 sc0 ls0 ws0">图<span class="_ _4"> </span><span class="ff1 ls23">17.1<span class="_ _17"> </span></span>“<span class="_ _5"></span><span class="ff1 ls24">HelloW<span class="_ _d"></span>orld<span class="ff4 ls25">”应用程序屏幕</span><span class="ls0"> </span></span></div></div><div class="pi" data-data='{"ctm":[1.841248,0.000000,0.000000,1.841248,0.000000,0.000000]}'></div></div>
<div id="pf3" class="pf w0 h0" data-page-no="3"><div class="pc pc3 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/6240d690d62d7b1199464c9b/bg3.jpg"><div class="t m0 x2 h2 y27 ff8 fs0 fc0 sc0 ls0 ws0">第<span class="_ _1"> </span><span class="ff1">17<span class="_"> </span></span>章<span class="ff1 ls26"> </span>图形显示<span class="ff1"> </span></div><div class="t m0 x2 h2 y28 ff1 fs0 fc0 sc0 ls0 ws1">– 330 – </div><div class="t m0 x18 h6 y59 ff9 fs2 fc0 sc0 ls2 ws0">图形上下文是计算机图形学领<span class="_ _3"></span>域的一个常见概念。<span class="ff1 ls7">W<span class="_ _a"></span>indows<span class="_ _f"> </span><span class="ff9 ls2">使用“设<span class="_ _3"></span>备上下文”<span class="_ _7"></span><span class="ls0">;<span class="_ _5"></span><span class="ff1 ls27">Java<span class="_ _10"> </span></span><span class="ls4">使用</span></span></span></span></div><div class="t m0 x2 h6 y5a ff1 fs2 fc0 sc0 ls7 ws0">Graphics<span class="_"> </span><span class="ff9 ls4">对象。</span><span class="ls0"> </span></div><div class="t m0 x2 ha y5b ff1 fs7 fc0 sc0 ls15 ws9">17.1.3 <span class="ff4 ls16 ws0">绘制矩形<span class="ff1 ls0"> </span></span></div><div class="t m0 x18 h6 y5c ff4 fs2 fc0 sc0 ls4 ws0">接下来的<span class="_ _1"> </span><span class="ff1 ls0">3<span class="_ _2"> </span></span>行代码联合起来,在屏幕上应用程序视图区域向内绘制<span class="_ _4"> </span><span class="ff1 ls7">10<span class="_"> </span></span>像素的矩形边框。<span class="ff1 ls0"> </span></div><div class="t m0 x2 h8 y5d ff1 fs5 fc0 sc0 ls0 ws0"> </div><div class="t m1 x1a h9 y5e ff7 fs6 fc0 sc0 ls11 ws0">TRect rect =Rect(); </div><div class="t m1 x1a h9 y5f ff7 fs6 fc0 sc0 ls11 ws0">rect.Shrink(10, 10); </div><div class="t m1 x1a h9 y60 ff7 fs6 fc0 sc0 ls11 ws0">gc.DrawRect(rect); </div><div class="t m0 x2 h8 y61 ff1 fs5 fc0 sc0 ls0 ws0"> </div><div class="t m0 x18 h6 y62 ff1 fs2 fc0 sc0 ls10 ws0">CCoeControl::Re<span class="_ _5"></span>ct()<span class="ff4 ls2">给出调用<span class="_ _3"></span>它的控件所占据的矩形的坐标,<span class="_ _14"></span>在这里指应用程<span class="_ _3"></span>序视图。<span class="_ _14"></span>坐标是</span></div><div class="t m0 x2 h6 y63 ff4 fs2 fc0 sc0 ls2 ws0">相对于控件所使用的窗口的相<span class="_ _3"></span>对坐标。<span class="_ _9"></span><span class="ff1 ls28">CWindowGc<span class="_"> </span><span class="ff4 ls2">绘图函数所使用的坐<span class="_ _3"></span>标也必须是相对于这个窗</span></span></div><div class="t m0 x2 h6 y64 ff4 fs2 fc0 sc0 ls4 ws0">口的,这样才能方便使用。<span class="ff1 ls0"> </span></div><div class="t m0 x19 h6 y65 ff1 fs2 fc0 sc0 ls29 ws0">Shrink()<span class="ff4 ls2a">函数使得矩形比控件的矩形在每边(上下左右)都缩小<span class="_ _4"> </span></span>10<span class="_ _15"> </span><span class="ff4 ls2a">个像素。</span><span class="ls2b">TRect<span class="_ _4"> </span><span class="ff4 ls2a">包含许多类<span class="_ _5"></span>似</span></span></div><div class="t m0 x2 h6 y66 ff4 fs2 fc0 sc0 ls4 ws0">这样的实用工具函数。<span class="ff1 ls0"> </span></div><div class="t m0 x18 h6 y67 ff1 fs2 fc0 sc0 ls1d ws0">DrawRect()<span class="ff4 ls4">使用默认图形上下文设置绘制矩形。这些设置规定:</span><span class="ls0"> </span></div><div class="t m0 x1a h6 y68 ff5 fs2 fc0 sc0 ls0 ws0">•<span class="_ _5"></span><span class="ff1"> <span class="_ _8"> </span><span class="ff4 ls4">画笔产生一个宽度为<span class="_ _1"> </span></span>1<span class="_ _2"> </span><span class="ff4 ls4">个像素的黑实线,使<span class="_ _4"> </span></span><span class="ls7">rect<span class="_"> </span><span class="ff4 ls4">的边界绘制成黑色;</span></span> </span></div><div class="t m0 x1a h6 y69 ff5 fs2 fc0 sc0 ls0 ws0">•<span class="_ _5"></span><span class="ff1"> <span class="_ _8"> </span><span class="ff4 ls4">画刷为空,意味着不填充矩形。</span> </span></div><div class="t m0 x18 h6 y6a ff4 fs2 fc0 sc0 ls2 ws0">可以依赖于<span class="_ _1"> </span><span class="ff1 ls2c">Draw()</span>函数之前设置的默认图形上下<span class="_ _3"></span>文配置。<span class="_ _d"></span>无论如何,<span class="_ _d"></span>不要浪费时间去设置使</div><div class="t m0 x2 h6 y6b ff4 fs2 fc0 sc0 ls4 ws0">用默认值的地方。<span class="ff1 ls0"> </span></div><div class="t m0 x2 ha y6c ff1 fs7 fc0 sc0 ls15 ws9">17.1.4 <span class="ff4 ls16 ws0">绘制文本<span class="ff1 ls0"> </span></span></div><div class="t m0 x18 h6 y6d ff4 fs2 fc0 sc0 ls2 ws0">现在打算绘制矩形中央的文本<span class="_ _3"></span>。为了便于测量,我们从矩<span class="_ _3"></span>形的每边缩小<span class="_ _1"> </span><span class="ff1 ls0">1<span class="_ _2"> </span></span>个像素开始,这样</div><div class="t m0 x2 h6 y6e ff4 fs2 fc0 sc0 ls4 ws0">可以在不影响刚刚绘制的边框的情况下将它涂白。<span class="ff1 ls0"> </span></div><div class="t m0 x2 h8 y6f ff1 fs5 fc0 sc0 ls0 ws0"> </div><div class="t m1 x1a h9 y70 ff7 fs6 fc0 sc0 ls11 ws0">rect.Shrink(1,1); </div><div class="t m0 x2 h8 y71 ff1 fs5 fc0 sc0 ls0 ws0"> </div><div class="t m0 x18 h6 y72 ff4 fs2 fc0 sc0 ls4 ws0">然后,从<span class="_ _1"> </span><span class="ff1 lse">UI<span class="_"> </span></span>环境中获取一种字体。<span class="ff1 ls0"> </span></div><div class="t m0 x2 h8 y73 ff1 fs5 fc0 sc0 ls0 ws0"> </div><div class="t m1 x1a h9 y74 ff7 fs6 fc0 sc0 ls11 ws0">const CFont* font = iEikonEnv->TitleFont(); </div><div class="t m0 x2 h8 y75 ff1 fs5 fc0 sc0 ls0 ws0"> </div><div class="t m0 x18 h6 y76 ff4 fs2 fc0 sc0 ls2 ws0">这是我们第一次遇到<span class="_ _1"> </span><span class="ff1 ls8">CFont*</span>。<span class="_ _d"></span>在这一章的后面,<span class="_ _e"></span>我们将详细介绍如何获取字体,<span class="_ _e"></span>以满足所期</div><div class="t m0 x2 h6 y77 ff4 fs2 fc0 sc0 ls2 ws0">望的字体、<span class="_ _e"></span>字号、<span class="_ _a"></span>粗体<span class="ff1 ls0">/<span class="_ _5"></span></span>斜体<span class="_ _3"></span>等字体属性。<span class="_ _d"></span>为了在这里避开这一问题,<span class="_ _e"></span>我们只使用了来自环境的标</div><div class="t m0 x2 hb y78 ff4 fs2 fc0 sc0 ls4 ws0">题字体</div><div class="t m2 x26 hb y79 ff4 fs2 fc0 sc0 ls0 ws0">—</div><div class="t m0 x27 h6 y79 ff4 fs2 fc0 sc0 ls4 ws0">它是用在对话框标题栏上的字体,而且它的粗细大小合适。<span class="ff1 ls0"> </span></div><div class="t m0 x18 h6 y7a ff4 fs2 fc0 sc0 ls4 ws0">仅有字体的指针是不够的,还必须告诉图形上下文去使用它。<span class="ff1 ls0"> </span></div><div class="t m0 x2 h8 y7b ff1 fs5 fc0 sc0 ls0 ws0"> </div><div class="t m1 x1a h9 y7c ff7 fs6 fc0 sc0 ls11 ws0">gc.UseFont(font); </div><div class="t m0 x2 h8 y7d ff1 fs5 fc0 sc0 ls0 ws0"> </div><div class="t m0 x18 h6 y7e ff4 fs2 fc0 sc0 ls4 ws0">这个<span class="_ _16"> </span><span class="ff1 ls2d">UseFont()<span class="_ _5"></span></span><span class="ls2">为<span class="_ _3"></span>所有后来的文本绘图函数设置字<span class="_ _3"></span>体,直到发出了另一个<span class="_ _16"> </span><span class="ff1 ls2d">UseFont()</span><span class="ls4">调用,或</span></span></div><div class="t m0 x2 h6 y7f ff4 fs2 fc0 sc0 ls4 ws0">调用了<span class="_ _1"> </span><span class="ff1 ls10">DiscardFont()</span>为止。<span class="ff1 ls0"> </span></div><div class="t m0 x18 h6 y80 ff4 fs2 fc0 sc0 ls4 ws0">现在需要在<span class="_ _1"> </span><span class="ff1 ls7">rect<span class="_"> </span></span>矩形中居中绘制文本。<span class="ff1 ls0"> </span></div><div class="t m0 x2 h8 y81 ff1 fs5 fc0 sc0 ls0 ws0"> </div><div class="t m1 x1a h9 y82 ff7 fs6 fc0 sc0 ls11 ws0">TInt baseline =rect.Height()/2 +font->AscentInPixels()/2; </div><div class="t m1 x1a h9 y83 ff7 fs6 fc0 sc0 ls11 ws0">gc.DrawText(*iHelloWorld, rect, baseline, CGraphicsContext::ECenter); </div><div class="t m0 x2 h8 y84 ff1 fs5 fc0 sc0 ls0 ws0"> </div><div class="t m0 x18 h6 y85 ff4 fs2 fc0 sc0 ls4 ws0">其中,<span class="ff1 ls2e">iHelloW<span class="_ _d"></span>orld<span class="_"> </span><span class="ff4 ls4">是指向包含要绘制的文字的描述符的指针。</span><span class="ls0"> </span></span></div></div><div class="pi" data-data='{"ctm":[1.841248,0.000000,0.000000,1.841248,0.000000,0.000000]}'></div></div>
<div id="pf4" class="pf w0 h0" data-page-no="4"><div class="pc pc4 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/6240d690d62d7b1199464c9b/bg4.jpg"><div class="t m0 x28 h2 y86 ff1 fs0 fc0 sc0 ls2f wsc">17.2 CGraphicsContext <span class="_ _14"></span>API </div><div class="t m0 x1c h2 y28 ff1 fs0 fc0 sc0 ls0 ws1">– 331 – </div><div class="t m0 x18 h6 y87 ff4 fs2 fc0 sc0 ls2 ws0">这个<span class="_ _15"> </span><span class="ff1 ls30">DrawT<span class="_ _a"></span>ext()<span class="ff4 ls2">函数使用图形上下文的画笔、字体<span class="_ _3"></span>设置来方便地绘制文本,并使用当<span class="_ _3"></span>前画刷</span></span></div><div class="t m0 x2 h6 y88 ff4 fs2 fc0 sc0 ls17 ws0">设置来清除整个矩形区域。水平对齐由它的最后一个参数<span class="_ _5"></span>指定(这里我们指定它为<span class="_ _f"> </span><span class="ff1 ls31">Cgraphics </span></div><div class="t m0 x2 h6 y89 ff1 fs2 fc0 sc0 ls32 ws0">Context::ECenter<span class="ff4 ls4">,表示文本应该水平居中)<span class="_ _7"></span><span class="ls0">。<span class="_ _5"></span><span class="ff1"> </span></span></span></div><div class="t m0 x2 ha y8a ff1 fs7 fc0 sc0 ls15 ws9">17.1.5 <span class="ff4 ls16 ws0">垂直对齐<span class="ff1 ls0"> </span></span></div><div class="t m0 x18 h6 y8b ff1 fs2 fc0 sc0 ls1b ws0">DrawT<span class="_ _d"></span>ext()<span class="_ _5"></span><span class="ff4 ls2">没有<span class="_ _3"></span>处理垂直对齐,<span class="_ _d"></span>因为所使用的算法并不难<span class="_ _d"></span>(不像水平对齐)<span class="_ _7"></span>,<span class="_ _a"></span>它不依赖字符串</span></div><div class="t m0 x2 h6 y8c ff4 fs2 fc0 sc0 ls4 ws0">文本。<span class="_ _0"></span><span class="ls2">必须从矩形的顶端向下<span class="_ _3"></span>以像素来指定基线,<span class="_ _18"></span>因此如图<span class="_ _1"> </span><span class="ff1 ls1a">17.2<span class="_"> </span></span>所示,<span class="_ _18"></span>从矩形高度的一半开始<span class="_ _18"></span><span class="ls4">(从</span></span></div><div class="t m0 x2 h6 y8d ff4 fs2 fc0 sc0 ls4 ws0">上往下度量)<span class="_ _7"></span>,然后加上字体高度的一半。<span class="ff1 ls0"> </span></div><div class="t m0 x29 hc y8e ff1 fs8 fc0 sc0 ls0 ws0"> </div><div class="t m0 x2a hd y8f ff4 fs6 fc0 sc0 ls0 ws0">图<span class="_ _4"> </span><span class="ff1 ls23 wsd">17.2 </span><span class="ls25">计算垂直对齐</span><span class="ff1"> </span></div><div class="t m0 x18 h6 y90 ff4 fs2 fc0 sc0 ls4 ws0">至此,已经绘制好文本。因为已使用完字体,所以必须删除它。<span class="ff1 ls0"> </span></div><div class="t m0 x2 h8 y91 ff1 fs5 fc0 sc0 ls0 ws0"> </div><div class="t m1 x1a h9 y92 ff7 fs6 fc0 sc0 ls11 ws0">gc.DiscardFont(); </div><div class="t m0 x2 h8 y93 ff1 fs5 fc0 sc0 ls0 ws0"> </div><div class="t m0 x18 h6 y94 ff9 fs2 fc0 sc0 ls4 ws0">为了避免内存泄漏,在这一阶段删除字体非常重要。<span class="ff1 ls0"> </span></div><div class="t m0 x2 h7 y95 ff6 fs1 fc0 sc0 ls33 ws0">17.2 <span class="_ _15"> </span> <span class="_ _15"> </span>CGraphicsContext API </div><div class="t m0 x18 h6 y96 ff4 fs2 fc0 sc0 ls2 ws0">所有具体的图形上下文类是从<span class="_ _15"> </span><span class="ff1 ls2e">CGraphicsContex<span class="_ _5"></span>t<span class="_ _15"> </span></span>中派生而来的,<span class="ff1 ls34">CGraphicsContext<span class="_ _19"> </span></span>为设备无</div><div class="t m0 x2 h6 y97 ff4 fs2 fc0 sc0 ls4 ws0">关的绘图提供了内容丰富的<span class="_ _1"> </span><span class="ff1 lsb">API<span class="_ _5"></span></span>。它的主要特征用<span class="_ _1"> </span><span class="ff1 lsa">UML<span class="_"> </span></span>表示,如图<span class="_ _4"> </span><span class="ff1 ls35">17.3<span class="_"> </span></span>所示。<span class="ff1 ls0"> </span></div><div class="t m0 x2b hc y98 ff1 fs8 fc0 sc0 ls0 ws0"> </div><div class="t m0 x3 hd y99 ff4 fs6 fc0 sc0 ls0 ws0">图<span class="_ _4"> </span><span class="ff1 ls23 wsd">17.3 </span><span class="ls25">图形上下文<span class="_ _1"> </span><span class="ff1 ls36">API<span class="_ _b"> </span></span></span>类<span class="_ _5"></span><span class="ff1"> </span></div><div class="t m0 x2c hd y9a ff1 fs6 fc0 sc0 ls0 ws0"> </div><div class="t m0 x2c he y9b ffa fs6 fc0 sc0 ls25 ws0">画笔、画刷、字体等</div></div><div class="pi" data-data='{"ctm":[1.841248,0.000000,0.000000,1.841248,0.000000,0.000000]}'></div></div>
<div id="pf5" class="pf w0 h0" data-page-no="5"><div class="pc pc5 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/6240d690d62d7b1199464c9b/bg5.jpg"><div class="t m0 x2 h2 y27 ff8 fs0 fc0 sc0 ls0 ws0">第<span class="_ _1"> </span><span class="ff1">17<span class="_"> </span></span>章<span class="ff1 ls26"> </span>图形显示<span class="ff1"> </span></div><div class="t m0 x2 h2 y28 ff1 fs0 fc0 sc0 ls0 ws1">– 332 – </div><div class="t m0 x18 h6 y87 ff1 fs2 fc0 sc0 ls7 ws0">CGraphicsContext<span class="_"> </span><span class="ff4 ls2">包含主要的绘图函数,<span class="_ _e"></span>在<span class="_ _4"> </span><span class="ff1 lsf">gdi.h<span class="_"> </span></span>中定义。<span class="_ _e"></span>所有的绘图都使用当前的画笔、<span class="_ _e"></span>画</span></div><div class="t m0 x2 hb y88 ff4 fs2 fc0 sc0 ls2 ws0">刷和字体设置来完成,并根据<span class="_ _3"></span>当前设置的剪裁区域进行剪<span class="_ _3"></span>裁。画笔、画刷、字体和剪裁区域<span class="_ _3"></span>设置</div><div class="t m0 x2 h6 y89 ff4 fs2 fc0 sc0 ls4 ws0">为图形函数提供上下文,由此得到类的名称。<span class="ff1 ls0"> </span></div><div class="t m0 x18 hf y9c ff9 fs2 fc0 sc0 ls2 ws0">只能设置图形上下文设置。这<span class="_ _3"></span>里没有画笔、画刷等的类,<span class="_ _3"></span>并且不能通过询问图形上下文来找</div><div class="t m0 x2 hf y9d ff9 fs2 fc0 sc0 ls2 ws0">出当前的设置。如果需要保存<span class="_ _3"></span>它的设置,可以保持图形上<span class="_ _3"></span>下文;如果需要丢弃所有的设置,<span class="_ _3"></span>也可</div><div class="t m0 x2 h6 y9e ff9 fs2 fc0 sc0 ls4 ws0">以通过一个简单的函数调用来重置图形上下文。<span class="ff1 ls0"> </span></div><div class="t m0 x18 h6 y9f ff4 fs2 fc0 sc0 ls2 ws0">本书用许多实例演示了绘制函<span class="_ _3"></span>数,<span class="_ _e"></span>同时,<span class="_ _1a"></span><span class="ff1 ls5">S60<span class="_"> </span><span class="ff4 ls0">和<span class="_ _2"> </span></span><span class="lse wse">UIQ S<span class="_ _5"></span>DK<span class="_"> </span></span><span class="ff4 ls0">为<span class="_ _2"> </span></span><span class="ls10">CGraphicsContext<span class="_"> </span><span class="ff4 ls2">提供了全面的</span></span></span></div><div class="t m0 x2 h6 ya0 ff4 fs2 fc0 sc0 ls4 ws0">文档资料。它们还包含了一个实例程序<span class="_ _1"> </span><span class="ff1 ls7">FontsShell</span>,说明了本节中包含的所有函数。<span class="_ _5"></span><span class="ff1 ls0"> </span></div><div class="t m0 x2 ha ya1 ff1 fs7 fc0 sc0 ls15 ws9">17.2.1 <span class="ff4 ls16 ws0">坐标类<span class="ff1 ls0"> </span></span></div><div class="t m0 x18 h6 ya2 ff4 fs2 fc0 sc0 ls2 ws0">绘制图形到用像素定义坐标系<span class="_ _3"></span>统的设备上。<span class="_ _d"></span>设备上的每个点均有一个<span class="_ _d"></span>(<span class="ff1 ls1e">x,y</span>)<span class="_ _d"></span>坐标,<span class="_ _a"></span>从位于设</div><div class="t m0 x2 h6 ya3 ff4 fs2 fc0 sc0 ls4 ws0">备左上角的原点度量而得。其中,<span class="ff1 ls0">x<span class="_ _4"> </span></span>坐标沿着向右的方向递增,<span class="ff1 ls0">y<span class="_ _15"> </span></span>坐标沿着向下的方向递增。<span class="ff1 ls0"> </span></div><div class="t m0 x18 hf ya4 ff9 fs2 fc0 sc0 ls2 ws0">在本章的后面,我们将学习像<span class="_ _3"></span>素坐标与现实中的单位,比<span class="_ _3"></span>如英寸或厘米,是如何相联系的。</div><div class="t m0 x2 h6 ya5 ff9 fs2 fc0 sc0 ls4 ws0">现在,我们着重介绍面向像素和屏幕的图形。<span class="ff1 ls0"> </span></div><div class="t m0 x18 h6 ya6 ff4 fs2 fc0 sc0 ls4 ws0">支持点、矩形、尺寸和区域的类在<span class="_ _1"> </span><span class="ff1 ls5">e32std.h<span class="_"> </span></span>中定义。<span class="ff1 ls0"> </span></div><div class="t m0 x1a h6 ya7 ff5 fs2 fc0 sc0 ls0 ws0">•<span class="_ _5"></span><span class="ff1 ls1b wsf"> TPoint<span class="_ _1"> </span></span><span class="ff4 ls4">包含<span class="_ _4"> </span><span class="ff1 ls2d">iX<span class="_"> </span></span><span class="ls0">和<span class="_ _2"> </span><span class="ff1 ls2d">iY<span class="_"> </span></span></span>坐标。</span><span class="ff1"> </span></div><div class="t m0 x1a h6 ya8 ff5 fs2 fc0 sc0 ls0 ws0">•<span class="_ _5"></span><span class="ff1 ls9 ws10"> TRect<span class="_ _1"> </span></span><span class="ff4 ls4">包含两个点:表示左上角的<span class="_ _4"> </span><span class="ff1 ls37">iTl<span class="_"> </span></span>和表示右下角的<span class="_ _1"> </span><span class="ff1 ls38">iBr</span><span class="ls0">。<span class="_ _5"></span><span class="ff1"> </span></span></span></div><div class="t m0 x1a h6 ya9 ff5 fs2 fc0 sc0 ls0 ws0">•<span class="_ _5"></span><span class="ff1 ls39 ws11"> TSize<span class="_ _1"> </span></span><span class="ff4 ls4">包含<span class="_ _4"> </span><span class="ff1 ls34">iW<span class="_ _3"></span>idth<span class="_"> </span><span class="ff4 ls0">和<span class="_ _2"> </span></span><span class="ls7">iHeight<span class="_"> </span><span class="ff4 ls4">尺寸。</span><span class="ls0"> </span></span></span></span></div><div class="t m0 x18 hb yaa ff4 fs2 fc0 sc0 ls2 ws0">这些类装备了各种大量的构造<span class="_ _3"></span>函数、运算符和函数,操纵<span class="_ _3"></span>它们或组合它们,但并未试图封装</div><div class="t m0 x2 h6 yab ff4 fs2 fc0 sc0 ls2 ws0">它们的成员。不需要使用<span class="_ _15"> </span><span class="ff1 ls6">get<span class="_ _15"> </span></span><span class="ls0">和<span class="_ _16"> </span><span class="ff1 ls3a">set<span class="_ _1b"> </span></span></span>函数来访问点的(<span class="ff1 ls1e">x,y</span>)坐标等内<span class="_ _3"></span>容。这样做意义实在不大,</div><div class="t m0 x2 h6 yac ff4 fs2 fc0 sc0 ls4 ws0">因为这些对象的表示完全公开。<span class="ff1 ls0"> </span></div><div class="t m0 x1a h6 yad ff4 fs2 fc0 sc0 ls2 ws0">定义<span class="_ _1"> </span><span class="ff1 ls8">TRect<span class="_ _1"> </span></span>的两个点可以按不同的方式由特<span class="_ _3"></span>定的图形实现来解</div><div class="t m0 x2 hb yae ff4 fs2 fc0 sc0 ls2 ws0">释。一种常见的解释是,把左<span class="_ _3"></span>上角点放到矩形中,把右下<span class="_ _3"></span>角点放到</div><div class="t m0 x2 h6 yaf ff4 fs2 fc0 sc0 ls4 ws0">矩形外,如图<span class="_ _1"> </span><span class="ff1 ls35">17.4<span class="_"> </span></span>所示。<span class="ff1 ls0"> </span></div><div class="t m0 x18 hb yb0 ff4 fs2 fc0 sc0 ls2 ws0">这一定义使某些事情更容易做<span class="_ _3"></span>到,比如计算大小,因为简<span class="_ _3"></span>单地</div><div class="t m0 x2 h6 yb1 ff4 fs2 fc0 sc0 ls2 ws0">用右下角点的<span class="_ _1"> </span><span class="ff1 ls0">x<span class="_ _2"> </span><span class="ff4">和<span class="_ _2"> </span></span><span class="ls6">y <span class="_"> </span></span></span>坐标减去左<span class="_ _3"></span>上角点的<span class="_ _1"> </span><span class="ff1 ls0">x<span class="_ _2"> </span><span class="ff4">和<span class="_ _15"> </span></span>y<span class="_ _4"> </span></span>坐标即可得到。<span class="_ _14"></span>但</div><div class="t m0 x2 hb yb2 ff4 fs2 fc0 sc0 ls2 ws0">它也使得其他事更难完成,比<span class="_ _3"></span>如交互绘制矩形时的计算,<span class="_ _3"></span>因为必须</div><div class="t m0 x2 h6 yb3 ff4 fs2 fc0 sc0 ls2a ws0">将(<span class="_ _5"></span><span class="ff1 ls1e">1,1</span><span class="ls2">)<span class="_ _a"></span>加到指针坐标上,<span class="_ _a"></span>从而正确地包含它的右下角。<span class="_ _d"></span>如果<span class="_ _4"> </span><span class="ff1 ls3b">TRect<span class="_"> </span></span>定义为包含它的右下<span class="_ _3"></span>角,<span class="_ _a"></span>则</span></div><div class="t m0 x2 h6 yb4 ff4 fs2 fc0 sc0 ls4 ws0">让有些事更容易、有些事更难。重要的是,要记住矩形的定义依赖于特定的图形解释。<span class="ff1 ls0"> </span></div><div class="t m0 x18 h6 yb5 ff4 fs2 fc0 sc0 ls2 ws0">矩形应该正规化,<span class="_ _14"></span>使<span class="_ _1"> </span><span class="ff1 ls37">iTl<span class="_"> </span></span>的坐标绝不会比相应的<span class="_ _1"> </span><span class="ff1 ls3c">iBr<span class="_"> </span></span>坐标大。<span class="_ _14"></span>如果在某<span class="_ _1"> </span><span class="ff1 ls18">TRect<span class="_"> </span></span>上进行可能会破</div><div class="t m0 x2 h6 yb6 ff4 fs2 fc0 sc0 ls2 ws0">坏这一条件的计算,<span class="_ _14"></span>则调用<span class="_ _1"> </span><span class="ff1 ls30">Normalize()</span>,<span class="_ _14"></span>根据需要交换<span class="_ _1"> </span><span class="ff1 ls0">x<span class="_ _2"> </span></span>坐标的值和<span class="_ _4"> </span><span class="ff1 ls0">y<span class="_ _2"> </span></span>坐标的值,<span class="_ _14"></span>完成清理工作。<span class="_ _7"></span><span class="ff1 ls0"> </span></div><div class="t m0 x2 ha yb7 ff1 fs7 fc0 sc0 ls15 ws9">17.2.2 <span class="ff4 ls16 ws0">区域相关类<span class="ff1 ls0"> </span></span></div><div class="t m0 x18 h6 yb8 ff1 fs2 fc0 sc0 ls35 ws0">e32std.h<span class="_ _f"> </span><span class="ff4 ls2">中还定义了几个区域相关的类。<span class="_ _5"></span>它们将任意形状的区域定义为几个矩形的联合。区</span></div><div class="t m0 x2 h6 yb9 ff4 fs2 fc0 sc0 ls4 ws0">域类在窗口服务器中使用广泛,但只被用在专门的应用程序中。<span class="ff1 ls0"> </span></div><div class="t m0 x18 hb yba ff4 fs2 fc0 sc0 ls2 ws0">区域可能有非常多的矩形,因<span class="_ _3"></span>此一般来说,区域类能够使<span class="_ _3"></span>用堆分配资源。所有区域类都是高</div><div class="t m0 x2 hb ybb ff4 fs2 fc0 sc0 ls2 ws0">度优化的,并且在终端上以机<span class="_ _3"></span>器指令编码。还有的区域类<span class="_ _3"></span>只需要相对较少的矩形来定义区域<span class="_ _3"></span>,那</div><div class="t m0 x2 h6 ybc ff4 fs2 fc0 sc0 ls2 ws0">么就不必要使用基于堆的分配<span class="_ _3"></span>。<span class="_ _3"></span>虽然点、<span class="_ _3"></span>矩形和尺寸是简单的<span class="_ _1"> </span><span class="ff1 ls0">T<span class="_ _2"> </span></span>类,<span class="_ _3"></span>在任何地方易于分配、<span class="_ _a"></span>并易</div><div class="t m0 x2 h6 ybd ff4 fs2 fc0 sc0 ls2 ws0">于在客户和服务器间的调用传<span class="_ _3"></span>递,<span class="_ _a"></span>但区域要求更细心的管理。<span class="_ _a"></span>跟<span class="_ _4"> </span><span class="ff1 ls0">C<span class="_ _2"> </span></span>类一样,<span class="_ _a"></span>当不再被需要时,<span class="_ _a"></span>必</div><div class="t m0 x2d hc ybe ff1 fs8 fc0 sc0 ls0 ws0"> </div><div class="t m0 x2e hd ybf ff4 fs6 fc0 sc0 ls0 ws0">图<span class="_ _4"> </span><span class="ff1 ls3d ws12">17.4 TRect<span class="_ _1"> </span></span><span class="ls25">的解释</span><span class="ff1"> </span></div></div><div class="pi" data-data='{"ctm":[1.841248,0.000000,0.000000,1.841248,0.000000,0.000000]}'></div></div>