Bài giảng, Visual C
1THƯ VITHƯ VIỆỆN ĐN ĐỒỒHOHOẠẠGDIGDI(Graphics Device Interface)(Graphics Device Interface)LLậập trp trìình trên môi trưnh trên môi trườờng Windowsng WindowsNNộộiidungdung••GiGiớớiithithiệệuu••CCáácckhkhááiininiệệmmcơcơbbảảnn••CCááccvvííddụụvvẽẽhhììnhnhđđồồhhọọaa••XXửửlýlýảảnhnhBitmapBitmap••In In ấấnn 2In In ấấnn(Printing)(Printing)••TTổổngngquanquanvvềềin in ấấnntrongtrongWindowsWindows••In In ấấnntrongtrongMFCMFCIn In ấấnnTTổổngngquanquanvvềềin in ấấnntrongtrongWindowsWindows••Nguyên tNguyên tắắc cơ bc cơ bảản vn vềềin in ấấnn••TTáác vc vụụinin••BandingBanding••SpoolingSpooling••Printer DCPrinter DC••MMộột chương trt chương trìình in đơn ginh in đơn giảản dn dùùng APIng API 3TTổổngngquanquanvvềềin in ấấnntrongtrongWindowsWindowsNguyênNguyênttắắcccơcơbbảảnnvvềềin in ấấnn[1] [1] XXáác đc địịnh ngnh ngữữccảảnh thinh thiếết bt bịịccủủaammááyyin.in.[2] [2] GGọọiihhààmmStartDocStartDocđđểểbbắắttđđầầuuin in mmộộttttààiililiệệuummớớii[3] [3] GGọọiihhààmmStartPageStartPageđđểểbbắắttđđầầuu1 1 trangtranginin[4] [4] GGọọiiccáácchhààmmvvẽẽccủủaaGDI GDI đđểểththểểhihiệệnnvănvănbbảảnn(text) hay (text) hay hhììnhnhảảnhnh(bitmap, graphics) (bitmap, graphics) raratrangtranginin[5] [5] GGọọiihhààmmEndPageEndPageđđểểkkếếttththúúcc1 1 trangtranginin[6] [6] GGọọiihhààmmEndDocEndDocđđểểkkếếttththúúccin in ttààiililiệệuuGhiGhichchúú::Các hàm StartDoc/EndDoc, StartPage/EndPage đềuthuộcthưviệnGDIBước [3], [4], [5] có thể làm nhiềulầnnếumuốn in trên nhiều trangTTổổngngquanquanvvềềin in ấấnntrongtrongWindowsWindowsNguyênNguyênttắắcccơcơbbảảnnvvềềin in ấấnn 4TTổổngngquanquanvvềềin in ấấnntrongtrongWindowsWindowsTTááccvvụụinin••LLààmmộộttttààiililiệệuuccầầnninin••CCóóththểểchchứứaa1 hay 1 hay nhinhiềềuutrangtranginin••TTáác vc vụụ in đư in đượợccđđịịnhnhnghnghĩĩaabbởởii1 1 ccặặppllệệnhnhStartDoc/EndDocStartDoc/EndDoc••CCấấuutrtrúúccddữữliliệệuuđưđượợccddùùngngchochottáác vc vụụin lin lààEnhanced Metafile (EMF)Enhanced Metafile (EMF)••EMF: EMF: ccấấuutrtrúúccddùùngngđđểểlưulưutrtrữữccááccllệệnhnhvvẽẽtext, text, vvẽẽđđồồhhọọaa,,……TTổổngngquanquanvvềềin in ấấnntrongtrongWindowsWindowsBandingBanding••GDI GDI lưulưutrtrữữccááccllệệnhnhvvẽẽlênlênmmááyyin in trongtrongmmộộttfile file ccóóddạạngng~EMF~EMF*.TMP*.TMP••KhiKhiứứngngddụụngngkkếếttththúúccin in ấấnn1 1 trangtrang((bbằằngngllệệnhnhEndPageEndPage), ), trtrììnhnhđiđiềềuukhikhiểểnnssẽẽchuychuyểểnnđđổổiiccááccllệệnhnhvvẽẽtrongtrongmetafile metafile ththàànhnhccáácckkếếttxuxuấấttththựựccssựựtrêntrênmmááyyin in ÆÆccầầnnthithiếếttphphảảiittạạoorara1 1 trangtrangđđồồhhọọaa••KKííchchthưthướớccbbộộnhnhớớchocho1 1 trangtrangđđồồhhọọaakhkháállớớnn(VD. (VD. MMááyyin 600DPI, in 600DPI, gigiấấyyletter letter ccầầnnkhokhoảảngng4MB)4MB)••TrTrìình đinh điềều khiu khiểển mn mááy in thưy in thườờngngssửửddụụngngkkỹỹthuthuậậtt““chiachiabandband””: : chiachia1 1 trangtrangđđồồhhọọaaththàànhnhnhinhiềềuuvvùùngnghhììnhnhchchữữnhnhậật.GDIt.GDIssẽẽllấấyykkííchchthưthướớccband band ttừừtrtrìình đinh điềều khiu khiểển mn mááy in vy in vààththựựcchihiệệnnccááccllệệnhnhvvẽẽtrongtrongmetafile metafile lênlênccááccband band ccủủaa1 1 trangtrang 5TTổổngngquanquanvvềềin in ấấnntrongtrongWindowsWindowsSpoolingSpooling••Windows Windows ququảảnnlýlýququáátrtrììnhnhin in ấấnnbbằằngngtrtrììnhnhququảảnnlýlýin (Printer Spooler). in (Printer Spooler). Printer spooler Printer spooler đưđượợccttựựđđộộngngnnạạppkhikhiWindows Windows khkhởởiiđđộộngngvvààkkếếttththúúcckhikhihhệệ đi điềều hu hàành shutdownnh shutdown••Printer spooler Printer spooler gigiúúpp::–Xácđịnh trình điềukhiểnmáyin; nạpvàobộ nhớ–Lậplịch cho việcin ấn–Gởidữ liệu ra máy in qua cổng (parallel, serial)– Xoá các file TMP sau khi in xong…••NgưNgườời di dùùng cng cóóththểểttắắttcơcơchchếếSpooling Spooling đđốốiivvớớiimmộộttmmááyyin (in (trongtrongPrinter Printer properties/Ports) properties/Ports) đđểểin in nhanhnhanhhơnhơn, , vvììGDI GDI khôngkhônglưulưuddữữliliệệuuccầầnnin in lênlênfile file mmààggởởiitrtrựựcctitiếếpprarammááyyin in hohoặặccddùùngngmmộộtttrtrììnhnhđiđiềềuukhikhiểểnnspooling spooling khkháácc(VD. (VD. MMááyyin in mmạạngng))TTổổng quan vng quan vềềin in ấấn trong Windowsn trong WindowsSpoolingSpooling 6TTổổng quan vng quan vềềin in ấấn trong Windowsn trong WindowsSpoolingSpoolingTTổổngngquanquanvvềềin in ấấnntrongtrongWindowsWindowsPrinter DCPrinter DC••ViViệệccđđầầuutiêntiênkhikhiin in llààphphảảiittạạoorarangngữữccảảnh thinh thiếết bt bịịmmááy in.y in.••SSửửddụụngngPrinter DC Printer DC trongtrongccááccllệệnhnhGDI GDI gigiốốngngnhưnhưddùùngngWindow Window DC.DC.••NgưNgườời di dùùng cng cóóththểểccààiiđđặặttnhinhiềềuummááyyin, in, nhưngnhưngchchỉỉccóó1 1 mmááyyin in mmặặccđđịịnh.nh.••MMỗỗiimmááyyin in đđềềuuccóótrtrììnhnhđiđiềềuukhikhiểểnntươngtươngứứngng••CCầầnnphphảảiixxááccđđịịnhnhtêntênccủủaammááyyin in khikhittạạooPrinter DCPrinter DC••CCóó2 2 ccááchchttạạooPrinter DCPrinter DC–Tạo Printer DC trựctiếp–Tạo Printer DC bằng cách dùng hộpthoạichuẩn PrintDlg 7TTổổng quan vng quan vềềin in ấấn trong Windowsn trong WindowsTTạạo lo lậập Printer DCp Printer DCVD1. VD1. TTạạooPrinter DC Printer DC trtrựựcctitiếếppHDC HDC GetPrinterDCGetPrinterDC() { () { DWORD DWORD dwNeededdwNeeded, , dwReturneddwReturned; ; HDC HDC hdchdc; ; PRINTER_INFO_4 * pinfo4; PRINTER_INFO_4 * pinfo4; PRINTER_INFO_5 * pinfo5; PRINTER_INFO_5 * pinfo5; if (if (GetVersionGetVersion() & 0x80000000) // Windows 98 () & 0x80000000) // Windows 98 { { EnumPrinters(PRINTER_ENUM_DEFAULTEnumPrinters(PRINTER_ENUM_DEFAULT, NULL, 5, NULL,, NULL, 5, NULL,0, &0, &dwNeededdwNeeded, &, &dwReturneddwReturned); ); pinfo5 = pinfo5 = malloc(dwNeededmalloc(dwNeeded); ); EnumPrinters(PRINTER_ENUM_DEFAULTEnumPrinters(PRINTER_ENUM_DEFAULT, NULL, 5,, NULL, 5,(PBYTE)pinfo5,dwNeeded,&dwNeeded,&dwReturned); (PBYTE)pinfo5,dwNeeded,&dwNeeded,&dwReturned); hdchdc= = CreateDC(NULLCreateDC(NULL, pinfo5, pinfo5-->>pPrinterNamepPrinterName, , NULL, NULL); NULL, NULL); free(pinfo5); free(pinfo5); }}TTổổng quan vng quan vềềin in ấấn trong Windowsn trong WindowsTTạạo lo lậập Printer DCp Printer DCVD1. VD1. TTạạooPrinter DC Printer DC trtrựựcctitiếếpp……((tttt))else // Windows NT else // Windows NT { { EnumPrinters(PRINTER_ENUM_LOCALEnumPrinters(PRINTER_ENUM_LOCAL, NULL, 4,, NULL, 4,NULL, 0, &NULL, 0, &dwNeededdwNeeded, &, &dwReturneddwReturned); ); pinfo4 = pinfo4 = malloc(dwNeededmalloc(dwNeeded); ); EnumPrinters(PRINTER_ENUM_LOCALEnumPrinters(PRINTER_ENUM_LOCAL, NULL, 4,, NULL, 4,(PBYTE)pinfo4,dwNeeded,&dwNeeded,&dwReturned);(PBYTE)pinfo4,dwNeeded,&dwNeeded,&dwReturned);hdchdc= = CreateDC(NULLCreateDC(NULL, pinfo4, pinfo4-->>pPrinterNamepPrinterName, , NULL, NULL); NULL, NULL); free(pinfo4); free(pinfo4); } } return return hdchdc;;} } 8TTổổng quan vng quan vềềin in ấấn trong Windowsn trong WindowsTTạạo lo lậập Printer DCp Printer DCVD 2. VD 2. TTạạooPrinter DC: Printer DC: ddùùngnghhộộppthothoạạiichuchuẩẩnnPrintDlgPrintDlgHDC HDC GetPrinterDCGetPrinterDC() { () { PRINTDLG pd; PRINTDLG pd; HWND HWND hwndhwnd= = GetFocusGetFocus(); (); // Initialize PRINTDLG // Initialize PRINTDLG ZeroMemory(&pdZeroMemory(&pd, , sizeof(PRINTDLGsizeof(PRINTDLG)); )); pd.lStructSizepd.lStructSize= = sizeof(PRINTDLGsizeof(PRINTDLG); ); pd.hwndOwnerpd.hwndOwner= = hwndhwnd; ; pd.hDevModepd.hDevMode= NULL; = NULL; pd.hDevNamespd.hDevNames= NULL; = NULL; pd.Flagspd.Flags= PD_USEDEVMODECOPIESANDCOLLATE | = PD_USEDEVMODECOPIESANDCOLLATE | PD_RETURNDC; PD_RETURNDC; pd.nCopiespd.nCopies= 1; = 1; pd.nFromPagepd.nFromPage= 0xFFFF; = 0xFFFF; pd.nToPagepd.nToPage= 0xFFFF; = 0xFFFF; pd.nMinPagepd.nMinPage= 1; = 1; pd.nMaxPagepd.nMaxPage= 0xFFFF; = 0xFFFF; if (if (PrintDlg(&pdPrintDlg(&pd)==TRUE) return )==TRUE) return pd.hDCpd.hDC}}TTổổng quan vng quan vềềin in ấấn trong Windowsn trong WindowsVVííddụụVD. VD. MMộộttchươngchươngtrtrììnhnhin in đơnđơngigiảảnnddùùngngAPIAPIintintdoPrintdoPrint() {() {DOCINFO DOCINFO didi={={sizeof(DOCINFOsizeof(DOCINFO), ), TEXT(TEXT(““SamplePrintingSamplePrinting")}; ")}; HDC HDC dcPrintdcPrint= = GetPrinterDCGetPrinterDC();();if (if (dcPrintdcPrint!= NULL) { != NULL) { if (if (StartDoc(dcPrintStartDoc(dcPrint, &, &didi) <= 0) return 0;) <= 0) return 0;if (if (StartPage(dcPrintStartPage(dcPrint) <= 0) {) <= 0) {EndDoc(dcPrintEndDoc(dcPrint); ); return 0;return 0;}}// // ccááccllệệnhnhththểểhihiệệnntext, graphics text, graphics lênlêntrangtranginin…………EndPage(dcPrintEndPage(dcPrint););EndDoc(dcPrintEndDoc(dcPrint); ); DeleteDC(dcPrintDeleteDC(dcPrint););} } return 1; // return 1; // ththàànhnhcôngcông}} 9In In ấấnnInInấấnntrongtrongMFCMFC••SSửửddụụngngccáácckkỹỹthuthuậậttin in ccủủaaWindows Windows trongtrongMFCMFC••KKỹỹthuthuậậttin in ccủủaaMFC MFC In In ấấnntrongtrongMFCMFCSSửửddụụngngccáácckkỹỹthuthuậậttin in ccủủaaWindowsWindows••VD1. VD1. TTạạooPrinter DC Printer DC trtrựựcctitiếếpp••VD2. VD2. TTạạooPrinter DC Printer DC ttừừmmááyyin in mmặặccđđịịnhnh••VD3. VD3. TTạạooPrinter DC Printer DC ddùùngnghhộộppthothoạạiiPrintPrint••VD4. VD4. MMộộttchươngchươngtrtrììnhnhinin 10In In ấấnntrongtrongMFCMFCSSửửddụụngngccáácckkỹỹthuthuậậttin in ccủủaaWindowsWindowsVD1. VD1. TTạạooPrinter DC Printer DC trtrựựcctitiếếppCDC dc; CDC dc; dc.CreateDC(NULLdc.CreateDC(NULL, _T("HP LaserJet IIP"), NULL, NULL); , _T("HP LaserJet IIP"), NULL, NULL); VD2. VD2. TTạạooPrinter DC Printer DC ttừừmmááyyin in mmặặccđđịịnhnhCDC dc; CDC dc; CPrintDialogCPrintDialogdlg(FALSEdlg(FALSE); ); dlg.GetDefaultsdlg.GetDefaults();();dc.Attach(dlg.GetPrinterDCdc.Attach(dlg.GetPrinterDC());());VD3. VD3. TTạạooPrinter DC Printer DC ddùùngnghhộộppthothoạạiiPrintPrintCDC CDC dc;dc;CPrintDialogCPrintDialogdlg(FALSE);dlg(FALSE);if (if (dlg.DoModaldlg.DoModal()==IDOK) ()==IDOK) dc.Attach(dlg.GetPrinterDCdc.Attach(dlg.GetPrinterDC()); ()); In In ấấnntrongtrongMFCMFCSSửửddụụngngccáácckkỹỹthuthuậậttin in ccủủaaWindowsWindowsVD4. VD4. MMộộttchươngchươngtrtrììnhnhininDOCINFO DOCINFO didi; ; ::::ZeroMemory(&diZeroMemory(&di, , sizeofsizeof(DOCINFO));(DOCINFO));di.cbSizedi.cbSize= = sizeof(DOCINFOsizeof(DOCINFO););di.lpszDocNamedi.lpszDocName= _= _T(T(““SampleSampleof print"); of print"); if (if (dc.StartDoc(&didc.StartDoc(&di) > 0) { ) > 0) { BOOL BOOL bContinuebContinue= TRUE; = TRUE; for (for (intinti=1; i<=i=1; i<=nPageCountnPageCount&& && bContinuebContinue; i++) {; i++) {dc.StartPagedc.StartPage(); (); // // XXááccllậậppccááccthamthamssốốchochoPrinter DC Printer DC // In // In trangtrangththứứii// // ……if (if (dc.EndPagedc.EndPage() <= 0) () <= 0) bContinuebContinue= FALSE; = FALSE; } } if (if (bContinuebContinue) ) dc.EndDocdc.EndDoc(); (); else else dc.AbortDocdc.AbortDoc(); (); }} [...]... nội dung c c trang giống chữ nhậ hiể thị nhiề giố hệt nhau 16 In trên nhiều trang nhiề C c bư c th c hiện • B2 Định nghĩa lại hàm CxxxView::OnPrepareDC B2 nghĩ 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);... MFC thuậ c Ch c năng Print và Print Preview Chọn option hỗ trợ in trong AppWizard Chọ trợ Kỹ thuật in c a MFC thuậ c Ch c năng Print và Print Preview 12 Kỹ thuật in c a MFC thuậ c Ch c năng Print và Print Preview Ứng dụng đơn giản c hỗ trợ Print và Print Preview c a MFC giả trợ Kỹ thuật in c a MFC thuậ c 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; ... 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 nhiề C c bư c th c hiện C c hình chữ nhật đã... inch pDC->SetMapMode(MM_LOENGLISH); pDC- SetMapMode(MM_LOENGLISH); // vẽ 100 hình chữ nhật chữ nhậ // W = H = 100 đơn vị, khoảng c ch 20 đơn vị vị khoả vị for (int i=0; i < 100 ; i++) (int pDC->Rectangle(0, -i*120, pDC100, -( i+1)*120+20); Kỹ thuật in c a MFC thuậ c In trên nhiều trang C c hình chữ nhật không hiển thị đúng trên nhiều trang in chữ nhậ hiể thị nhiề 15 In trên nhiều trang nhiề C c bư c. .. OnDraw để in phần chính c a trang phầ chí OnEndPrinting() OnEndPrinting() Đư c gọi khi kết th c print job Đượ thú Giải phóng c c tài nguyên Giả phó Kỹ thuật in c a MFC thuậ c C c bư c th c hiện 14 Kỹ thuật in c a MFC thuậ c 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 đoạ // Chuyển đổi 1... 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 thuậ 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); 11 Kỹ thuật in c a... gọi khi bắt đầu t c vụ in X c định Đượ vụ số trang in;… in;… OnBeginPrinting() OnBeginPrinting() Đư c gọi trư c khi vi c in bắt đầu Định Đượ trướ việ nghĩa c c tài nguyên sử dụng cho vi c in nghĩ việ (Font, Brush,…) Brush,… OnPrepareDC() OnPrepareDC() Đư c gọi trư c khi in mỗi trang Thay Đượ trướ trang đổi tính chất c a Printer DC chấ OnPrint() OnPrint() Đư c gọi để th c hiện in mỗi trang In Đượ thự... 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,… 13 Kỹ thuật in c a MFC thuậ c C c hàm quan trọng liên quan in ấn OnPreparePrinting() OnPreparePrinting() Đư c gọi khi bắt đầu t c vụ... int originY = pageHeight * (pInfo->m_nCurPage-1); pDC->SetViewportOrg(0, -originY); } CView::OnPrepareDC(pDC, pInfo); } Kỹ thuật in c a MFC thuậ c In trên nhiều trang C c hình chữ nhật đã hiển thị đúng trên nhiều trang chữ nhậ hiể thị nhiề 17 HẾT – C M ƠN GIẢI ĐÁP TH C M C 18 . ấấnntrongtrongMFCMFCSSửửddụụngngccáácckkỹỹthuthuậậttin in ccủủaaWindowsWindowsVD1. VD1. TTạạooPrinter DC Printer DC trtrựựcctitiếếppCDC dc; CDC dc; dc.CreateDC(NULLdc.CreateDC(NULL,. đượợccđđịịnhnhnghnghĩĩaabbởởii1 1 ccặặppllệệnhnhStartDoc/EndDocStartDoc/EndDoc••CCấấuutrtrúúccddữữliliệệuuđưđượợccddùùngngchochottá c vc vụụin lin lààEnhanced Metafile (EMF)Enhanced