1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng Visual C - 05

18 368 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Lập Trình Trên Môi Trường Windows
Trường học Trường Đại Học Công Nghệ Thông Tin
Chuyên ngành Công Nghệ Thông Tin
Thể loại Bài Giảng
Thành phố Thành Phố Hồ Chí Minh
Định dạng
Số trang 18
Dung lượng 332,91 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Bài giảng, Visual C

Trang 1

THƯ VIỆN ĐỒ HOẠ GDI

(Graphics Device Interface)

Lập trình trên môi trường Windows

• Giới thiệu

• Các khái niệm cơ bản

• Các ví dụ vẽ hình đồ họa

• Xử lý ảnh Bitmap

• In ấn

Trang 2

In ấn (Printing)

• Tổng quan về in ấn trong Windows

• In ấn trong MFC

In ấ

Tổng quan về in ấn trong Windows

• Nguyên tắc cơ bản về in ấn

• Tác vụ in

• Banding

• Spooling

• Printer DC

• Một chương trình in đơn giản dùng API

Trang 3

T ng quan v in ấ trong Windows

Nguyên tắc cơ bản về in ấn

[1] Xác định ngữ cảnh thiết bị của máy in.

[2] Gọi hàm StartDoc để bắt đầu in một tài liệu mới

[3] Gọi hàm StartPage để bắt đầu 1 trang in

[4] Gọi các hàm vẽ của GDI để thể hiện văn bản (text) hay

hình ảnh (bitmap, graphics) ra trang in

[5] Gọi hàm EndPage để kết thúc 1 trang in

[6] Gọi hàm EndDoc để kết thúc in tài liệu

Ghi chú:

Các hàm StartDoc/EndDoc, StartPage/EndPage đều thuộc thư

viện GDI

Bước [3], [4], [5] có thể làm nhiều lần nếu muốn in trên nhiều trang

T ng quan v in ấ trong Windows

Nguyên tắc cơ bản về in ấn

Trang 4

T ng quan v in ấ trong Windows

Tác vụ in

• Là một tài liệu cần in

• Có thể chứa 1 hay nhiều trang in

• Tác vụ in được định nghĩa bởi 1 cặp lệnh

StartDoc/EndDoc

• Cấu trúc dữ liệu được dùng cho tác vụ in là

Enhanced Metafile (EMF)

• EMF: cấu trúc dùng để lưu trữ các lệnh vẽ text, vẽ

đồ họa,…

T ng quan v in ấ trong Windows

Banding

• GDI lưu trữ các lệnh vẽ lên máy in trong một file có d ng ~EMF*.TMP

• Khi ứng d ng kết thúc in ấ 1 trang (b ng lệnh EndPage ), trình điề

khiể sẽ chuyể đ i các lệnh vẽ trong metafile thành các kết xuất

thực sự trên máy in Æ cầ thiết phải tạ ra 1 trang đ h a

• Kích thước b nhớ cho 1 trang đ h a khá lớn (VD Máy in 600DPI,

giấy letter cầ khoảng 4MB)

• Trình điều khiển máy in thường sử d ng k thuật “chia band”: chia 1

trang đ h a thành nhiề vùng hình chữ nhật.GDI sẽ lấy kích thước

band từ trình điều khiển máy in và thực hiệ các lệnh vẽ trong

metafile lên các band củ 1 trang

Trang 5

T ng quan v in ấ trong Windows

Spooling

• Windows quả lý quá trình in ấ b ng trình quả lý in (Printer Spooler)

Printer spooler được tự đ ng n p khi Windows khởi đ ng v k t thú khi

h điều hành shutdown

• Printer spooler giú :

– Xác định trình điều khiển máy in; nạp vào bộ nhớ

– Lập lịch cho việc in ấn

– Gởi dữ liệu ra máy in qua cổng (parallel, serial)

– Xoá các file TMP sau khi in xong…

• Người dùng có thể tắt cơ chế Spooling đ i với một má in (trong Printer

properties/Ports) đ in nhanh hơn, ì GDI không lưu dữ liệ c n in lên file

mà gởi trực tiế ra má in hoặ d ng một trình điề khiể spooling khá

T ng quan về in ấn trong Windows

Spooling

Trang 6

T ng quan về in ấn trong Windows

Spooling

T ng quan v in ấ trong Windows

Printer DC

• Việc đầu tiên khi in là phải tạo ra ngữ cảnh thiết bị máy in.

