OnPrint()会调用OnDraw(),你在OnDraw中画出来就可以了。如果不想全部输出OnDraw的内容,那么在OnPrint()的函数中增加一些控制变量用来控制什么时候输出字段数据还是曲线数据。就是if / else啦。

解决方案 »

  1.   

    打印输出只要在OnDraw()函数中绘制就行了,对话框中要调用打印和预览模块需要做一些工作,你可下载些资料看看,此处复制点给你,可能看不清楚。关于对话框使用MFC打印模块
    1、 由于MFC打印模块是为Frame窗口设计的,为此,创建一个Frame类,并为它建立一个View类,而View类是打印模块的控制类,所有的虚函数均在此模块中。
    2、 需要的虚函数:
    virtual void OnPrint(CDC* pDC, CPrintInfo* pInfo);
    virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
    virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
    virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
    virtual void OnEndPrintPreview(CDC* pDC, CPrintInfo* pInfo, POINT point, CPreviewView* pView);
    3、 与对话框的通信方式:
    a) 对话框向下,直接调用;下面向上使用自定义消息。
    b) 按打印键:OnPreparePrinting调用DoPreparePrinting()函数,该函数产生一个打印对话框,选择后返回一个布尔值,取消打印返回false,打印返回true。
    c) 按打印预览键:程序流程为OnPreparePrinting、OnBeginPrinting、OnPrint、OnEndPrintPreview,并由OnEndPrintPreview函数在内部调用OnEndPrinting。
    d) 如果在预览中选择了打印,OnEndPrintPreview会向View类的父类发一个系统消息MESSAGE(COMMAND,ID_FILE_PRINT),该消息与标准Frame类中按打印键时的消息相同,因此必须在自定义的Frame类中接收并转发这个消息。
    4、 工作原理:
    通常情况下,一个结构组织的比较好的MFC程序是基于文档视图结构的,这一框架结构给我们提供了很多功能,比如菜单,注册表的关联,文件类型的注册,打印功能,只要我们善于发掘,这些都可以为我们所用,但我们现在只关心如何使用MFC提供的结构来实现打印功能。
    在编写打印程序之前,有必要先介绍一下MFC的框架结构,其中的文档视图结构又是这个框架的重点,我们通过分析MFC实现的视图类的原代码就可以看到一个打印程序的执行流程。读者也可以看侯俊杰的《深入浅出MFC》,上面有关于MFC打印的详细流程解释,下面是MFC的打印的函数的实现,该函数名为OnFilePrint它不是一个虚函数,而是响应缺省的COMMAND消息的处理函数,因为MFC提供了向导生成的菜单和工具栏,关于打印的命令ID为ID_FILE_PRINT ,而在视图类的MessageMap里有这样一项,ON_COMMAND (ID_FILE_PRINT, CView::OnFilePrint),因此实际使用的过程中可以不用原来的ID, 而使用自己的ID如ID_MYPRINT,再在MessageMap里加入ON_COMMAND (ID_MYPRINT, CView::OnFilePrint)即可完成原来一样的功能。ViewPrnt.cpp中有CView的OnFilePrint的函数的具体实现,ViewPrnt.cpp的位置读者自己用windows查找就能找到,这是MFC的源代码,本文把其中的主要代码列出放在下面,直接看下面的分析:
    void CView::OnFilePrint()
    {
    // get default print info
    if (OnPreparePrinting(&printInfo))
    {
    if (dlg.DoModal() != IDOK)
    return;
    } OnBeginPrinting(&dcPrint, &printInfo);
    OnPrepareDC(&dcPrint, &printInfo);
    OnPrint(&dcPrint, &printInfo);
    OnEndPrinting(&dcPrint, &printInfo);    // clean up after printing
    }
      其中加粗的代码行为可以重载的虚函数,根据不同的用户,其内容会不同。对于 OnPreparePrinting() 函数的具体内容必须有 return DoPreparePrinting(pInfo);这是在一个打印过程中最先调用的。当然也可以包含一些其它的打印初始化操作。我们最主要的是要重载三个函数:
    OnBeginPrinting();
    OnPrint();
    OnEndPrinting(); 
      而以 OnPrint 最为复杂,它是我们要写大量代码实现我们打印功能的地方。对于默认的OnPrint实现是调用CView的OnDraw,也就是和绘制视图类的客户区的内容完全相同的方法来在打印机上绘图。实际中我们在两种地方绘图的内容是完全不同的,可能用户在客户区绘的是一个曲线,而在打印机上要绘制表格和数据。OnPrint(CDC* pDC, CPrintInfo* pInfo)的第二个参数是一个CPrintInfo类型的指针,我们可以从这个指针指向的对象中获得很多信息,如总共的页数,当前的页数,这在打印页眉页脚时可能是很有用的信息。CPrintInfo的定义如下:
    struct structCPrintInfo // Printing information structure
    {
    CPrintInfo();
    ~CPrintInfo();
    CPrintDialog* m_pPD;     // pointer to print dialog
    BOOL m_bDocObject;       // TRUE if printing by IPrint interface
    BOOL m_bPreview;         // TRUE if in preview mode
    BOOL m_bDirect;          // TRUE if bypassing Print Dialog
    BOOL m_bContinuePrinting;// set to FALSE to prematurely end printing
    UINT m_nCurPage;         // Current page
    UINT m_nNumPreviewPages; // Desired number of preview pages
    CString m_strPageDesc;   // Format string for page number display
    LPVOID m_lpUserData;     // pointer to user created struct
    CRect m_rectDraw;        // rectangle defining current usable page area
    // these only valid if m_bDocObject
    UINT m_nOffsetPage;      // offset of first page in combined IPrint job
    DWORD m_dwFlags;         // flags passed to IPrint::Print
    void SetMinPage(UINT nMinPage);
    void SetMaxPage(UINT nMaxPage);
    UINT GetMinPage() const;
    UINT GetMaxPage() const;
    UINT GetFromPage() const;
    UINT GetToPage() const;
    UINT GetOffsetPage() const;
    };
      OnBeginPrinting()通常用来设定要打印的总页数,以及一些和页面尺寸有关的初始化工作,在OnBeginPrinting()中设定打印的页数是必要的,默认的页数是只有一页,如果开发人员打印的页数大于1,则必须在此函数中设定打印的页数。然后在OnPrint(CDC* pDC, CPrintInfo* pInfo)中用pInfo-> m_nCurPage获取当前的页码,根据当前的页码打印该页相应的内容。OnEndPrinting用来释放在OnBeginPrinting中申请的资源,如果没有申请,则不需重载该函数。
      关于打印预览只需要将自己的执行打印预览功能的命令ID和CView::OnFilePrintPreview关联起来就行了,具体方法是在用户的视图类的MessageMap中加入:
    ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview);
    其中ID_FILE_PRINT_PREVIEW是默认的ID,开发人员也可以使用自己的ID。其实只要重载了OnPrint函数,在打印和打印预览中就可以重用该函数了。到现在为止,相信读者已经对利用MFC的文档视图结构来实现一个包含打印和打印预览功能的程序有了一个总体的认识了,本文还针对该方法给出了一个示例代码,代码来自Jeff Prosise 的《MFC windows程序设计》,见参考文献[1]。
      

  2.   

    可以看看CPreViewView源码看它是怎样打印视图内容的,然后模仿它写一个可用于对话框的场合