几种绘制半透明多边形/绘制半透明矩形的方法

1、GDI

    步骤1)创建内存兼容DC

        HDC hBitmapDC = CreateCompatibleDC(hDC);
        HBITMAP hBitmap = CreateCompatibleBitmap(hDC, rt.Width(), rt.Height());
        SelectObject(hBitmapDC,hBitmap);

    步骤2)在内存DC中绘图

        FillRgn(hBitmapDC, (HRGN)rgn, (HBRUSH)m_pGdiBrush);

        Rectangle(hBitmapDC, 0, 0, 100, 100);
        ...

    步骤3) 半透明混合

        BLENDFUNCTION bf;
        bf.BlendOp = AC_SRC_OVER;
        bf.BlendFlags = 0;
        bf.AlphaFormat = 0;
        bf.SourceConstantAlpha = 50;
        AlphaBlend(hDC,rt.left,rt.top,rt.Width(),rt.Height(),hBitmapDC,0,0,rt.Width(),rt.Height(),bf); 

 

2、GDI+

    步骤1) 创建半透明画刷

        m_pBrush = new SolidBrush(Color(128, GetRValue(clrMask), GetGValue(clrMask), GetBValue(clrMask))); // 透明度 128

    步骤2)使用画刷绘图

         Graphics graphics(hDC);
         graphics.FillPolygon(&m_pBrush, pts, 3, FillModeAlternate); 

 

效率: GDI+  >  GDI。

使用GDI+绘图简单而高效,所以推荐使用GDI+。

 

 3、Direct Draw

    此方法比较复杂,没有对Direct Draw有一定的了解,不推荐此方法。

    代码比较多,不做列举,需要注意的地方有:

使用Direct Draw时,注意,绘制半透明多边形的时候,因为牵涉到已有的图像数据,所以会对绘图页面原有的图像进行读取操作。如果当前绘制页面开辟在显存中的时候,对显存的读操作会导致整个渲染流水线的暂停,从而严重影响程序的效率,此时,绘制半透明多边形就会变得异常的慢。这时候需要将绘制页面从显存中更改至内存中。或者在内存中创建一个过度页面,绘制完成后再往显存页面上贴图。效率会有显著提升,实测:提升30~40倍。


示例下载:http://download.csdn.net/detail/qq_23992597/9501592
好的,以下是使用ArcGIS API for JavaScript实现该功能的示例代码: ```javascript require([ "esri/Map", "esri/views/MapView", "esri/layers/FeatureLayer", "esri/widgets/Sketch", "esri/geometry/geometryEngine", "esri/Graphic" ], function(Map, MapView, FeatureLayer, Sketch, geometryEngine, Graphic) { var map = new Map({ basemap: "streets-navigation-vector" }); var view = new MapView({ container: "viewDiv", map: map, center: [-118.805, 34.027], zoom: 13 }); var featureLayer = new FeatureLayer({ url: "https://services.arcgis.com/V6ZHFr6zdgNZuVG0/arcgis/rest/services/Los_Angeles_County_Parcels/FeatureServer/0" }); map.add(featureLayer); var sketch = new Sketch({ view: view, layer: featureLayer, creationMode: "update" }); view.ui.add(sketch, "top-right"); sketch.on("update", function(event) { if (event.state === "complete") { var polygon = event.graphic.geometry; featureLayer.queryFeatures().then(function(results) { results.features.forEach(function(feature) { var geometry = feature.geometry; if (geometry.type === "polygon" && geometryEngine.contains(polygon, geometry)) { var highlightSymbol = { type: "simple-fill", color: [255, 0, 0, 0.5], style: "solid", outline: { color: [255, 0, 0, 1], width: 2 } }; var highlightGraphic = new Graphic({ geometry: geometry, symbol: highlightSymbol }); view.graphics.add(highlightGraphic); } }); }); } }); }); ``` 在上述代码中,我们首先创建了一个地图和地图视图对象,并添加了一个要素图层。接着,我们创建了一个Sketch工具,并将其添加到视图中。当用户使用Sketch工具绘制多边形后,我们会监听其`update`事件,并在事件处理函数中查询要素图层中的所有要素,然后遍历每个要素,判断其是否为多边形类型并且是否被绘制多边形包含。如果是,则创建一个高亮显示的图形,并将其添加到视图的graphics图层中。在上述代码中,我们使用了ArcGIS API for JavaScript提供的`geometryEngine`模块的`contains`方法来判断是否包含。最后,我们还需要设置高亮显示图形的样式,这里使用了一个简单的红色半透明填充样式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值