C++ MFC打印问题

C++ MFC打印问题,c++,printing,mfc,C++,Printing,Mfc,我为解决这个印刷问题而发疯,我担心这个问题不会完全符合这个社区的网络礼仪,但我必须尝试一下。 我有这个程序用MFC C++编写,使用Windows GDI在屏幕上生成一些定制报表。MSDN表示,在OnPrint上重新计算正确DPI的绘图将为打印机提供输出。很好,这就是我所做的,对于我的应用程序的几乎每个用户来说,一切都很好: 开发、UNICODE、Windows 7、每台打印机 发行版、UNICODE、Windows 7、每台打印机 安装1,Windows XP SP3,每台打印机 安装2,W


我为解决这个印刷问题而发疯,我担心这个问题不会完全符合这个社区的网络礼仪,但我必须尝试一下。 我有这个程序用MFC C++编写,使用Windows GDI在屏幕上生成一些定制报表。MSDN表示,在OnPrint上重新计算正确DPI的绘图将为打印机提供输出。很好,这就是我所做的,对于我的应用程序的几乎每个用户来说,一切都很好:

  • 开发、UNICODE、Windows 7、每台打印机
  • 发行版、UNICODE、Windows 7、每台打印机
  • 安装1,Windows XP SP3,每台打印机
  • 安装2,Windows 7,每台打印机
但是还有第三种安装,使用Windows XP SP3,它可以打印在纸上,而不是使用PDF Creator,它可以打印正确的页数,但完全是空白的。
你知道我在哪里可以找到问题吗?如果您需要代码片段或其他我将发布的内容。

为Roger Rowland编辑:


#ifndef WINVER
    #define WINVER          0x0501
#endif
#ifndef _WIN32_WINNT
    #define _WIN32_WINNT    0x0501
#endif
#ifndef _WIN32_WINDOWS
    #define _WIN32_WINDOWS  0x0410
#endif
#ifndef _WIN32_IE
    #define _WIN32_IE       0x0600
#endif
编辑2-打印设置
请注意,m_VDStampa是GDI绘图的包装器,所以请按原样使用


void CMosaicoView::OnBeginPrinting( CDC *pDC, CPrintInfo *pInfo )
{
    // TODO: add extra initialization before printing
    LPDEVMODE   lpDevMode;
    PRINTDLG    pd;

    switch( m_ePrintMode )
    {
    case STAMPA_CATALOGO:
    case STAMPA_ORDINE:
    case STAMPA_PERSONALIZZATA:
        if( m_pStampa )
        {
            pd.lStructSize = (DWORD)sizeof( PRINTDLG );
            AfxGetApp()->GetPrinterDeviceDefaults( &pd );
            lpDevMode = (LPDEVMODE)::GlobalLock( pd.hDevMode );
            if( m_pStampa->m_spdDimFog.dX m_spdDimFog.dY )
                lpDevMode->dmOrientation = DMORIENT_PORTRAIT;
            else
                lpDevMode->dmOrientation = DMORIENT_LANDSCAPE;
            pDC->ResetDC( lpDevMode );
            ::GlobalUnlock( pd.hDevMode );
        }
        break;
    case STAMPA_ETICHETTE:
        if( m_pStampaEti )
        {
            pd.lStructSize = (DWORD)sizeof( PRINTDLG );
            AfxGetApp()->GetPrinterDeviceDefaults( &pd );
            lpDevMode = (LPDEVMODE)::GlobalLock( pd.hDevMode );
            if( m_pStampaEti->m_spdDimFog.dX m_spdDimFog.dY )
                lpDevMode->dmOrientation = DMORIENT_PORTRAIT;
            else
                lpDevMode->dmOrientation = DMORIENT_LANDSCAPE;
            pDC->ResetDC( lpDevMode );
            ::GlobalUnlock( pd.hDevMode );
        }
        break;
    }
    pInfo->SetMaxPage( m_lPagTot );
}

