- 问题现象
“GMap的GMapMarker本身提供的重载函数OnRender(graphics g)中的 Graphics 与 自己用 Mapcontrol.CreateGraphics()创建的 Graphics 之间有一个渲染偏差!”
- 原因
刚开始很郁闷,没办法在指定的地方方便的使用 FromLatLngToLocal() 去绘制想要的东西。瞎捣鼓的半天发现,前者以GMapMarker经纬度的点为Graphics的原点(0,0),而后者则是常见的以屏幕左上角为Graphics的原点(0,0),其间差异使得绘制的东西位置始终不对。
在查看源码后发现其间有一个 RenderOffset (类型为 Point))。而 GMapMarker 的 LocalPosition 的源码计算过程中就会有加上这个偏差,该计算过程大致如下:
- 调用 Mapcontrol 的 FromLatLngToLocal()方法 ;Position (Longitude,Latitude) => ScreenPoint(x,y)
- 减去渲染偏差 RenderOffset; ScreenPoint(x,y)=> LocalPosition(x,y)
很扯的是 dll 的api里并没有 提供这个 RenderOffset,而RenderOffset 的定义比较复杂,正向计算条件巨多。或许是设计者就觉得我们只在GMapMarker的周围操作,所以以该点为Graphics 的原点 会比较方便。but 我们还要继承GMapMarker去做许多其他更复杂的事情,去满足甲方爸爸的天马行空的需求呢,所以去获得这个 RenderOffset 还是很有必要的。
我们曲线救国、反向推算便可以很简单的获得 RenderOffset,给出方法如下
- 解决方法
- 调用 Mapcontrol 的 FromLatLngToLocal()方法 ;Position (Longitude,Latitude) => ScreenPoint(x,y)
- 减去LocalPosition ; ScreenPoint(x,y)=> RenderOffset(x,y)
OK,终于可以用gdi去随意盘它了hhh