65.9K
CodeProject 正在变化。 阅读更多。
Home

富文本绘制、打印预览和打印到纸张(仅 GDI)

starIconstarIconemptyStarIconemptyStarIconemptyStarIcon

2.00/5 (9投票s)

2006年3月21日

CPOL

1分钟阅读

viewsIcon

59986

downloadIcon

1912

为了帮助您快速轻松地构建支持富文本绘制、打印预览和打印到纸张的报表应用程序,包含源代码

richprintfirst.gif

引言

“为什么我的富文本绘制和打印预览工作正常,但是当我尝试打印到纸张时,却无法工作?”

我发现很多人多次问过这个问题,希望这篇文章和代码能帮助您。这个小型应用程序演示了如何在画布上绘制富文本,然后您可以以相同的外观进行打印预览或打印到纸张。完整的源代码包含在压缩文件中。您可以自由使用,不受限制。

它是如何工作的?

  1. 我们在类头文件中定义了一个富文本控件:CTestRichEditPrintView,如下所示
    // CRichEditCtrl for drawing.
    CRichEditCtrl m_DrawRTF;
  2. 我们修改了类 CTestRichEditPrintViewOnDraw 方法,以下代码用于在画布上绘制
    m_nLogPixelsX = ::GetDeviceCaps(pDC->m_hDC, LOGPIXELSX);
    m_nLogPixelsY = ::GetDeviceCaps(pDC->m_hDC, LOGPIXELSY);
    
    fmtRange.hdcTarget = pDC->m_hAttribDC;
    fmtRange.hdc = pDC->m_hDC;
    
    CRect rcPage;
    GetClientRect(&rcPage);
    if(m_bPrint) 
    {
    rcPage = rcPrint;
    }
    
    RecalcRect(rcPage);
    fmtRange.rcPage = rcPage;
    rectText.bottom += foDefaultFontHeight;
    RecalcRect(rectText);
    fmtRange.rc = rectText;
    
    CHARRANGE chrg = { 0, -1 };
    fmtRange.chrg = chrg;
    
    m_DrawRTF.FormatRange(NULL, FALSE);
    m_DrawRTF.FormatRange(&fmtRange, TRUE);
    m_DrawRTF.FormatRange(NULL, FALSE);

    这段代码可以用于打印预览,它会工作正常。但是我们不能将其用于打印到纸张。

  3. 对于打印到纸张模式,我们使用以下代码
    szWinExt = pDC->GetWindowExt();
    szViewExt = pDC->GetViewportExt();
    nMapMode = pDC->SetMapMode(MM_ANISOTROPIC);
    int printLogx = pDC->GetDeviceCaps(LOGPIXELSX);
    int printLogy = pDC->GetDeviceCaps(LOGPIXELSY);
    pDC->SetWindowExt(printLogx, printLogy);
    pDC->SetViewportExt(CSize(printLogx, printLogy));
    
    fmtRange.hdcTarget = pDC->m_hAttribDC;
    fmtRange.hdc = pDC->m_hDC;
    
    CRect rcPage;
    GetClientRect(&rcPage);
    if(m_bPrint) 
    {
    rcPage = rcPrint;
    }
    
    RecalcRect(rcPage);
    fmtRange.rcPage = rcPage;
    rectText.bottom += foDefaultFontHeight;
    RecalcRect(rectText);
    fmtRange.rc = rectText;
    
    CHARRANGE chrg = { 0, -1 };
    fmtRange.chrg = chrg;
    
    m_DrawRTF.FormatRange(NULL, FALSE);
    m_DrawRTF.FormatRange(&fmtRange, TRUE);
    m_DrawRTF.FormatRange(NULL, FALSE);
    
    pDC->SetMapMode(nMapMode);
    pDC->SetWindowExt(szWinExt);
    pDC->SetViewportExt(szViewExt);

    在开始打印之前,我们必须更改映射模式、窗口范围和视口范围,并在完成打印后将其恢复。

richprintsecond.gif

点击 这里查看在线资料并报告错误。

© . All rights reserved.