我是在单文档 FormView 中自绘了一个显示图片的控件 ,类似picture控件现在想实现菜单下的 打印功能,打印预览,将图片打印出来, 请问具体怎么做呢? 现在没头绪,请高手指点一下,有代码共享最好了,
谢谢。

解决方案 »

  1.   

    网上代码很多吧,下面是让OnDraw既处理屏幕输出也处理打印输出,你要打印额外的东西如文件名,页码页脚之类的也可重载虚函数OnPrint主要CView打印函数: OnPreparePrinting(),OnBeginPrinting(),OnPrepareDC(),OnPrint(),OnEndPrinting()下在的代码是图像处理书上的代码,
    void CRoyView::OnDraw(CDC* pDC)
    {
    CRoyDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    // 显示等待光标
    BeginWaitCursor();

    // 获取DIB
    HDIB hDIB = pDoc->GetHDIB();

    // 判断DIB是否为空
    if (hDIB != NULL)
    {
    LPBYTE lpDIB = (LPBYTE) ::GlobalLock((HGLOBAL) hDIB);

    // 获取DIB宽度
    int cxDIB = (int) pDoc->m_clsDIB.DIBWidth(lpDIB);

    // 获取DIB高度
    int cyDIB = (int) pDoc->m_clsDIB.DIBHeight(lpDIB); ::GlobalUnlock((HGLOBAL) hDIB);

    CRect rcDIB;
    rcDIB.top = rcDIB.left = 0;
    rcDIB.right = cxDIB;
    rcDIB.bottom = cyDIB;

    CRect rcDest;

    // 判断是否是打印
    if (pDC->IsPrinting())
    {
    // 是打印,计算输出图像的位置和大小,以便符合页面

    // 获取打印页面的水平宽度(象素)
    int cxPage = pDC->GetDeviceCaps(HORZRES);

    // 获取打印页面的垂直高度(象素)
    int cyPage = pDC->GetDeviceCaps(VERTRES);

    // 获取打印机每英寸象素数
    int cxInch = pDC->GetDeviceCaps(LOGPIXELSX);
    int cyInch = pDC->GetDeviceCaps(LOGPIXELSY);

    // 计算打印图像大小(缩放,根据页面宽度调整图像大小)
    rcDest.top = rcDest.left = 0;
    rcDest.bottom = (int)(((double)cyDIB * cxPage * cyInch) / ((double)cxDIB * cxInch));
    rcDest.right = cxPage;

    // 计算打印图像位置(垂直居中)
    int temp = cyPage - (rcDest.bottom - rcDest.top);
    rcDest.bottom += temp/2;
    rcDest.top += temp/2;
    }
    else // 非打印
    {
    // 不必缩放图像
    rcDest = rcDIB;
    }
    // 输出DIB
    pDoc->m_clsDIB.PaintDIB(pDC->m_hDC, &rcDest, pDoc->GetHDIB(),
    &rcDIB, pDoc->GetDocPalette());
    }
    // 恢复正常光标
    EndWaitCursor();
    }
    /////////////////////////////////////////////////////////////////////////////
    // CRoyView printingBOOL CRoyView::OnPreparePrinting(CPrintInfo* pInfo)
    {
    // default preparation // 设置总页数为一。
    pInfo->SetMaxPage(1);

    return DoPreparePrinting(pInfo);
    }void CRoyView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
    {
    // TODO: add extra initialization before printing
    }void CRoyView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
    {
    // TODO: add cleanup after printing
    }