2016-04-08 5 views
0

Ich habe ein transparentes Bild, das auf ein Steuerelement namens Hex gezeichnet wird. Ich halte es auf Form1, und habe einen Generator namens Map.Zeichnen Sie ein Bild, ohne Oberflächen von anderen Steuerelementen neu zu streichen.

Unter Paint(object, PaintEventArgs) von Hex zeichne ich das Bild:

e.Graphics.DrawImage(foo.Properties.Resources.h, ClientRectangle); 

Aber es hält Oberflächen von anderen Kontrollen neu zu streichen:

enter image description here

Wie kann ich das vermeiden?

Für Code von Hex und Map: http://pastebin.com/XsjKc3Yf

+0

den Rest Code Teile, zum Beispiel Konstruktor der Steuerung. Es ist unklar, was Sie jetzt fragen. Welcher Teil des aktuellen Bildes ist ein Repaint anderer Steuerelemente? Ist Ihre Kontrolle dafür verantwortlich, ein einzelnes Sechseck zu zeichnen? –

+0

CreateGraphics ist fast immer ein Fehler. Verwenden Sie das Paint-Ereignis des Containers und verwenden Sie das Grafikobjekt von dort. Dies würde viel besser ohne Kontrolle für jedes Sechseck funktionieren, da sich Ihre Steuerelemente überschneiden. – LarsTech

+0

Nein, ich habe etwas anderes versucht, aber es hat anscheinend nicht funktioniert. Ich hatte eine andere Linie xD – Luka967

Antwort

-1

Ich habe durch die einfachste Weg ging:

  • Hergestellt Hex ein Sonderklasse.

    public class Hex 
    { 
        public Point Location; 
        public Country Holder; 
    
        public Hex(Country holder = null) 
        { 
         Holder = holder; 
        } 
    
        public void DrawMe(Graphics g) 
        { 
         g.DrawImage(Middle_Ages_Country.Properties.Resources.h, new Rectangle(Location, new Size(40, 40))); 
        } 
    } 
    
  • Edited Map Klasse und erstellt eine neue Methode DrawHexes, die bei Bedarf aufgerufen werden. Verwendet auch gepufferte Grafiken, da es einige Zeit braucht, um alles zu zeichnen.

    public Map(int rows, int columns, Form1 owner) 
    { 
        int x = 40, y = 40; 
        // Create map 
        for (int row = 0; row < rows; row++) 
        { 
         List<Hex> r = new List<Hex>(); 
         for (int column = 0; column < columns; column++) 
         { 
          Hex h = new Hex(null) 
          { 
           Location = new System.Drawing.Point(x, y), 
          }; 
          r.Add(h); 
          x += 40; 
         } 
         Grid.Add(r); 
         x -= columns * 40; 
         x = (row % 2) * 20 + 20; 
         y += 30; 
        } 
    } 
    
    public void DrawHexes(Form1 owner) 
    { 
        BufferedGraphicsContext context = BufferedGraphicsManager.Current; 
        BufferedGraphics buf = context.Allocate(owner.CreateGraphics(), owner.ClientRectangle); 
    
        buf.Graphics.Clear(Color.Red); 
    
        foreach (List<Hex> row in Grid) 
        { 
         foreach (Hex h in row) h.DrawMe(buf.Graphics); 
        } 
        buf.Render(); 
    } 
    
+0

Durch das Aufgeben der UserControls haben Sie die Voraussetzungen komplett geändert. Dies hilft Ihnen vielleicht und wenn Sie nicht wirklich Kontrollen brauchen, um zu klicken oder sich zu bewegen, gehen Sie auf alle Fälle los __, aber beantwortet sicherlich nicht die ursprüngliche Frage .__ – TaW

+0

Tut mir leid, wenn ich zu objektiv oder gemein werde. Diese Antwort hat die Frage erfüllt. Ich weiß nicht viel über Grafiken, also bin ich minimal geblieben. – Luka967

Verwandte Themen