AO的Display对象简介一【转载】

AO的Display对象简介一【转载】

Display 库包含了支持向输出装置绘制符号体系的组件。

   

    Display简单的说就是一个制图界面。这个制图界面可以是任何一个可以用Window设置环境表示的输出文件、内存流的硬件设备。每个自己的管理显示都可以转换成从真实的空间转化到设备空间的坐标系统的句柄对象。下面提供标准的显示:Screen Display可以抽象一个正常的应用程序窗口。它可以执行滚动和备份存储(也可能是多层备份存储)。Simple Display是可以用Window设备着色的设备,像:打印机,元文件,位图,二级窗口。

       这个Display对象使应用开发人员很容易在各种输出设备上画图片。这些对象允许你为真实世界的坐标系统到屏幕,打印机,输出文件进行形状着色。应用特征像滚动,备份存储,打印框架都可以执行。如果有一些必须的没有被标准对象支持,自定义对象可以被创建,来执行一到多个标准显示接口。

       一般来说,你一定有一个设备来在窗口中做任何一个绘制。这个句柄就定义为你正在绘制的设备。有一些例子设备是窗口,打印机,位图元文件。在Arc Objects中,一个显示是一个简单的窗口设备环境的包装。

       有两个标准的显示对象是:Screen Display Simple Display。这个Screen Display对象抽象成一个正常的应用程序的窗口和执行滚动和备份存储。这个Simple Display对象抽象成其它的进行着色的窗口设备,像:打印机和元文件。

       当你想要在打印机,导出文件,简单的窗口预览,就会用Simple Display组件类。指定你想要用开始绘制的句柄。这个说明了在窗口,打印机,位图和元文件上绘制。这个句柄在Arc Objects外被创建就会调用GDI函数。

       当你想要在你的应用程序主窗口绘制地图就会用到Screen Display组件类。这个组件类操纵高级应用特征象缓冲区显示和滚动条。开始绘制要为联合窗口指定句柄。正常情况下,当你在你的应用中的WM_PAINT够本中调用GDI BeginPaint函数,这个句柄会被返回。二者选一,开始绘制,你可以为句柄参数指定0值,或者联合窗口自动创建句柄。正常情况下,一个Screen Display为了提高绘制性能用在内部缓冲区显示。在绘画队列中,输出会直接到激活的缓冲区,每一秒一次,这个窗口将不停地从缓冲区中更新。如果你想要阻止更新,开如绘画时指定句柄的记录。

    用这个IDisplay接口在设备上画点,线,面,矩形和文字。这个接口在Display对象中的DisplayTransformation对象中提供。

       DisplayTransformation,这个对象定义了怎 样将真实坐标系统映射到输出设备。三个矩形定义转换。范围指定完整的范围在真实世界中。可视范围指定为当前可视区。并且设备框架指定为哪些在输出设备上的 可视范围的地方。设备框架的纵横比率不一定总是匹配可视范围的纵横比率的,转换计算真实的可视范围来匹配设备框架。这个被叫着匹配边界和真实坐标。所有的 坐标能够通过简单设置转换特征来可视范围的中心。

    缓冲区显示

    这个是缓冲器显示最基础后的思想。主要的应用窗口被视图(IActiveView)控制。当前有两个视图组件类执行:Map(数据视图)和PageLayout(排版视图)。Screen Display尽可以为客户端许多缓冲器(一个缓冲器仅仅是一个依靠位图的设备)。当缓冲器被创建,将得到一个缓冲器的ID号。这个ID号用来指定活动缓冲器,无效的或者是为了一个有目的句柄画的缓冲器。另外是一个动态缓冲器,Screendisplay提供对发生在显示上的所有画的操作进行记录。客户端用StartRecordingFinishrecording方法管理记录。

       为了看缓冲器在Arc Objects中怎样被执行,Map组件类将会被检查。在这个简单的例子中,Map为所有图层创建一个缓冲器,如果有注释层或图片创建另外一个,如果有特征选择创建第三个。它也会记录所有的输出。这个IActiveView::PartialRefresh方法只要有少许可能就会用这个缓冲器知识,为了我们能够尽可能从缓冲器中绘画。这些缓冲器,下面是所有可能的情况:

    1)当应用程序被移动或暴露或者当编辑擦除时,用记录缓冲器进行重画。当一个BitBlt需要的话是非常有效的。

    2)选择新一套特征,仅仅选择维缓冲器无效。特征从缓冲器绘画。图片和注释从缓冲器绘画。仅仅特征选择从草图绘画。

    3)移动一图片元素或者注释到某些特征上。仅仅注释缓冲器无效。特征,特征选择从缓冲器中绘画。仅仅注释从草图绘画。

    4)创建叫着跟踪图层新的一种图层。为了它的缓冲器属性总是返回真的。当新GPS信号被接收,为了显示车辆移动,在图层上移动标记和仅仅跟踪图层是无效的。所有的其它图层都从缓冲器中绘画。仅仅车辆图层从草图绘画。这个使可以成为动态图层。

    5)在一组图层中通过移动几个图层创建一个基础图层和设置这个组图层缓冲器属性为真。现在你可以编辑和最上层的基础图层绘画相结合,不能有从草图重画基础图层。

    6)这个显示过滤的概念允许在任何图层包括用个人符号特征图层进行栅格操作。它有可能创建一个哪些依附一个图层平滑对话框。它设置图层缓冲器属性为真并且用一个透明显示过滤用平滑度来表示的图层的透明度交互控件。其他的一些显示过滤能够被创建执行剪贴,对照,光亮等。

    记录缓冲器

    这个Screen Display能够记录绘画什么。用StartRecording()StopRecording()来让这个显示知道被记录什么。用DrawCache(esriSrcreenRecording)来显示记录什么。用Get_CacheMenDC(esriScreenRecording)来得到为记录的位图内存句柄。这个功能有几个重要的用法。

    1、首先,一个单一的位图存储备份简单的执行,仅仅像下面一样用一个绘画队列就可的。


