2009-06-04 1 views
0

У меня есть код, который используется для программного создания документа для отправки на принтер. Это идет что-то вроде этого:Создание C#-графики

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); 
} 

Его эффективный код, но теперь мне нужно сделать то же процедуру, но вместо того, чтобы записать его в файл изображения, так что он может быть отправлен в браузере и распечатать оттуда. Должно быть относительно простым повторное использование этого кода, но, к сожалению, я повесил трубку на том, какую поверхность рисунка использовать для замены PrintPageEventArgument.

Благодаря

Редактировать: Спасибо, я получаю, что мне просто нужно другой графический объект, но графический объект сам по себе не имеет открытый конструктор, так что я ищу это предложение на каком объекте я необходимо подстроить, чтобы иметь возможность создавать объект Graphics для рисования. Я подумал, возможно, растровое изображение? Растровые изображения, конечно, основаны на пикселях, а не на основе точек, поэтому я не был уверен, что это лучший носитель для использования.

+0

Вы можете получить Графический объект из разных мест таких изображений и элементов управления. Вероятно, вы захотите изучить свойства DpiX, DpiY, PageScale и PageUnit (и, возможно, пару других, которые я не помню сейчас), чтобы заставить графические объекты из разных источников вести себя аналогичным образом. Используйте отладчик для исследования значений графического объекта в событии PrintPage, чтобы получить хорошую отправную точку. –

ответ

5

Если я вас правильно понял вы могли бы просто вырваться код из обработчика событий в другой метод принимающему объект Graphics в качестве параметра:

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); 
} 

И затем вызвать этот метод из обработчика событий:

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

Затем вы можете использовать тот же метод для печати вывода на любую другую графику, например:

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

Спасибо Фредрик, как бы то ни было. Растровое изображение было бы способом продолжить это. –

+0

Добро пожаловать. Также обратите внимание на ответ heavyyd на форматы изображений, если вы хотите больше контролировать формат, глубину цвета и тому подобное. –

2

Чтобы написать графику объекта в файл изображения вы можете сделать что-то вроде этого:

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

Вы можете выбрать другие форматы из класса ImageFormat, такие как JPG, BMP, и т.д.