void CMosaicoView::OnPrepareDC( CDC *pDC, CPrintInfo *pInfo )
{
    // TODO: Add your specialized code here and/or call the base class
    int nY;

    if( pDC->IsPrinting() )
        nY = ( pInfo->m_nCurPage - 1 ) * pDC->GetDeviceCaps( VERTRES );
    CView::OnPrepareDC( pDC, pInfo );
}

void CMosaicoView::OnPrint( CDC *pDC, CPrintInfo *pInfo )
{
    // TODO: Add your specialized code here and/or call the base class
    BOOL        bRet;
    CPoint      pntDPI;
    CSize       szRisol;
    RECT        rctItem;
    RECT_2D     rect;
    sDatiStampa sdsDati;

// Getting the size of my sheet
    rctItem.left = 0;
    rctItem.right = szRisol.cx = pDC->GetDeviceCaps( HORZRES );
    rctItem.top = 0;
rctItem.bottom = szRisol.cy = pDC->GetDeviceCaps( VERTRES );

    pntDPI.x = pDC->GetDeviceCaps( LOGPIXELSX );
    pntDPI.y = pDC->GetDeviceCaps( LOGPIXELSY );
    if( !m_bVDStampaIniz )
    {
        bRet = m_VDStampa.Create( this, FALSE, RGB( 255, 255, 255 ) );      // bianca?
        m_VDStampa.Axes( FALSE );
        m_bVDStampaIniz = true;
    }

    m_VDStampa.ResetList();
    switch( m_eTipoStampa )
    {
    case STAMPA_ORDINE:
    case STAMPA_PERSONALIZZATA:
        m_VDStampa.AddToList( &m_DisegnaStampe );
        break;
    case STAMPA_CATALOGO:
        m_VDStampa.AddToList( &m_DisegnaCatalogo );
        break;
    case STAMPA_ETICHETTE:
        m_VDStampa.AddToList( &m_DisegnaEtichette );
        break;
    }
        rect.llc.x = 0;
    rect.llc.y = 0;
    if( m_pStampa )
    {
        rect.urc.x = m_pStampa->m_spdDimFog.dX;
        rect.urc.y = m_pStampa->m_spdDimFog.dY;
    }
    else
    {
        rect.urc.x = 210;
        rect.urc.y = 297;
    }
    bRet = m_VDStampa.SetViewport( rect );
    m_VDStampa.Resize( rctItem.right, rctItem.bottom );
    AggiornaDatiStampa( &sdsDati );
    switch( m_eTipoStampa )
    {
    case STAMPA_ORDINE:
    case STAMPA_PERSONALIZZATA:
        m_DisegnaStampe.SetDatiStampa( &sdsDati );
        m_DisegnaStampe.m_bASchermo = false;
        m_DisegnaStampe.SetPaginaStampa( pInfo->m_nCurPage - 1 );
        m_DisegnaStampe.m_pntDPI = pntDPI;
        m_DisegnaStampe.m_szRisoluzione = szRisol;
        break;
    case STAMPA_CATALOGO:
        m_DisegnaCatalogo.SetASchermo( false );
        m_DisegnaCatalogo.SetPaginaStampa( pInfo->m_nCurPage - 1 );
        break;
    case STAMPA_ETICHETTE:
        m_DisegnaEtichette.SetASchermo( false );
        m_DisegnaEtichette.SetPagStampa( pInfo->m_nCurPage - 1 );
        break;
    }
    m_VDStampa.Redraw();
    m_VDStampa.Swap( pDC, rctItem );
}

您是如何定义WINVER和/或WINNT的?添加了您要求的定义。XP SP3看起来还可以,但是我看到您已经有了一个在XP下工作的安装。那么区别就在于PDF创建者?PDF Creator在其他XP系统上工作正常吗?是的,它工作正常。客户表示他成功地将PDFCreator打印机的dpi从600降到了300。此外,他还设法使其工作有时设置页面布局为无而不是A4的打印机设置的PDF Creator。这是毫无意义的。如何设置打印DC?似乎与DC上的缩放有关。我有在WinXP for PDF Creator上运行的代码(因为那是我当时用于测试的),所以它当然可以运行。