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

📄 book_text10.htm

📁 深入编程内幕vc++ 非常适合处学者学习
💻 HTM
📖 第 1 页 / 共 5 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0063)http://www1.ustc.edu.cn/personal/csli/insidec++/book_text10.htm -->
<HTML><HEAD><TITLE>Visual C++</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2900.2995" name=GENERATOR>
<META content=FrontPage.Editor.Document name=ProgId><LINK 
href="book_text10.files/style.css" type=text/css rel=stylesheet></HEAD>
<BODY bgColor=#f7fbff leftMargin=0 topMargin=0>
<TABLE height="100%" cellSpacing=0 cellPadding=0 width="100%" border=0>
  <TBODY>
  <TR>
    <TD width="3%" background=book_text10.files/page_side.gif 
    height="100%"> </TD>
    <TD vAlign=top align=middle width="97%">
      <P 
      style="mso-line-height-alt: 1.3pt; tab-stops: right dotted 402.1pt"><SPAN 
      lang=EN-US 
      style="FONT-SIZE: 10.5pt; mso-bidi-font-size: 10.0pt"></O:P></SPAN></P>
      <TABLE height=23 width="99%" border=0>
        <TBODY>
        <TR>
          <TD width="2%" height=29></TD>
          <TD width="95%" height=29><PRE><A name=_Toc419881628><SPAN style="FONT-FAMILY: 宋体; mso-hansi-font-family: MS Sans Serif; mso-bookmark: _Toc419740446"><B>三 深入<SPAN lang=EN-US>MFC类库</SPAN></B></SPAN></A></PRE></TD>
          <TD width="3%" height=29></TD></TR>
        <TR>
          <TD width="2%" height=15></TD>
          <TD width="95%" height=15>
            <H2 style="mso-line-height-alt: 1.3pt"><A name=_Toc419881644><SPAN 
            lang=EN-US 
            style="FONT-FAMILY: 宋体; mso-hansi-font-family: Arial; mso-bookmark: _Toc419740462">5 
            打印</SPAN></A><SPAN lang=EN-US 
            style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt; mso-hansi-font-family: Arial"><O:P> 
            </O:P></SPAN></H2>
            <P class=MsoNormal 
            style="TEXT-INDENT: 20pt; mso-line-height-alt: 1.3pt"><SPAN 
            style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">打印功能是现在几乎所有的应用程序所必须具备的一项基本功能,这一点从</SPAN><SPAN 
            lang=EN-US 
            style="FONT-SIZE: 10.5pt; mso-bidi-font-size: 10.0pt">APPWizard 
            </SPAN><SPAN 
            style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">生成的应用程序框架的菜单中缺省地包括打印和打印预览功能中可以看出来。但是打印功能的实现如果只依赖于以前的</SPAN><SPAN 
            lang=EN-US 
            style="FONT-SIZE: 10.5pt; mso-bidi-font-size: 10.0pt">Windows API 
            </SPAN><SPAN 
            style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">调用来实现的话,是一件非常繁杂的事情。相比之下,</SPAN><SPAN 
            lang=EN-US 
            style="FONT-SIZE: 10.5pt; mso-bidi-font-size: 10.0pt">Microsoft</SPAN><SPAN 
            style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的基本类库应用框架则大大简化了打印功能的实现,并且还提供了打印预览功能。</SPAN><SPAN 
            lang=EN-US 
            style="FONT-SIZE: 10.5pt; mso-bidi-font-size: 10.0pt"><O:P> 
            </O:P></SPAN></P>
            <H3 style="mso-line-height-alt: 1.3pt"><A name=_Toc419881645><SPAN 
            lang=EN-US 
            style="FONT-FAMILY: 宋体; mso-hansi-font-family: Times New Roman; mso-bookmark: _Toc419740463">5.1打印和显示</SPAN></A><SPAN 
            lang=EN-US 
            style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'"><O:P> 
            </O:P></SPAN></H3>
            <P class=MsoNormalIndent style="mso-line-height-alt: 1.3pt"><SPAN 
            lang=EN-US style="mso-spacerun: yes">&nbsp;</SPAN><SPAN 
            style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">以前我们进行的输出工作都是向屏幕上的一块窗口区域中进行,而打印则是打印机向打印纸上输出一些东西。的确,这两者之间有很大的相似性,比如,它们都能输出文本,也都能输出一些图形。正是基于这些相似性,在</SPAN> 
            <SPAN lang=EN-US>Windows </SPAN><SPAN 
            style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">中,用设备上下文将它们之间的共性统一起来了。你在进行打印和输出时,你可以用相同的输出函数(如</SPAN><SPAN 
            lang=EN-US>TextOut</SPAN><SPAN 
            style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">)来往屏幕或打印纸上输出。</SPAN><SPAN 
            lang=EN-US>Windows </SPAN><SPAN 
            style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">会在不同的情况下,将输出联系到相应的设备上。但是这并不意味着我们可以完全不考虑这两者之间的差别,而认为我们只要实现了屏幕输出功能就自动地实现了相应的打印功能。毕竟,它们之间有一些无法统一的差别:打印时,有页和分页的概念,即数据或输出是有条理地组织在一张张有一定大小的纸上;而屏幕输出时,则没有页和分页的功能,同时,可以认为屏幕输出的输出区域是没有大小限制的,超出窗口范围的,我们可以用滚动条来滚动。</SPAN></P>
            <P class=MsoNormalIndent style="mso-line-height-alt: 1.3pt"><SPAN 
            lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;</SPAN>CView 
            </SPAN><SPAN 
            style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">有这样三个虚拟函数:</SPAN><SPAN 
            lang=EN-US>OnPaint(),OnDraw(CDC *pDC),OnPrint()</SPAN><SPAN 
            style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">。</SPAN><SPAN 
            lang=EN-US>OnPaint()</SPAN><SPAN 
            style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">是当视类窗口需要在屏幕上输出时被调用,负责完成窗口的屏幕输出显示工作;</SPAN><SPAN 
            lang=EN-US>OnPrint()</SPAN><SPAN 
            style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">是当打印一页时被调用,负责完成向某页打印纸上打印。这两个函数的缺省实现中包含了对</SPAN><SPAN 
            lang=EN-US>OnDraw(CDC *pDC)</SPAN><SPAN 
            style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的调用。我们以前的程序中,并不考虑打印问题,所以我们被告之在</SPAN><SPAN 
            lang=EN-US>OnDraw </SPAN><SPAN 
            style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">中考虑如何完成屏幕输出工作。但现在不一样了,我们在</SPAN><SPAN 
            lang=EN-US>OnDraw </SPAN><SPAN 
            style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">中添加代码时,必须小心这有可能是在进行打印,并不是向一个窗口中输出。如果这两者在程序中不能统一,就必须分开考虑。分分开考虑有两种方法:一是分别在</SPAN><SPAN 
            lang=EN-US>OnPaint</SPAN><SPAN 
            style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">和</SPAN><SPAN 
            lang=EN-US>OnPrint </SPAN><SPAN 
            style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">中完成屏幕输出和打印输出工作,而不必依赖于</SPAN><SPAN 
            lang=EN-US>OnDraw</SPAN><SPAN 
            style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">。二是在</SPAN><SPAN 
            lang=EN-US>OnDraw </SPAN><SPAN 
            style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">中,我们可以调用</SPAN><SPAN 
            lang=EN-US>pDC_&gt;IsPrinting() </SPAN><SPAN 
            style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">来识别目前是在进行哪种输出工作。如果是在进行打印,</SPAN><SPAN 
            lang=EN-US>pDC_&gt;IsPrinting()</SPAN><SPAN 
            style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">返回</SPAN><SPAN 
            lang=EN-US>true</SPAN><SPAN 
            style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">。这样我们就可以在</SPAN><SPAN 
            lang=EN-US>OnDraw </SPAN><SPAN 
            style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">中区别对待了。</SPAN></P>
            <H3 style="mso-line-height-alt: 1.3pt"><A name=_Toc419881646><SPAN 
            lang=EN-US 
            style="FONT-FAMILY: 宋体; mso-hansi-font-family: Times New Roman; mso-bookmark: _Toc419740464">5.2打印分页</SPAN></A><SPAN 
            lang=EN-US 
            style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'"><O:P> 
            </O:P></SPAN></H3>
            <P class=MsoNormal 
            style="TEXT-INDENT: 20pt; mso-line-height-alt: 1.3pt"><SPAN 
            style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">前面我们讲过打印输出一个很特殊的地方在于它的分页这一点上。要输出的的内容是被安排在不同的页上的。这样,当我们有超过一页的内容要显示时,我们就必须考虑分页,要能计算出显示到哪时必须换到下一页上去输出。这种拆页计算是有一定的麻烦的,我们会在后面结合给出的例子来讨论。现在这里要说明的是</SPAN><SPAN 
            lang=EN-US 
            style="FONT-SIZE: 10.5pt; mso-bidi-font-size: 10.0pt">OnPrint</SPAN><SPAN 
            style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的每一次调用对应着打印某一页。</SPAN><SPAN 
            lang=EN-US 
            style="FONT-SIZE: 10.5pt; mso-bidi-font-size: 10.0pt">OnPrint(CDC 
            *pDC,CPrintInfo *pInfo )</SPAN><SPAN 
            style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">中的第二个参数中包含了我们感兴趣的一些关于页的信息。</SPAN><SPAN 
            lang=EN-US 
            style="FONT-SIZE: 10.5pt; mso-bidi-font-size: 10.0pt">CPrintInfo 
            </SPAN><SPAN 
            style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">类型的对象有一个</SPAN><SPAN 
            lang=EN-US 
            style="FONT-SIZE: 10.5pt; mso-bidi-font-size: 10.0pt">m_nCurPage</SPAN><SPAN 
            style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的公共成员属性,它告诉了我们目前是在打印哪一页。我们计算拆页时就显然要利用它。</SPAN><SPAN 
            lang=EN-US 
            style="FONT-SIZE: 10.5pt; mso-bidi-font-size: 10.0pt"><O:P> 
            </O:P></SPAN></P>
            <P class=MsoNormal 
            style="TEXT-INDENT: 20pt; mso-line-height-alt: 1.3pt"><SPAN 
            style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">应用程序框架在每一次调用</SPAN><SPAN 
            lang=EN-US 
            style="FONT-SIZE: 10.5pt; mso-bidi-font-size: 10.0pt">OnPrint</SPAN><SPAN 
            style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">打印一页之前,都会调用</SPAN><SPAN 
            lang=EN-US style="FONT-SIZE: 10.5pt; mso-bidi-font-size: 10.0pt"> 
            OnPrepareDC(CDC *pDC</SPAN><SPAN 
            style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">,</SPAN><SPAN 
            lang=EN-US 
            style="FONT-SIZE: 10.5pt; mso-bidi-font-size: 10.0pt">CPrintInfo 
            *pinfo) </SPAN><SPAN 
            style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">这个虚函数。这个虚函数在每次屏幕输出前也会被调用来允许做一些设置。在后一种情况下,</SPAN><SPAN 
            style="FONT-SIZE: 10.5pt; mso-bidi-font-size: 10.0pt"> </SPAN><SPAN 
            style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">第二个参数</SPAN><SPAN 
            lang=EN-US 
            style="FONT-SIZE: 10.5pt; mso-bidi-font-size: 10.0pt">pinfo</SPAN><SPAN 
            style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">等于</SPAN><SPAN 
            lang=EN-US 
            style="FONT-SIZE: 10.5pt; mso-bidi-font-size: 10.0pt">NULL</SPAN><SPAN 
            style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">。打印时,我们可以在这里做一些针对某一页做一些设备上下文的设置工作。同时还有另一项重要的设置工作,我们可以设置打印工作的结束,即告诉应用框架,所有的页都已打印完了,打印可以结束了。这是通过设置</SPAN><SPAN 
            style="FONT-SIZE: 10.5pt; mso-bidi-font-size: 10.0pt"> <SPAN 
            lang=EN-US>pinfo </SPAN></SPAN><SPAN 
            style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的公共成员属性</SPAN><SPAN 
            lang=EN-US 
            style="FONT-SIZE: 10.5pt; mso-bidi-font-size: 10.0pt">m_bContinuePrinting</SPAN><SPAN 
            style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">为</SPAN><SPAN 
            lang=EN-US 
            style="FONT-SIZE: 10.5pt; mso-bidi-font-size: 10.0pt">false 
            </SPAN><SPAN 

⌨️ 快捷键说明

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