Tải bản đầy đủ (.pdf) (13 trang)

Tài liệu Đồ hoạ, đa phương tiện ( Mutilmedia) và In ấn Đồ họa phần 5 doc

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (187.22 KB, 13 trang )

1.1
In văn bản đơn giản
V
V


Bạ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


thoại in chuẩn của Windows (xem hình 8.9). Trong hộp thoại in, người dùng có thể chọn
một máy in và chọn số lượng bản in (number of copies). Người dùng cũng có thể nhắp
vào nút Properties để cấu hình các thiết lập nâng cao như cách bố trí trang (layout) và độ
phân giải máy in (resolution). Cuối cùng, người dùng có thể chấp thuận hoặc hủy bỏ thao
tác in bằng cách nhắp OK hoặc Cancel.


The image part with relationship ID rId5 was not fo und in the file.
Hình 8.9 Hộp thoại Print

Trước khi sử dụng lớp PrintDialog, bạn phải gắn nó vào đối tượng PrintDocument bằng
cách thiết lập thuộc tính PrintDialog.Document. Theo đó, bất kỳ sự thay đổi nào do người
dùng thực hiện trong hộp thoại in sẽ tự động được áp dụng vào đối tượng PrintDocument.
Ví dụ dưới đây là một form chỉ chứa một nút lệnh. Khi người dùng nhắp vào nút này, ứng
dụng sẽ tạo m
ột đối tượng PrintDocument mới, cho phép người dùng cấu hình các thiết
lập in, và rồi bắt đầu thao tác in bất đồng bộ. Phương thức thụ lý sự kiện đáp ứng cho sự
kiện PrintPage sẽ ghi ra nhiều dòng text và một bức hình.
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Printing;

public class SimplePrint : System.Windows.Forms.Form {

private System.Windows.Forms.Button cmdPrint;

// (Bỏ qua phần mã designer.)

private void cmdPrint_Click(object sender, System.EventArgs e) {


// 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;


// Xác định chiều cao của một dòng (dựa trên font được sử dụng).
float lineHeight = font.GetHeight(e.Graphics);

// In năm dòng text.
for (int i=0; i < 5; i++) {

// Vẽ text với bút vẽ đen, sử dụng font và
// tọa độ mà chúng ta đã xác định.
e.Graphics.DrawString("Thập Diện Mai Phục " + i.ToString(),
font, Brushes.Black, x, y);

// Dịch xuống một dòng.
y += lineHeight;
}
y += lineHeight;

// Vẽ hình.
e.Graphics.DrawImage(Image.FromFile(Application.StartupPath +
"\\test.bmp"), x, y);
}
}
Ví dụ này có một hạn chế là nó chỉ in một trang đơn. Để in các văn bản phức tạp và nhiều
trang hơn, bạn cần phải tạo một lớp chuyên biệt để đóng gói các thông tin về văn bản,
trang hiện hành... Kỹ thuật này sẽ được trình bày trong mục 8.14.


Hình 8-10 Văn bản đã được in (sử dụng máy in Adobe PDF)
1.2
In văn bản có nhiều trang
V

V


Bạ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.

get {return text;}
set {text = value;}
}

public int PageNumber {
get {return pageNumber;}
set {pageNumber = value;}
}

public int Offset {
get {return offset;}
set {offset = value;}
}

public TextDocument(string[] text) {
this.Text = text;
}
}
Tùy thuộc vào kiểu tài liệu muốn in, bạn có thể chỉnh sửa lớp này. Ví dụ, bạn có thể lưu
trữ một mảng gồm các dữ liệu hình, một vài nội dung sẽ được sử dụng làm header hoặc
footer trên mỗi trang, thông tin về font, hoặc tên của file mà bạn muốn đọc thông tin từ
nó. Gói các thông tin này vào một lớp đơn sẽ khiến cho việc in nhiều văn bản cùng một
lúc dễ dàng hơn.
Phần mã khở
i đầu cũng giống như mục 8.13, chỉ khác là bây giờ tạo đối tượng
TextDocument (thay vì tạo đối tượng PrintDocument). Phương thức thụ lý sự kiện
PrintPage giữ vết của dòng hiện hành và kiểm tra có còn chỗ trống trên trang hay không
trước khi thực hiện in dòng kế tiếp. Nếu cần trang mới, thuộc tính HasMorePages được
thiết lập là true và sự kiện PrintPage phát sinh lần nữa cho trang kế tiếp. Nếu không, thao
tác in xem như hoàn tất.

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;

×