请问我该怎么自定义打印纸的大小?并且能够在打印预览的时候可以看到效果?例如我在对话框里选择了20 x 20 cm大小的纸张,那么就可以在打印预览的时候看到这个正方形的打印纸张?最好有源码相送([email protected])

解决方案 »

  1.   

    看这个对你有没有用
    //打印机的初始化设置
    CPrintDialog dlg(FALSE,PD_ALLPAGES | PD_USEDEVMODECOPIES | PD_NOPAGENUMS | PD_HIDEPRINTTOFILE | PD_NOSELECTION,this); 
       
    CRuixingZJApp* pApp = static_cast<CRuixingZJApp*>( ::AfxGetApp() );
    long Len;
    WORD nWord = 0;
    HANDLE hPrinter;

    DEVMODE* pDevMode;
    DEVNAMES* lpDevNames;
    LPTSTR lpszDeviceName;

        ///////////////////////////////////////////////////////////////////
        if(pApp->GetPrinterDeviceDefaults(&dlg.m_pd) == 0)
    {
    ::AfxMessageBox("错误!当前没有连接打印机!",MB_OK);
    return;
    }
    pDevMode = (DEVMODE*)GlobalLock(dlg.m_pd.hDevMode);
    lpDevNames = (LPDEVNAMES)GlobalLock(dlg.m_pd.hDevNames);
    lpszDeviceName = (LPTSTR )lpDevNames + lpDevNames->wDeviceOffset; if (::OpenPrinter((char *) pDevMode->dmDeviceName, &hPrinter, NULL) == FALSE)
    return;
    Len = DocumentProperties(NULL, NULL, lpszDeviceName, pDevMode, NULL, 0);
    pDevMode->dmPaperSize = DMPAPER_A4;
    lstrcpy((char *)pDevMode->dmFormName,"A4 210 *297 mm");    Len = DocumentProperties(NULL, hPrinter, lpszDeviceName, NULL, pDevMode, DM_IN_BUFFER);
    GlobalUnlock(dlg.m_pd.hDevMode);
    GlobalUnlock(dlg.m_pd.hDevNames);
      

  2.   

    是啊,但是都没有用啊,我都用了,都不能改变打印机的默认设置,纸张一直用的是
    8.5 x 11 in 即使我把dmPaperSize 设置为0然后把dmPelsWidth和dmPelsHeight设置为需要的大小
    到打印预览里面,仍然不起作用
      

  3.   

    我这里测试通过的一段代码,你给放到 C****App::InitInstance()的最后测试一下 PRINTDLG pd;
    pd.lStructSize=(DWORD)sizeof(PRINTDLG);
    BOOL bRet=AfxGetApp()->GetPrinterDeviceDefaults(&pd);
    if(bRet)
    {
    // protect memory handle with ::GlobalLock and ::GlobalUnlock
    DEVMODE FAR *pDevMode=(DEVMODE FAR *)::GlobalLock(pd.hDevMode);
    pDevMode->dmFields|=DM_PAPERSIZE;
    pDevMode->dmFields|=DM_PAPERLENGTH;
    pDevMode->dmFields|=DM_PAPERWIDTH;
    // pDevMode->dmOrientation=2;   
    pDevMode->dmPaperSize=0;

    pDevMode->dmPaperLength=2000;
    pDevMode->dmPaperWidth=2000;
    ::GlobalUnlock(pd.hDevMode);
    }