关于GMap的GMapMarker在Winform的重载函数OnRender()与其Mapcontrol.CreateGraphics()的渲染偏差(RenderOffset)的计算

  •     问题现象

    “GMap的GMapMarker本身提供的重载函数OnRender(graphics g)中的 Graphics 与 自己用 Mapcontrol.CreateGraphics()创建的 Graphics 之间有一个渲染偏差!”

 

  •     原因

    刚开始很郁闷,没办法在指定的地方方便的使用 FromLatLngToLocal() 去绘制想要的东西。瞎捣鼓的半天发现,前者以GMapMarker经纬度的点为Graphics的原点(0,0),而后者则是常见的以屏幕左上角为Graphics的原点(0,0),其间差异使得绘制的东西位置始终不对。

    在查看源码后发现其间有一个 RenderOffset (类型为 Point))。而 GMapMarker LocalPosition 的源码计算过程中就会有加上这个偏差,该计算过程大致如下:

  1. 调用  Mapcontrol FromLatLngToLocal()方法 ;Position (Longitude,Latitude)  => ScreenPoint(x,y)
  2. 减去渲染偏差 RenderOffset; ScreenPoint(x,y)=> LocalPosition(x,y)

     很扯的是 dll 的api里并没有 提供这个 RenderOffset,而RenderOffset 的定义比较复杂,正向计算条件巨多。或许是设计者就觉得我们只在GMapMarker的周围操作,所以以该点为Graphics 的原点  会比较方便。but 我们还要继承GMapMarker去做许多其他更复杂的事情,去满足甲方爸爸的天马行空的需求呢,所以去获得这个 RenderOffset 还是很有必要的。

    我们曲线救国、反向推算便可以很简单的获得 RenderOffset,给出方法如下

  •     解决方法
  1. 调用  Mapcontrol FromLatLngToLocal()方法 ;Position (Longitude,Latitude)  => ScreenPoint(x,y)
  2. 减去LocalPosition ; ScreenPoint(x,y)=> RenderOffset(x,y)

 

OK,终于可以用gdi去随意盘它了hhh

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值