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,每台打印机
你知道我在哪里可以找到问题吗?如果您需要代码片段或其他我将发布的内容。
为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上运行的代码(因为那是我当时用于测试的),所以它当然可以运行。