2017-02-13 1 views
-1

Ich habe meine eigene einfache 3D-Engine-Klasse (myGraphics), die ihre Ergebnisse in einer Bitmap-Variable speichert. Diese Bitmap wird dann in eine PictureBox (PictureBox.Image = myGraphics.bmp)Wie Zeichenketten auf WindowsForms Picturebox zeichnen?

platziert Dies funktioniert gut, das Problem kam, als ich einige Punkte auf der Zeichnung markieren musste. Da es keine integrierte Methode zum Zeichnen von Zeichenfolgen auf Bitmap gibt, folgte ich Lösungen in ähnlichen Fragen und jetzt habe ich eine Graphics Variable auf meinem myGraphics, so dass ich die Zahlen dort zeichnen kann. Die wichtigen Bits des Codes sind wie folgt:

public class myGraphics 
{ 
    public Graphics g; 
    public void initialize(int W, int H) 
    { 
     //sets some values 
     g = Graphics.FromImage(bmp); 
     g.SmoothingMode = SmoothingMode.AntiAlias; 
     g.InterpolationMode = InterpolationMode.HighQualityBicubic; 
     g.PixelOffsetMode = PixelOffsetMode.HighQuality; 
    } 
    public void draw() 
    { 
     // code to draw on myGraphics.bmp 
     markpoints(); 
    } 
    public void markpoints() 
    { 
     if (draw_points) { 
      foreach (objecto ob in solidos) { 
       for (int p = 0; p < ob.viewpoints.Count; p++) 
       { 
        // determine position of text (x, y) 
        SolidBrush drawBrush = new SolidBrush(Color.Black); 
        g.DrawString(p.ToString(), new Font("Arial", 10), drawBrush, x, y); 
        g.Flush(); 
       } 
      } 
     } 
    } 

Nun, wenn ich es richtig verstanden habe, g.Flush() sollte die Grafiken g auf dem Bitmap fusionieren, aber es ist nicht so funktioniert, so dass ich die rechtes Bild, aber keine Stiche darauf.

Ich habe es auch versucht: myGraphics.g = PictureBox.CreateGraphics();, um es zu lösen. Bei der Verwendung von Breakpoints im Debug-Modus habe ich festgestellt, dass die Strings mit dieser Methode auf dem Steuerelement angezeigt werden, aber direkt nach der Aktualisierung von PictureBox gelöscht werden.

Also, wie kann ich das lösen, damit ich die Zahlen auf der Zeichnung angezeigt bekommen kann?

+0

Sie ändern die Bitmap, aber es gibt keine Möglichkeit, dass die PictureBox dies wissen kann. Die Image-Klasse hat keine Ereignisse. Es weiß also nicht, dass es das Bild neu streichen muss. Es liegt an Ihnen, die PictureBox 'Invalidate() -Methode aufzurufen, jetzt weiß es. –

+0

das war nicht das Problem, aber es brachte mich dazu, so danke. es ist irgendwie ein dummer Fehler, noch werde ich eine Antwort schreiben –

Antwort

-2

Wenn die PictureBox.Image aktualisiert wird, werden die Grafiken gelöscht. Daher muss markpoints() von außerhalb der Klasse aufgerufen werden, nachdem PictureBox.Image aktualisiert wurde.

Auch die Zuweisung myGraphics.g = Picturebox.CreateGraphics() funktioniert nicht, Änderungen an myGraphics.g werden nicht auf die PictureBox-Steuerelement aktualisiert werden. Die Grafiken der Kontrolle muss auf dem Paint-Ereignis aktualisiert werden, auch e.graphics zu markpoints

vorbei, g.flush() nicht die Grafik mit dem Bitmap verschmelzen, ist es eigentlich nicht notwendig für diesen Code

Also, die endgültige Lösung:

public class myGraphics 
{ 
    // public Graphics g is no longer necessary 
    public void initialize(int W, int H) { //sets some values} 
    public void draw() { // code to draw on myGraphics.bmp } 

    public void markpoints(Graphics graph) 
    { 
     if (draw_points) { 
      graph.SmoothingMode = SmoothingMode.AntiAlias; 
      graph.InterpolationMode = InterpolationMode.HighQualityBicubic; 
      graph.PixelOffsetMode = PixelOffsetMode.HighQuality; 

      foreach (objecto ob in solidos) { 
       for (int p = 0; p < ob.viewpoints.Count; p++) 
       { 
        // determine position of text (x, y) 
        SolidBrush drawBrush = new SolidBrush(Color.Black); 
        g.DrawString(p.ToString(), new Font("Arial", 10), drawBrush, x, y); 
       } 
      } 
     } 
    } 
} 

// Connect to picture box 
myGraphics mg = new myGraphics() 
Picturebox.Image = mg.bmp; 
PictureBox.Invalidate(); // forces update of the control using paint event 

private void PictureBox_Paint(object sender, PaintEventArgs e) 
{ 
    mg.markpoints(e.Graphics); 
} 
+1

_Der Ansatz mit PictureBox.CreateGraphics() ist genug, um das Problem zu lösen_ Nein, höchstwahrscheinlich ist es nicht genug, da das Ergebnis nicht persistieren wird .. Entweder in das Bild zeichnen oder verwende das e.Graphics-Objekt aus dem Paint-Event ..! – TaW

+0

@TaW Ich kann 'e.Graphics() = myGraphics.g' nicht zuweisen, weil' e.Graphics' nur gelesen wird ... bedeutet das, dass ich den 'markpoints()' Code in das Paint-Event setzen muss? –

+0

Ja. Oder Sie können das "e.Graphics" -Objekt an eine Funktion übergeben, die es zum Zeichnen verwendet, beispielsweise "markpoints (e.Graphics)". Beachten Sie jedoch, dass dies vom "Paint" -Ereignis aus aufgerufen werden muss und Sie es nicht speichern oder zwischenspeichern dürfen, da es sonst nicht gültig ist! – TaW

Verwandte Themen