?? ch21.htm
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"><HTML><HEAD> <META NAME="GENERATOR" Content="Symantec Visual Page Mac 1.1"> <TITLE>Teach Yourself Visual C++® 5 in 24 Hours -- Hour 21 -- Printing</TITLE></HEAD><BODY TEXT="#000000" BGCOLOR="#FFFFFF"><H1 ALIGN="CENTER"><IMG SRC="../button/sams.gif" WIDTH="171" HEIGHT="66" ALIGN="BOTTOM"BORDER="0"><BR><FONT COLOR="#000077">Teach Yourself Visual C++® 5 in 24 Hours</FONT></H1><CENTER><P><A HREF="../ch20/ch20.htm"><IMG SRC="../button/previous.gif" WIDTH="128" HEIGHT="28"ALIGN="BOTTOM" ALT="Previous chapter" BORDER="0"></A><A HREF="../ch22/ch22.htm"><IMGSRC="../button/next.gif" WIDTH="128" HEIGHT="28" ALIGN="BOTTOM" ALT="Next chapter"BORDER="0"></A><A HREF="../index.htm"><IMG SRC="../button/contents.gif" WIDTH="128"HEIGHT="28" ALIGN="BOTTOM" ALT="Contents" BORDER="0"></A> <HR></CENTER><H1 ALIGN="CENTER"><FONT COLOR="#000077">- Hour 21 -<BR>Printing</FONT></H1><P>There are two primary output devices in Windows: the screen and the printer. Printingusing the MFC class library is much simpler than printing in a straight SDK and Cenvironment.</P><P>In this hour, you will learn<UL> <LI>The support provided for printing using the Document/View architecture<BR> <BR> <LI>The differences between printer and screen display output<BR> <BR> <LI>How to manage GDI resources used for printing</UL><P>You also will create a sample program to demonstrate how printing is done fora Document/View application.<H2><FONT COLOR="#000077"><B>What Is Printing in a Windows Program?</B></FONT></H2><P>Programs written for Windows should be hardware independent. This extends to theprinter, where all output is performed through device contexts, much as displaysto the screen are done.</P><P>Many programs written for Windows need no hard copy output. However, many programscan benefit by providing reports or other information in a printout. The Document/Viewarchitecture and MFC class library provide standard printing functionality to allSDI and MDI applications.</P><P>Historically, printing in a program written for Windows has been a nightmare.Using the traditional SDK approach, seemingly dozens of function calls and structuresmust be used to send output to a printer. Because Windows supports literally hundredsof printers, en-suring that printed output is printed correctly can be difficult.</P><P>The Document/View architecture and the MFC class library help make creating hard-copyprintouts in a Windows program much easier. You can use the Common Print dialog boxand reuse view functions that are used to display information on the screen.</P><P>Printing in an MFC program is almost effortless. If your program uses the Document/Viewarchitecture and does all of its drawing in the <TT>OnDraw</TT> function, you mightnot need to do anything to get basic printing to work. The source code provided inListing 21.1 is an example of a simple <TT>OnDraw</TT> function that can be usedfor screen and printer output.<H4><FONT COLOR="#000077">TYPE: Listing 21.1. A simple OnDraw function that worksfor the screen and the printer.</FONT></H4><PRE><FONT COLOR="#0066FF"><TT>void CPrintView::OnDraw(CDC* pDC)</TT><TT>{</TT><TT> CString szMsg = "Hello printer and view example.";</TT><TT> pDC->TextOut( 0, 50, szMsg );</TT></FONT></PRE><P><TT>}</TT> Using the view's <TT>OnDraw</TT> member function is an easy way totake advantage of the hardware independence offered by Windows. If your code is portableenough to run on a variety of screen displays, you probably will get an acceptableprintout using most printers available for Windows.</P><P>On the other hand, there are many cases in which you might want to get more involvedin the printing. For example, if your view is not WYSIWYG, the printed output mightnot be suitable. If your view is a form view, for example, you might want to printyour document's data in another form, such as a list of items in the entire documentor detailed information about an item in the current form.</P><P>When you customize the view functions that are responsible for printing, you canalso offer nice user interface elements such as headers, footers, page numbers, orspecial fonts.<H3><FONT COLOR="#000077"><B>Understanding the MFC Printing Routines</B></FONT></H3><P>The following lists the <TT>CView</TT> routines used to print a view:<UL> <LI><TT>OnPreparePrinting</TT>, called before the Common Print dialog box is displayed<BR> <BR> <LI><TT>OnBeginPrinting</TT>, where GDI resources specific to using the printer should be allocated<BR> <BR> <LI><TT>OnPrepareDC</TT>, called once per page, just before the printout begins<BR> <BR> <LI><TT>OnPrint</TT>, called to actually draw to the printer's DC<BR> <BR> <LI><TT>OnEndPrinting</TT>, called once after all pages have been printed or after the job is canceled; this is where GDI resources specific to using the printer are released</UL><P>These member functions are called by the MFC framework as the print routine progresses.The relationship between these routines is shown in Figure 21.1.</P><P><A NAME="01"></A><A HREF="01.htm"><B>Figure 21.1.</B></A> <BR><I><TT>CView</TT> member functions called while printing a document.</I></P><P>As shown in Figure 21.1, only the <TT>OnPrepareDC</TT> and <TT>OnPrint</TT> memberfunctions are called for every page sent to the printer. The other functions areused to initiate variables in preparation of the printout or to clean up and freeresources after the printout has been completed.</P><P>When AppWizard creates a view class for your program, the <TT>OnPreparePrinting</TT>,<TT>OnBeginPrinting</TT>, and <TT>OnEndPrinting</TT> functions are automaticallyprovided for you. You can add the other member functions with ClassWizard if youmust override the basic functionality.<H3><FONT COLOR="#000077"><B>Creating an MFC Printing Example</B></FONT></H3><P>As an example of the MFC print functions, create a small program that displaysinformation to the screen and the printer. To begin, create an SDI or MDI projectnamed MFCPrint using ClassWizard.</P><P>With ClassWizard, add two message-handling functions for the <TT>CMFCPrintView</TT>class: <TT>OnPrepareDC</TT> and <TT>OnPrint</TT>. You'll find out more about <TT>OnPrepareDC</TT>and <TT>OnPrint</TT> in the next few sections. The other printing functions havealready been included in the <TT>CMFCPrintView</TT> class by AppWizard.</P><P>Add five new member variables and two new functions to the implementation sectionof the <TT>CMFCPrintView</TT> class, as shown in Listing 21.2.<H4><FONT COLOR="#000077">TYPE: Listing 21.2. New CPrintView member variables.</FONT></H4><PRE><FONT COLOR="#0066FF"><TT>protected:</TT><TT> int m_nCurrentPrintedPage;</TT><TT> CFont* m_pFntBold;</TT><TT> CFont* m_pFntBanner;</TT><TT> CFont* m_pFntHighlight;</TT><TT> CPen m_penBlack;</TT><TT> void PrintHeader(CDC* pDC);</TT></FONT></PRE><P><TT>void PrintFooter(CDC* pDC);</TT> These new member variables and functionsare used during the printout.<H3><FONT COLOR="#000077"><B>Exploring the <TT>CPrintInfo</TT> Class</B></FONT></H3><P>The <TT>CPrintInfo</TT> class is used to store information about the current stateof a printout. A pointer to a <TT>CPrintInfo</TT> object is passed as a parameterto functions involved in the printout. You can access attributes of the <TT>CPrintInfo</TT>object for information about the printout, or in some cases you can change the attributesto customize the printout. Here are the most commonly used <TT>CPrintInfo</TT> members:<UL> <LI><TT>m_bPreview</TT> is a flag that is set to <TT>TRUE</TT> if the document is being previewed.<BR> <BR> <LI><TT>m_bContinuePrinting</TT> is a flag that is set to <TT>FALSE</TT> to stop the print loop.<BR> <BR> <LI><TT>m_nCurPage</TT> contains the currently printing page number.<BR> <BR> <LI><TT>m_rectDraw</TT> contains the current printout rectangle.<BR> <BR> <LI><TT>SetMinPage</TT> sets the document's first page number.<BR> <BR> <LI><TT>SetMaxPage</TT> sets the document's last page number.<BR> <BR> <LI><TT>GetMinPage</TT> returns the value previously set as the document's first page number.<BR> <BR> <LI><TT>GetMaxPage</TT> returns the value previously set as the document's last page number.<BR> <BR> <LI><TT>GetFromPage</TT> returns the number of the first page being printed.<BR> <BR> <LI><TT>GetToPage</TT> returns the number of the first page being printed.</UL><P>Some of these members are used in a particular function. As you learn about eachfunction in the next few sections, commonly used <TT>CPrintInfo</TT> members willbe discussed.<H3><FONT COLOR="#000077"><B>Using the <TT>OnPreparePrinting</TT> Function</B></FONT></H3><P>AppWizard generates the <TT>OnPreparePrinting</TT> function for a project's initialview class. This function is called before the Common Print dialog box is displayed,and it gives you an opportunity to change the values displayed in the Print dialogbox.</P><P>If your document has more than one page, you should calculate the number of pages,if possible. This allows the maximum number of pages to be displayed in the Printdialog box. You can set the number of pages by calling the <TT>CPrintInfo::SetMaxPages</TT>function:</P><PRE><FONT COLOR="#0066FF"><TT>pInfo->SetMaxPages( 2 );</TT></FONT></PRE><BLOCKQUOTE> <P><HR><B> </B><FONT COLOR="#000077"><B>CAUTION:</B></FONT><B> </B>You should not allocate resources in the <TT>CPrintInfo::SetMaxPages</TT> func-tion because you are not notified if the user cancels the Print dialog box. <HR></BLOCKQUOTE><H3><FONT COLOR="#000077"><B>Using the <TT>OnBeginPrinting</TT> Function</B></FONT></H3><P>The <TT>OnBeginPrinting</TT> function is called after the user has pressed OKin the Print dialog box in order to start the printout. This function is the properplace to allocate resources such as fonts, brushes, and pens that might be neededfor the printout. In the example you work with later, this function is used to create<TT>CFont</TT> objects.</P><P>This function is called only once for each printout. If this function is called,the <TT>OnEndPrinting</TT> function is called after the printout is finished in orderto give you a chance to free resources allocated in the <TT>OnBeginPrinting</TT>function.<H3><FONT COLOR="#000077"><B>Using the <TT>OnPrepareDC</TT> Function</B></FONT></H3><P>The <TT>OnPrepareDC</TT> function is called just before a page is printed or displayedin the view. If <TT>OnPrepareDC</TT> is called with the <TT>CPrintInfo</TT> pointerset to <TT>NULL</TT>, the document is not being printed.</P><P>This function often is overridden for multiple-page documents in order to continuethe printout over multiple pages. To print another page, set the <TT>CPrintInfo::m_bContinue</TT>member variable to <TT>TRUE</TT>:</P><PRE><FONT COLOR="#0066FF"><TT>pInfo->m_bContinuePrinting = TRUE;</TT></FONT></PRE>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -