2009-06-04 9 views
0

Ich habe Code, mit dem programmgesteuert ein Dokument erstellt wird, das an den Drucker gesendet wird. Es geht ungefähr so:C# graphics creation

private void pd_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs ev) 
{  
     ev.Graphics.DrawImage(pictureBox1.Image, 50, 100); 

     string drawToday="Date  : "+strToday; 
     string drawPolicyNo="Policy # : " + strPolicyNo; 
     string drawUser="User  : " + strUser; 
     Font drawFont=new Font("Arial",30); 
     SolidBrush drawBrush=new SolidBrush(Color.Black); 
     PointF drawPointToday=new Point(50,400); 
     PointF drawPointPolicyNo=new Point(50,450); 
     PointF drawPointUser=new Point(50,500); 
     ev.Graphics.DrawString(drawToday,drawFont,drawBrush,drawPointToday); 
     ev.Graphics.DrawString(drawPolicyNo,drawFont,drawBrush,drawPointPolicyNo); 
     ev.Graphics.DrawString(drawUser,drawFont,drawBrush,drawPointUser); 
} 

Seinen wirksamen Code, aber jetzt muß ich das gleiche Verfahren tun, sondern es auf eine Bilddatei zu schreiben, so dass es zu einem Browser gesendet werden kann und von dort gedruckt. Es sollte relativ einfach sein, diesen Code wiederzuverwenden, aber ich werde leider auf der Zeichenfläche aufgehängt, um das PrintPageEventArgument zu ersetzen.

Dank

bearbeiten: THanks ich, dass ich nur ein weiteres Graphics-Objekt, sondern das Graphics-Objekt selbst einen öffentlichen Konstruktor nicht haben, also was ich suche ist ein Vorschlag auf welches Objekt I müssen substantiiert werden, um ein Graphics-Objekt zum Zeichnen erstellen zu können. Ich dachte vielleicht Bitmap? Bitmaps sind natürlich pixelbasiert statt punktbasiert, daher war ich nicht sicher, ob dies das beste Medium ist.

+0

Sie können eine Grafik erhalten Objekt von vielen verschiedenen Orten wie Bilder und Kontrollen. Sie werden wahrscheinlich die Eigenschaften von DpiX, DpiY, PageScale und PageUnit (und vielleicht noch ein paar andere, die ich nicht mehr im Kopf habe) untersuchen, um Grafikobjekte aus verschiedenen Quellen auf ähnliche Weise zu verhalten. Verwenden Sie den Debugger, um die Werte des Grafikobjekts in Ihrem PrintPage-Ereignis zu untersuchen, um einen guten Startpunkt zu erhalten. –

Antwort

5

Wenn ich Sie richtig verstanden könnten Sie einfach den Code aus dem Event-Handler in eine andere Methode ausbricht ein Graphics-Objekt als Parameter akzeptieren:

private void Print(Graphics g) 
{ 
    g.DrawImage(pictureBox1.Image, 50, 100); 

    string drawToday="Date  : "+strToday; 
    string drawPolicyNo="Policy # : " + strPolicyNo; 
    string drawUser="User  : " + strUser; 
    Font drawFont=new Font("Arial",30); 
    SolidBrush drawBrush=new SolidBrush(Color.Black); 
    PointF drawPointToday=new Point(50,400); 
    PointF drawPointPolicyNo=new Point(50,450); 
    PointF drawPointUser=new Point(50,500); 
    g.DrawString(drawToday,drawFont,drawBrush,drawPointToday); 
    g.DrawString(drawPolicyNo,drawFont,drawBrush,drawPointPolicyNo); 
    g.DrawString(drawUser,drawFont,drawBrush,drawPointUser); 
} 

Und dann diese Methode aus dem Ereignishandler aufrufen:

private void pd_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs ev) 
{  
     Print(ev.Graphics); 
} 

Dann können Sie die gleiche Methode wiederverwenden die Ausgabe an jedem anderen Graphics-Instanz für den Druck:

using (Bitmap img = new Bitmap(width, height)) 
using (Graphics g = Graphics.FromImage(img)) 
{ 
    Print(g); 
    img.Save(fileName); 
} 
+0

Danke Fredrik, irgendwie was ich dachte. Bitmap wäre der Weg dahin. –

+0

Gern geschehen. Beachten Sie auch heavyds Antwort auf Bildformate, falls Sie mehr Kontrolle über Format, Farbtiefe und so weiter haben möchten. –

2

Ihre Grafiken zu schreiben Objekt auf eine Bilddatei, die Sie so etwas tun können:

public void SaveImage(Graphics surface) 
{ 
    Bitmap bmp = new Bitmap(50, 100, surface); 
    bmp.Save("filename.png", ImageFormat.Png); 
} 

Sie andere Formate aus der Imageformat-Klasse können wählen, wie JPG, BMP usw.