⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch21.htm

📁 Visual C++ 的学习资料 Visual C++ 的学习资料
💻 HTM
📖 第 1 页 / 共 3 页
字号:
<!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++&#174; 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++&#174; 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"><IMG
SRC="../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. Printing
using the MFC class library is much simpler than printing in a straight SDK and C
environment.</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 for
a 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 the
printer, where all output is performed through device contexts, much as displays
to the screen are done.</P>
<P>Many programs written for Windows need no hard copy output. However, many programs
can benefit by providing reports or other information in a printout. The Document/View
architecture and MFC class library provide standard printing functionality to all
SDI 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 structures
must be used to send output to a printer. Because Windows supports literally hundreds
of 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-copy
printouts in a Windows program much easier. You can use the Common Print dialog box
and 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/View
architecture and does all of its drawing in the <TT>OnDraw</TT> function, you might
not need to do anything to get basic printing to work. The source code provided in
Listing 21.1 is an example of a simple <TT>OnDraw</TT> function that can be used
for screen and printer output.
<H4><FONT COLOR="#000077">TYPE: Listing 21.1. A simple OnDraw function that works
for the screen and the printer.</FONT></H4>
<PRE><FONT COLOR="#0066FF"><TT>void CPrintView::OnDraw(CDC* pDC)</TT>
<TT>{</TT>
<TT>    CString szMsg = &quot;Hello printer and view example.&quot;;</TT>

<TT>    pDC-&gt;TextOut( 0, 50, szMsg );</TT>
</FONT></PRE>
<P><TT>}</TT> Using the view's <TT>OnDraw</TT> member function is an easy way to
take advantage of the hardware independence offered by Windows. If your code is portable
enough to run on a variety of screen displays, you probably will get an acceptable
printout using most printers available for Windows.</P>
<P>On the other hand, there are many cases in which you might want to get more involved
in the printing. For example, if your view is not WYSIWYG, the printed output might
not be suitable. If your view is a form view, for example, you might want to print
your document's data in another form, such as a list of items in the entire document
or detailed information about an item in the current form.</P>
<P>When you customize the view functions that are responsible for printing, you can
also offer nice user interface elements such as headers, footers, page numbers, or
special 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> member
functions are called for every page sent to the printer. The other functions are
used to initiate variables in preparation of the printout or to clean up and free
resources 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 automatically
provided for you. You can add the other member functions with ClassWizard if you
must 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 displays
information to the screen and the printer. To begin, create an SDI or MDI project
named 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 have
already been included in the <TT>CMFCPrintView</TT> class by AppWizard.</P>
<P>Add five new member variables and two new functions to the implementation section
of 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 functions
are 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 state
of a printout. A pointer to a <TT>CPrintInfo</TT> object is passed as a parameter
to 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 attributes
to 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 each
function in the next few sections, commonly used <TT>CPrintInfo</TT> members will
be 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 initial
view 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 dialog
box.</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 Print
dialog box. You can set the number of pages by calling the <TT>CPrintInfo::SetMaxPages</TT>
function:</P>
<PRE><FONT COLOR="#0066FF"><TT>pInfo-&gt;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 OK
in the Print dialog box in order to start the printout. This function is the proper
place to allocate resources such as fonts, brushes, and pens that might be needed
for 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 order
to 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 displayed
in the view. If <TT>OnPrepareDC</TT> is called with the <TT>CPrintInfo</TT> pointer
set to <TT>NULL</TT>, the document is not being printed.</P>
<P>This function often is overridden for multiple-page documents in order to continue
the 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-&gt;m_bContinuePrinting = TRUE;</TT>
</FONT></PRE>


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -