3.在应用程序中设置打印纸张类型。答:CPrintDialog prn(FALSE);
prn.GetDefaults();
HANDLE pn;
CString m_devicename;
DEVMODE *print;
m_devicename=prn.GetDeviceName();
BOOL bOk=::OpenPrinter((LPTSTR)(LPCTSTR)m_devicename,&pn,NULL);
if(!bOk)
{
LPVOID lpMsgBuf;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,NULL,::GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPTSTR) &lpMsgBuf,0,NULL);
::MessageBox( NULL, (LPTSTR)(LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );
LocalFree( lpMsgBuf );
return ;
}
//返回DEVMODE结构的大小
int nSize =DocumentProperties (m_hWnd,pn,(LPTSTR)(LPCTSTR)m_devicename,NULL,NULL,0);
print = (DEVMODE *) malloc(nSize+1);
if(NULL == print) return ;
ZeroMemory(print,nSize+1);
LONG lt=::DocumentProperties(m_hWnd,pn,(LPTSTR)(LPCTSTR)m_devicename,print,NULL,DM_OUT_BUFFER);
print->dmFields=DM_PAPERSIZE|DM_ORIENTATION;
print->dmPaperSize=DMPAPER_LETTER;
print->dmOrientation=DMORIENT_LANDSCAPE; //DMORIENT_PORTRAIT
//如果使用自定义纸张大小
//print->dwFields=DM_PAPERSIZE|DM_PAPERLENGTH|DM_PAPERWIDTH|DM_ORIENTATION;
//print->dmPaperLength=用户输入纸张的长度
//print->dmPaperWidth=用户输入纸张的宽度
lt=::DocumentProperties(m_hWnd,pn,(LPTSTR)(LPCTSTR)m_devicename,NULL,print,DM_IN_BUFFER|DM_OUT_BUFFER);
bOk=::ClosePrinter(pn);
if(!bOk)
{
free(print);
return ;
}
free(print);
prn.GetDefaults();
HANDLE pn;
CString m_devicename;
DEVMODE *print;
m_devicename=prn.GetDeviceName();
BOOL bOk=::OpenPrinter((LPTSTR)(LPCTSTR)m_devicename,&pn,NULL);
if(!bOk)
{
LPVOID lpMsgBuf;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,NULL,::GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPTSTR) &lpMsgBuf,0,NULL);
::MessageBox( NULL, (LPTSTR)(LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );
LocalFree( lpMsgBuf );
return ;
}
//返回DEVMODE结构的大小
int nSize =DocumentProperties (m_hWnd,pn,(LPTSTR)(LPCTSTR)m_devicename,NULL,NULL,0);
print = (DEVMODE *) malloc(nSize+1);
if(NULL == print) return ;
ZeroMemory(print,nSize+1);
LONG lt=::DocumentProperties(m_hWnd,pn,(LPTSTR)(LPCTSTR)m_devicename,print,NULL,DM_OUT_BUFFER);
print->dmFields=DM_PAPERSIZE|DM_ORIENTATION;
print->dmPaperSize=DMPAPER_LETTER;
print->dmOrientation=DMORIENT_LANDSCAPE; //DMORIENT_PORTRAIT
//如果使用自定义纸张大小
//print->dwFields=DM_PAPERSIZE|DM_PAPERLENGTH|DM_PAPERWIDTH|DM_ORIENTATION;
//print->dmPaperLength=用户输入纸张的长度
//print->dmPaperWidth=用户输入纸张的宽度
lt=::DocumentProperties(m_hWnd,pn,(LPTSTR)(LPCTSTR)m_devicename,NULL,print,DM_IN_BUFFER|DM_OUT_BUFFER);
bOk=::ClosePrinter(pn);
if(!bOk)
{
free(print);
return ;
}
free(print);
PAGESETUPDLG& psd = dlg.m_psd; psd.Flags |= PSD_INHUNDREDTHSOFMILLIMETERS; PRINTDLG pd;
pd.hDevNames = NULL;
pd.hDevMode = NULL; if( GetPrinterDeviceDefaults(&pd) )
{
psd.hDevNames = pd.hDevNames;
psd.hDevMode = pd.hDevMode;
dlg.GetDevMode()->dmFields = DM_PAPERSIZE|DM_PAPERLENGTH|DM_PAPERWIDTH;
dlg.GetDevMode()->dmPaperSize = 0; //256
dlg.GetDevMode()->dmPaperWidth = 600;
dlg.GetDevMode()->dmPaperLength= 200; SelectPrinter(psd.hDevNames, psd.hDevMode);
}
就连16K纸的也没作用(我在WIN2K下用的,MSDN说WIN2K下能用16K的)
我已经在项目中成功实现了,都用了快两年了。
pd.lStructSize=(DWORD)sizeof(PRINTDLG);
BOOL bRet=GetPrinterDeviceDefaults(&pd);
if(bRet)
{
// protect memory handle with ::GlobalLock and ::GlobalUnlock
DEVMODE FAR *pDevMode=(DEVMODE FAR *)::GlobalLock(m_hDevMode);
// set orientation to landscape
pDevMode->dmFields = DM_PAPERSIZE|DM_PAPERLENGTH|DM_PAPERWIDTH;
pDevMode->dmPaperSize = 0; //256
if(i==1)
pDevMode->dmOrientation=DMORIENT_LANDSCAPE;
else if(i==0)
pDevMode->dmOrientation=DMORIENT_PORTRAIT;
pDevMode->dmPaperSize=DMPAPER_A3;
pDevMode->dmPaperWidth=1950;
pDevMode->dmPaperLength=1900;
::GlobalUnlock(m_hDevMode);
}
我原来把pDevMode->dmFields = DM_PAPERSIZE¦DM_PAPERLENGTH¦DM_PAPERWIDTH;
写成pDevMode->dmFields = DM_PAPERSIZE了
试试256,我曾经碰到这种情况。