1.1
In văn bản đơn giản
V
VBạn cần in text hoặc hình.
#
#Thụ lý sự kiện PrintDocument.PrintPage, và sử dụng các phương thức
DrawString và DrawImage của lớp Graphics để in dữ liệu ra trang.
.NET sử dụng mô hình in dựa-trên-sự-kiện bất đồng bộ (asynchronous event-based
printing model). Để in một văn bản, bạn cần tạo một đối tượng
System.Drawing.Printing.PrintDocument, cấu hình các thuộc tính của nó, và rồi gọi
phương thức Print để thực hiện tác vụ in. Bộ thực thi sẽ phát sinh các sự ki
ện BeginPrint,
PrintPage, và EndPrint của lớp PrintDocument trên một tiểu trình mới. Bạn thụ lý các sự
kiện này và sử dụng đối tượng System.Drawing.Graphics để xuất dữ liệu ra trang. Hình
và text được ghi ra trang theo cùng cách như bạn vẽ lên cửa sổ bằng GDI+. Tuy nhiên,
bạn có thể cần phải theo vết vị trí của bạn trên trang, vì mọi phương thức của lớp
Graphics đều yêu cầu tọa độ chỉ định nơi cần vẽ.
Các thiết lập cho máy in được cấu hình thông qua các thuộc tính
PrintDocument.PrinterSettings và PrintDocument.DefaultPageSettings. Thuộc tính
PrinterSettings trả về một đối tượng PrinterSettings (đã được mô tả trong mục 8.12) cho
biết máy in sẽ được sử dụng. Thuộc tính DefaultPageSettings cung cấp đối tượng
PageSettings cho biết độ phân giải (resolution), lề (margin), hướng trang (orientation)...
Bạn có thể cấu hình các thuộc tính này trong mã lệnh, hoặc bạn có thể sử dụng lớp
System.Windows.Forms.PrintDialog để người dùng thực hiệ
n các thay đổi thông qua hộp
// Tạo một văn bản và gắn vào phương thức thụ lý sự kiện.
PrintDocument doc = new PrintDocument();
doc.PrintPage += new PrintPageEventHandler(this.Doc_PrintPage);
// Cho phép người dùng chọn một máy in
// và chỉ định các thiết lập khác.
PrintDialog dlgSettings = new PrintDialog();
dlgSettings.Document = doc;
// Nếu người dùng nhắp OK thì in văn bản.
if (dlgSettings.ShowDialog() == DialogResult.OK) {
// Phương thức này trả về tức thì, trước khi tác vụ in
// bắt đầu. Sự kiện PrintPage sẽ phát sinh bất đồng bộ.
doc.Print();
}
}
private void Doc_PrintPage(object sender, PrintPageEventArgs e) {
// Định nghĩa font.
Font font = new Font("Tahoma", 30);
// Xác định vị trí trên trang.
// Trong trường hợp này, chúng ta đọc các thiết lập lề
// (mặc dù không có gì ngăn chúng ta vượt qua biên lề).
float x = e.MarginBounds.Left;
float y = e.MarginBounds.Top;
VBạn cần in các văn bản phức tạp gồm nhiều trang và in nhiều văn bản khác
nhau cùng một lúc.
#
#Đặt thông tin muốn in vào một lớp tùy biến dẫn xuất từ PrintDocument, và
thiết lập thuộc tính PrintPageEventArgs.HasMorePages là true trong khi vẫn
còn trang để in.
Sự kiện PrintDocument.PrintPage cho phép bạn chỉ in một trang đơn. Nếu muốn in nhiều
trang hơn, bạn cần thiết lập thuộc tính PrintPageEventArgs.HasMorePages là true trong
phương thức thụ lý sự kiện PrintPage. Trong khi HasMorePages là true, lớp
PrintDocument vẫn tiếp tục phát sinh các sự kiện PrintPage (một sự kiện cho một trang).
Tuy nhiên, bạn cần biết là đang in
đến trang thứ mấy, dữ liệu gì sẽ được in trên mỗi
trang... Để thực hiện điều này, cách hay nhất là tạo một lớp tùy biến.
Lớp TextDocument dưới đây thừa kế từ PrintDocument và thêm ba thuộc tính: Text lưu
trữ một mảng các dòng text, PageNumber cho biết trang vừa được in, và Offset cho biết
dòng vừa được in (trong mảng Text).
public class TextDocument : PrintDocument {
private string[] text;
private int pageNumber;
private int offset;
public string[] Text {
The image part with relationship ID rId6 was not fo und in the file.
Phần mã
đầy đủ cho form được trình bày dưới đây:
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Printing;
public class MultiPagePrint : System.Windows.Forms.Form {
private System.Windows.Forms.Button cmdPrint;