2017-02-18 115 views
0

我可以改變我的更新GMap.NET標記圖像在C#

markers.Markers[2].Position = new PointLatLng(30.0000, 30.00000); 

標記的位置,但我怎樣才能改變標記圖標與設置像上面一個varible? 我聲明點作爲

GMap.NET.WindowsForms.GMapMarker marker3 = 
       new GMap.NET.WindowsForms.Markers.GMarkerGoogle(
        new GMap.NET.PointLatLng(30.0000, 30.00000), 
        new Bitmap("images/2.png")); 

感謝...

+0

當我聲明一個變量,如上所述,我可以再次達到標記變量,就像'marker3 [index] = new Bitmap(「images/2.png」);'??? –

+0

不,因爲您無法將圖像分配給標記,因爲圖像是標記的屬性。 – rdoubleui

回答

0

更新該標記的圖像的問題是,Image屬性是不能公開訪問,因此你無法更新圖像的方式。

有兩種可能性:第一種是用新的替換標記引用,讓您有機會設置新圖像並複製當前標記的位置。但是,這不是一種乾淨的方式,因爲您不必要地創建大量引用,而只是根據用例立即處理它們。如果這是一次性更新,那麼這種方法很好。

最好的方法是根據Google標記從GMapMarker中派生出來(您可以使用它作爲模板,而忽略整個谷歌特定的圖標邏輯)。你是否熟悉派生的概念?這將需要更多的努力,但將是值得的,可以幫助。

另外您的主要參考可能是project's github page

EDIT

using System.Drawing; 

public class GImageMarker : GMapMarker 
{ 
    public Bitmap Bitmap { get; set; } 

    public GImageMarker(PointLatLng p, Bitmap Bitmap) 
     : base(p) 
    { 
     this.Bitmap = Bitmap; 
     Size = new System.Drawing.Size(Bitmap.Width, Bitmap.Height); 
     Offset = new Point(-Size.Width/2, -Size.Height); 
    } 

    public override void OnRender(Graphics g) 
    { 
     g.DrawImage(Bitmap, LocalPosition.X, LocalPosition.Y, Size.Width, Size.Height); 
    } 
} 
+0

我再次用新圖像宣佈標記,但我不喜歡這種方式。我不知道C#,所以我不想搞亂GMap.NET庫:D –

+0

這很好,你不會搞砸任何東西:)通過派生你會擴大標記的功能。該擴展只能存在於您的代碼中,我可以在回到計算機後提供樣本。 – rdoubleui

+0

添加了派生標記的最小樣本,該樣本包含圖像,請將此類添加到您的項目中,然後嘗試是否適合您。 – rdoubleui

1

爲了解決這個問題,我接觸的庫的創建者:無線電技師。他提到了一些名爲'GMarkerArrow'的代碼。下面是代碼:

namespace Demo.WindowsForms.CustomMarkers 
{ 
    using System; 
    using System.Drawing; 
    using System.Runtime.Serialization; 
    using GMap.NET; 
    using GMap.NET.WindowsForms; 

    [Serializable] 
    public class GMarkerArrow : GMapMarker, ISerializable 
    { 
     [NonSerialized] 
     public Brush Fill = new SolidBrush(Color.FromArgb(155, Color.Blue)); 

     //[NonSerialized] 
     //public Pen Pen = new Pen(Brushes.Blue, 5); 

     static readonly Point[] Arrow = new Point[] { new Point(-7, 7), new Point(0, -22), new Point(7, 7), new Point(0, 2) }; 

     public float Bearing = 0; 
     private float scale = 1; 

     public float Scale 
     { 
      get 
      { 
       return scale; 
      } 
      set 
      { 
       scale = value; 

       Size = new System.Drawing.Size((int)(14 * scale), (int)(14 * scale)); 
       Offset = new System.Drawing.Point(-Size.Width/2, (int)(-Size.Height/1.4)); 
      } 
     } 

     public GMarkerArrow(PointLatLng p) 
      : base(p) 
     { 
      Scale = (float)1.4; 
     } 

     public override void OnRender(Graphics g) 
     { 
      //g.DrawRectangle(Pen, new System.Drawing.Rectangle(LocalPosition.X, LocalPosition.Y, Size.Width, Size.Height)); 
      { 
       g.TranslateTransform(ToolTipPosition.X, ToolTipPosition.Y); 
       var c = g.BeginContainer(); 
       { 
        g.RotateTransform(Bearing - Overlay.Control.Bearing); 
        g.ScaleTransform(Scale, Scale); 

        g.FillPolygon(Fill, Arrow); 
       } 
       g.EndContainer(c); 
       g.TranslateTransform(-ToolTipPosition.X, -ToolTipPosition.Y); 
      } 
     } 

     public override void Dispose() 
     { 
      //if(Pen != null) 
      //{ 
      // Pen.Dispose(); 
      // Pen = null; 
      //} 

      if (Fill != null) 
      { 
       Fill.Dispose(); 
       Fill = null; 
      } 

      base.Dispose(); 
     } 

     #region ISerializable Members 

     void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) 
     { 
      base.GetObjectData(info, context); 
     } 

     protected GMarkerArrow(SerializationInfo info, StreamingContext context) 
      : base(info, context) 
     { 
     } 

     #endregion 
    } 
} 

保存爲GMarkerArrow.cs並將其添加到您的項目。通過以下

using Demo.WindowsForms.CustomMarkers; 

現在你可以使用新的標誌: 添加到您的Form 1代碼

GMarkerArrow marker1 = new GMarkerArrow(new PointLatLng(-30, -40)); 
      marker1.ToolTipText = "blablabla"; 
      marker1.ToolTip.Fill = Brushes.Black; 
      marker1.ToolTip.Foreground = Brushes.White; 
      marker1.ToolTip.Stroke = Pens.Black; 
      marker1.Bearing = 30; // Rotation angle 
      marker1.Fill = new SolidBrush(Color.FromArgb(155, Color.Blue)); // Arrow color 
      markers.Markers.Add(marker1); 
      gMapControl1.Overlays.Add(markers); 

此外,我想感謝@rdoubleui,謝謝你,先生。 我希望這有助於每個人。