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);

解决方案 »

  1.   

    CPageSetupDialog dlg;
    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);
    }
      

  2.   

    对自定义纸是没有作用。我也试过了。
    就连16K纸的也没作用(我在WIN2K下用的,MSDN说WIN2K下能用16K的)
      

  3.   

    wengf(wengf), 你是按我讲的去做的吗?
    我已经在项目中成功实现了,都用了快两年了。
      

  4.   

    以下代码也没用    PRINTDLG pd;
       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);
       }
      

  5.   

    我试出来了。
    我原来把pDevMode->dmFields = DM_PAPERSIZE¦DM_PAPERLENGTH¦DM_PAPERWIDTH;
    写成pDevMode->dmFields = DM_PAPERSIZE了
      

  6.   

    pDevMode->dmPaperSize = 0; //256
    试试256,我曾经碰到这种情况。