Сообщений 0 Оценка 351 Оценить |
Трудно совместимые понятия - .Net и матричный принтер. Тем не менее, на нашем предприятии это сочетание оказалось не только возможным, но даже не единичным – во многих наших подразделениях стоят более-менее приличные компьютеры, позволяющие использовать .Net, - и при этом матричные принтеры. Разрабатывая систему расчета заработной платы на .Net и, соответственно, рабочие места экономистов с использованием WinForms, мы пришли к пониманию необходимости обеспечить печать некоторых выходных документов (расчетные листки, ведомости и пр.) в текстовом формате. Так как «штатная» печать в .Net базируется на использовании GDI+ (как следствие, принтер используется в графическом режиме), был разработан специализированный класс, обеспечивающий текстовый режим работы принтера.
Программистам же, которым не приходится работать с матричными принтерами, представляемый класс может оказаться интересным как пример использования WinAPI, выступающий в продолжение темы взаимодействия с DLL.
Обеспечивает передачу данных непосредственно в спулер печати, что позволяет не только печатать в текстовом режиме, но и передавать на принтер управляющие escape-последовательности.
Технически класс является оберткой вокруг функций WinAPI, обеспечивающих доступ к спулеру печати: OpenPrinter, ClosePrinter, WritePrinter и др.
Класс реализует интерфейс IDisposable, что позволяет использовать его в конструкции using { }.
Ниже обозначены основные члены класса.
public Printer(string printerName) { . . . } |
В качестве параметра передается имя принтера, которое должно совпадать с одним из имен зарегистрированных в системе принтеров (в русской версии Windows XP «Панель управления» - «Принтеры и факсы»).
Список доступных принтеров можно получить, например, так:
StringCollection printers = new StringCollection(); foreach(string printer in PrinterSettings.InstalledPrinters) printers.Add(printer); |
«Открывает» принтер для печати. Предусмотрены два перегруженных варианта:
public void Open() |
Открывает неименованное задание на печать
public void Open(string docName) |
Открывает именованное задание на печать, имя документа будет отображаться в очереди печати.
Если при попытке доступа к принтеру возникнет ошибка, генерируется исключение Win32Exception с кодом ошибки ErrorCode, возвращаемой функцией WinAPI GetLastError().
public void Close() |
«Закрывает» принтер после печати, освобождая используемые ресурсы. При использовании конструкции using вызов метода необязателен.
public void Write(string s) |
Выводит на печать указанную строку. Если в строке встречаются специальные управляющие символы, например, табуляция, они передаются на принтер без искажения, что позволяет передавать кроме текста и escape-последовательности.
public void WriteLine(string s) |
Аналогично методу Write(), после вывода добавляется перевод строки.
Предусмотрен перегруженный вариант – WriteLine(), который просто переводит строку.
public void WriteUnescaped(string s) |
Позволяет печатать строку с заменой esc-символов на соответствующие коды. Поддерживается синтаксис, описанный в документации по регулярным выражениям.
Пример использования:
printer.WriteUnescaped(“Фамилия\tИмя\tОтчество”); |
Распечатает с табуляцией между словами
Фамилия Имя Отчество |
public void PageBreak() |
Вставляет перевод страницы.
public bool Active { get; set; } |
Чтение позволяет проверить, активен принтер или нет. Установка значения свойства эквивалентна методам Open() и Close().
В качестве примера используется WinForm-приложение, внешний вид которого изображен на картинке:
Код обработчика нажатия на кнопку «Печать» приводится ниже:
private void printButton_Click(object sender, System.EventArgs e) { using (Printer p = new Printer(printers.SelectedItem.ToString())) { p.Open(); foreach (string s in text.Lines) p.WriteLine(s); } } |
Можно и короче:
private void printButton_Click(object sender, System.EventArgs e) { using (Printer p = new Printer(printers.SelectedItem.ToString())) { p.Open(); p.Write(text.Text); } } |
А можно и «умнее»:
private void printButton_Click(object sender, System.EventArgs e) { using (Printer p = new Printer(printers.SelectedItem.ToString())) { p.Open(); p.WriteUnescaped(text.Text); p.PageBreak(); } } |
Сообщений 0 Оценка 351 Оценить |