• Sử dụng Printer DC trong các lệnh GDI giống như dùng

Window DC.

• Người dùng có thể cài đặt nhiều máy in, nhưng chỉ có 1

máy in mặc định.

• Mỗi máy in đều có trình điều khiển tương ứng

• Cần phải xác định tên của máy in khi tạo Printer DC

• Có 2 cách tạo Printer DC

– Tạo Printer DC trực tiếp

– Tạo Printer DC bằng cách dùng hộp thoại chuẩn PrintDlg

Trang 7

T ng quan về in ấn trong Windows

Tạo lập Printer DC

VD1 T o Printer DC trự tiế

HDC GetPrinterDC() {

DWORD dwNeeded, dwReturned;

HDC hdc;

PRINTER_INFO_4 * pinfo4;

PRINTER_INFO_5 * pinfo5;

if (GetVersion() & 0x80000000) // Windows 98

{

EnumPrinters(PRINTER_ENUM_DEFAULT, NULL, 5, NULL,

0, &dwNeeded, &dwReturned);

pinfo5 = malloc(dwNeeded);

EnumPrinters(PRINTER_ENUM_DEFAULT, NULL, 5,

(PBYTE)pinfo5,dwNeeded,&dwNeeded,&dwReturned);

hdc = CreateDC(NULL, pinfo5- pPrinterName,

NULL, NULL);

free(pinfo5);

}

T ng quan về in ấn trong Windows

Tạo lập Printer DC

VD1 T o Printer DC trự tiế … (tt)

else // Windows NT

{

EnumPrinters(PRINTER_ENUM_LOCAL, NULL, 4,

NULL, 0, &dwNeeded, &dwReturned);

pinfo4 = malloc(dwNeeded);

EnumPrinters(PRINTER_ENUM_LOCAL, NULL, 4,

(PBYTE)pinfo4,dwNeeded,&dwNeeded,&dwReturned);

hdc = CreateDC(NULL, pinfo4- pPrinterName,

NULL, NULL);

free(pinfo4);

}

return hdc;

Trang 8

T ng quan về in ấn trong Windows

Tạo lập Printer DC

VD 2 T o Printer DC: d ng h p thoạ chuẩ PrintDlg

HDC GetPrinterDC() {

PRINTDLG pd;

HWND hwnd = GetFocus();

// Initialize PRINTDLG

ZeroMemory(&pd, sizeof(PRINTDLG));

pd.lStructSize = sizeof(PRINTDLG);

pd.hwndOwner = hwnd;

pd.hDevMode = NULL;

pd.hDevNames = NULL;

pd.Flags = PD_USEDEVMODECOPIESANDCOLLATE |

PD_RETURNDC;

pd.nCopies = 1;

pd.nFromPage = 0xFFFF; pd.nToPage = 0xFFFF;

pd.nMinPage = 1; pd.nMaxPage = 0xFFFF;

if (PrintDlg(&pd)==TRUE) return pd.hDC

}

T ng quan về in ấn trong Windows

Ví dụ

VD M t chương trình in đơn giả d ng API

int doPrint() {

DOCINFO di={sizeof(DOCINFO), TEXT(“SamplePrinting")};

HDC dcPrint = GetPrinterDC();

if (dcPrint != NULL) {

if (StartDoc(dcPrint, &di) <= 0) return 0;

if (StartPage(dcPrint) <= 0) {

EndDoc(dcPrint);

return 0;

}

// c c l nh thể hiệ text, graphics lên trang in

……

EndPage(dcPrint);

EndDoc(dcPrint);

DeleteDC(dcPrint);

}

return 1; // thành công

}

Trang 9

In ấ

In ấn trong MFC

• Sử dụng các kỹ thuật in của Windows trong MFC

• Kỹ thuật in của MFC

In ấ trong MFC

Sử dụng các kỹ thuật in của Windows

• VD1 Tạo Printer DC trực tiếp

• VD2 Tạo Printer DC từ máy in mặc định

• VD3 Tạo Printer DC dùng hộp thoại Print

• VD4 Một chương trình in

Trang 10

In ấ trong MFC

Sử dụng các kỹ thuật in của Windows

VD1 T o Printer DC trự tiế

CDC dc;

dc.CreateDC(NULL, _T("HP LaserJet IIP"), NULL, NULL);

VD2 T o Printer DC t m y in m c đ nh

CDC dc;

CPrintDialog dlg(FALSE);

dlg.GetDefaults();

dc.Attach(dlg.GetPrinterDC());

VD3 T o Printer DC d ng h p thoạ Print

CDC dc;

CPrintDialog dlg(FALSE);

if (dlg.DoModal()==IDOK)

dc.Attach(dlg.GetPrinterDC());

In ấ trong MFC

Sử dụng các kỹ thuật in của Windows

VD4 M t chương trình in

DOCINFO di;

::ZeroMemory(&di, sizeof (DOCINFO));

di.cbSize = sizeof(DOCINFO);

di.lpszDocName = _T(“Sample of print");

if (dc.StartDoc(&di) > 0) {

BOOL bContinue = TRUE;

for (int i=1; i<=nPageCount && bContinue; i++) {

dc.StartPage();

// X c l p c c tham s cho Printer DC

// In trang thứ i

// …

if (dc.EndPage() <= 0) bContinue = FALSE;

}

if (bContinue) dc.EndDoc();

else dc.AbortDoc();

}

Trang 11

Kỹ thuật in của MFC

• Một ví dụ đơn giản với chức năng Print và Print

Preview

• Tổng quan

• In trên nhiều trang

Kỹ thuật in c a MFC

Chức năng Print và Print Preview

• Ví dụ chức năng Print và Print Preview

– Tạo 1 ứng dụng bằng MFC AppWizard

– Chọn option Single Document

– Chọn option Print and Print Preview

– Thêm dòng lệnh sau vào hàm CxxxView::OnDraw

pDC->Rectangle(100, 100, 200, 200);

Trang 12

Kỹ thuật in của MFC

Chức năng Print và Print Preview

Chọn option hỗ trợ in trong AppWizard

Kỹ thuật in của MFC

Chức năng Print và Print Preview

Trang 13

Kỹ thuật in của MFC

Chức năng Print và Print Preview

Kỹ thuật in của MFC

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 tác vụ in; khả

năng hủy bỏ in (Abort procedure)

– Khả năng Print Preview,…

Trang 14

Kỹ thuật in của MFC

Các hàm quan trọng liên quan in ấn

Đượcg ikhikếtthúcprint job

Giảiphóngcáctàinguyên

OnEndPrinting()

Đượcg iđ thựchiệ in mỗitrang In Header, Footer,…vàg iđ nh m OnDrawđ in phầ chínhcủ trang

OnPrint()

Đượcg itrướckhiin mỗitrang Thay

đ itnhchấtcủ Printer DC

OnPrepareDC()

Đượcg itrướckhiviệcin b tđ u Định nghĩacáctàinguyênsửd ngchoviệcin (Font, Brush,…)

OnBeginPrinting()

Đượcg ikhib tđ utác vụin.Xácđịnh

sốtrangin;……

OnPreparePrinting()

Kỹ thuật in của MFC

Các bước thực hiện

Trang 15

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 DocumentPrint and Print Preview

• Thêm đoạn lệnh sau vào hàm CxxxView::OnDraw

// Chuyển đổi 1 đơn vị = 1/100 inch

pDC- SetMapMode(MM_LOENGLISH);

// v 100 h nh chữ nhậ

// W = H = 100 đơn vị khoảng c ch 20 đơn vị

for (int i=0; i < 100 ; i++)

pDC->Rectangle(0, -i*120,

100, -(i+1)*120+20);

Kỹ thuật in của MFC

In trên nhiều trang

Trang 16

In trên nhiều trang

Các bước thực hiện

• B1 Thông báo cho MFC biết số trang cần in

void CxxxView::OnBeginPrinting(CDC* pDC,

CPrintInfo* pInfo) {

int pageHeight =

pDC->GetDeviceCaps(VERTRES);

int logPixelsY =

pDC->GetDeviceCaps(LOGPIXELSY);

int rectHeight = (int)(1.2 * logPixelsY);

int numPages = 100*rectHeight/pageHeight + 1;

pInfo->SetMaxPage(numPages);

}

In trên nhiều trang

Các bước thực hiện

Cáchìnhchữnhậtđãhiể thịtrênnhiề trangin, nhưngn idung cáctranggiống

Trang 17

In trên nhiều trang

Các bước thực hiện

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

}

Kỹ thuật in của MFC

In trên nhiều trang

Trang 18

HẾT – CẢM ƠN

GIẢI ĐÁP THẮC MẮC

Ngày đăng: 14/11/2012, 15:06

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

  • Đang cập nhật ...

TÀI LIỆU LIÊN QUAN