31
Summer 2004C4W -GDI -Nguyen Tri Tuan -DH.KHTN Tp.HCM61
Kỹ thuật in của MFC
Chọn option hỗ trợ in trong AppWizard
Summer 2004C4W -GDI -Nguyen Tri Tuan -DH.KHTN Tp.HCM62
Kỹ thuật in của MFC
Ứng dụng đơn giản cóhỗtrợ Print vàPrint Preview của MFC
32
Summer 2004C4W -GDI -Nguyen Tri Tuan -DH.KHTN Tp.HCM63
Kỹ thuật in của MFC -Tổng quan
® Giới thiệu
§ MFC framework tích hợp sẵn kỹ thuật in ấn,
thực hiện phần lớn các công việc; giúp người
lập trình tiết kiệm rất nhiều công sức vàloại bỏ
nhiều sự phức tạp như khi sử dụng Windows
SDK
® Tự động tạo vàxóa Printer DC
® Tự động gọi StartDoc/EndDoc,
StartPage/EndPage
® Hỗ trợ hộp thoại theo dõi trạng thái của print job; khả
năng hủy bỏ in (Abort procedure)
® Khả năng Print Preview,…
Summer 2004C4W -GDI -Nguyen Tri Tuan -DH.KHTN Tp.HCM64
Kỹ thuật in của MFC -Tổng quan…(tt)
® Giới thiệu…(tt)
§ Các hàm quan trọng của CView liên quan đến in ấn
Được gọi khi kết thúc print job.
Giải phóng các tài nguyên
OnEndPrinting()
Được gọi để thực hiện in mỗi trang.
In Header, Footer,…vàgọi đến
hàm OnDraw để in phần chính của
trang
OnPrint()
Được gọi trước khi in mỗi trang.
Thay đổi tính chất của Printer DC
OnPrepareDC()
Được gọi trước khi việc in bắt đầu.
Định nghĩa các tài nguyên sử dụng
cho việc in (Font, Brush,…)
OnBeginPrinting()
Được gọi khi bắt đầu print job.
Xác định số trang in;…
OnPreparePrinting()
33
Summer 2004C4W -GDI -Nguyen Tri Tuan -DH.KHTN Tp.HCM66
Kỹ thuật in của MFC -In trên nhiều trang
® Tạo 1 ứng dụng bằng MFC AppWizard với các
options Single Document vàPrint and Print
Preview
® Thêm đoạn lệnh sau vào hàm
CxxxView::OnDraw
// Chuyển đổi 1 pixel = 1/100 inch
pDC->SetMapMode(MM_LOENGLISH);
// m_numRects: số hình chữ nhật muốn vẽ
// W = H = 100 pixel, khoảng cách 20 pixel
for (int i=0; i < m_numRects; i++)
pDC->Rectangle(0, -i*120,
100, -(i+1)*120+20);
34
Summer 2004C4W -GDI -Nguyen Tri Tuan -DH.KHTN Tp.HCM67
Kỹ thuật in của MFC -In trên nhiều trang…(tt)
Các hình chữ nhật không hiển thị đúng trên nhiều trang in
Summer 2004C4W -GDI -Nguyen Tri Tuan -DH.KHTN Tp.HCM68
Kỹ thuật in của MFC -In trên nhiều trang…(tt)
® Các bước thực hiện để in nhiều trang
§ B1. Thông báo cho MFC biết số trang cần in
void CxxxView::OnBeginPrinting(CDC* pDC,
CPrintInfo* pInfo)
{
CxxxDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
int pageHeight =
pDC->GetDeviceCaps(VERTRES);
int logPixelsY =
pDC->GetDeviceCaps(LOGPIXELSY);
int rectHeight = (int)(1.2 * logPixelsY);
int numPages =
pDoc->m_numRects*rectHeight/pageHeight + 1;
pInfo->SetMaxPage(numPages);
}
35
Summer 2004C4W -GDI -Nguyen Tri Tuan -DH.KHTN Tp.HCM69
Kỹ thuật in của MFC -In trên nhiều trang…(tt)
Các hình chữ nhật đã hiển thị trên nhiều trang in, nhưng nội dung các
trang giống hệt nhau
Summer 2004C4W -GDI -Nguyen Tri Tuan -DH.KHTN Tp.HCM70
Kỹ thuật in của MFC -In trên nhiều trang…(tt)
® Các bước thực hiện để in nhiều trang…(tt)
§ B2. Định nghĩa lại hàm CxxxView::OnPrepareDC
void CxxxView::OnPrepareDC(CDC* pDC,
CPrintInfo* pInfo)
{
if (pDC->IsPrinting()) {
int pageHeight =
pDC->GetDeviceCaps(VERTRES);
int originY = pageHeight *
(pInfo->m_nCurPage -1);
pDC->SetViewportOrg(0, -originY);
}
CView::OnPrepareDC(pDC, pInfo);
}
36
Summer 2004C4W -GDI -Nguyen Tri Tuan -DH.KHTN Tp.HCM71
Kỹ thuật in của MFC -In trên nhiều trang…(tt)
Dùng ClassWizard định nghĩa lại hàm OnPrepareDC
Summer 2004C4W -GDI -Nguyen Tri Tuan -DH.KHTN Tp.HCM72
Kỹ thuật in của MFC -In trên nhiều trang…(tt)
Các hình chữ nhật đã hiển thị đúng trên nhiều trang
37
Summer 2004C4W -GDI -Nguyen Tri Tuan -DH.KHTN Tp.HCM73
Cám ơn -Hỏi & Đáp