[Visual Basic 6.0]

Dim isCacheDirty As Boolean

m_ipScreen.IsCacheDirty(esriScreenRecording, isCacheDirty)

if (isCacheDirty) then ' draw from scratch

 m_ipScreen->StartRecording()

 m_ipScreen->StartDrawing(hPaintDC, esriNoScreenCache)

 DrawContents()

 m_ipScreen->FinishDrawing()

 m_ipScreen->StopRecording()

else // draw from offscreen bitmap

 m_ipScreen->DrawCache(hPaintDC, esriScreenRecording, 0, 0)

End If

    2、第二,当有一个单一的位图(记录)用来快速刷新,客户端能够分派显示缓冲器(用IScreenDisplay::AddCache来创建)来缓冲绘画视图不同的阶段。最后,当为了执行有趣的高级着色技术象半透明,你可以访问这个记录的位图。

    中止(caveats

如果在你的地图中任何一部分包含透明度,它将会影响物体怎么刷新。当一个透明层被画,每一个物体都在它的下面,变成图层着色图层的一部分。结果,当每次这个透明图层下某个物体发生变化,它一定要从草图重画。

       如果在微软窗口中相反混淆设置被打开,文字也有透明度。这个意味着哪些在文字下面的执行相反混淆的图层要绘画。结果,不论何时,一个图层变化,注释或自动标注一定要重画。

    怎样缓冲图层

    你想要有他们自己的缓冲显示,要在图层上设置缓冲标记。然后恢复视图。

Private Sub EnableLayerCaches()

 Dim i as Integer

 For i = 0 To m_pMap.LayerCount - 1

    m_pMap.Layer(i).Cached = IIf(chkCustomCaches.Value = 1, True, False)

 Next i

 ' Reactivate

 Dim pMxDoc As IMxDocument

 Set pMxDoc = m_pApp.Document

 pActiveView.Deactivate

 pActiveView.Activate pActiveView.ScreenDisplay.hWnd

 pActiveView.Refresh

End Sub

    旋转

    自从display对象影响哪些显示的所有的实体,理解旋转在display对 象怎样被执行是相当重要。旋转发生在变化水平下面,因此客户的显示变化总是处理没有旋转的形状。举个例子,当你从变化程序中得到一个形状,它是在没有旋转 的空间。当然,当你为转换指定一个区域,这个区域也在没有旋转的空间中。当和多边形面处理时,毎个物体仅仅工作。当和封处理时,物体会更加复杂,因为旋转 矩形不能表示。这是最好的插图的二个例子。

   
1)从转化中得到一个矩形。
   
2)为转化指定一个矩形。

    从转化在得到一个矩形。例如,比方说你想要一个矩形表示在窗口客户区域中,它不可能表示成请求区域成为一个封闭区域(Envelope)。矩形的四个角在地图空间中有唯一的xy值。这个Envelope组件类内在表示是假定为边共享xy值。结果封闭区域通过DisplayTransFormation.FittedBounds不是你真实的想要的区域,因为直角的多边形需要正确显示在非旋转地图空间中。当前有一个Bug是由没有旋转返回的封闭区域引起的。当这个确定了,它应该返回一个苗条膨胀的你所期望的封闭区域。当有一个旋转和执行代码象下面找一些用户显示匹配的矩形多边形面时,大多数客户端避免用这个封闭区域(Envelope)。

inline void ToUnrotatedMap(const RECT& r, IGeometry* pBounds, IDisplayTransformation* pTransform)

{

 WKSPoint mapPoints[5];

 POINT rectCorners[4] = {{r.left, r.bottom}, {r.left, r.top}, {r.right, r.top}, {r.right, r.bottom}};

 pTransform->TransformCoords(mapPoints, rectCorners, 4, esriTransformToMap | esriTransformPosition);

 // build polygon from mapPoints

 mapPoints[4] = mapPoints[0];

 IPointCollectionPtr(pBounds)->SetWKSPoints(5, mapPoints);

 ITopologicalOperator2Ptr(pBounds)->put_IsKnownSimple(VARIANT_TRUE);

}

    为转化指定一个矩形。记住客户端需要在非旋转窨工作和让转化在显示前进行操作旋转。在一个简单的事例中托拉一个矩形。首先,用户看到旋转空间。他们托拉的矩形在旋转空间中。指定它转化前这个工具要转化矩形到非旋转空间。下面的代码展示怎样做的。

[Visual Basic 6.0]

Dim pAreas As IArea

Set pArea = pRotatedExtent

Dim pCenter As IPoint

set pCenter = pArea.Centroid

Dim pTrans As ITransform2D

Set pTrans = pRotatedExtent

pTrans->Rotate(pCenter, ConvertDegreesToRadians(rotation))

Dim pNewExtent As IEnvelope

Set pNewExtent = pRotatedExtent.Envelope

原文地址:https://www.cnblogs.com/lauer0246/p/1099268.html