1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
// -------------------------------------------------------------
int ReportPrint(const char *szPrinterName,const char *szDocumentName,int nCopy)
{
//
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if(!pDrawReport) return 0;
if(!pDrawReport->OnInitReport())
{
delete pDrawReport;
pDrawReport=NULL;
return(0);
}
CDC *pDC;
// lecture du m_choix imprimante
char PrnStr[200],prn[256];
GetProfileString("PrinterPorts",szPrinterName,NULL,PrnStr,sizeof(PrnStr)-1);
strcpy(prn,szPrinterName);
strcat(prn,",");
strcat(prn,PrnStr);
char *szDriver,
*szDevice,
*szOutput;
szDevice=strtok(prn,",");
szDriver=strtok(NULL,",");
szOutput=strtok(NULL,",");
// load printer driver
HANDLE hDriver;
if(!OpenPrinter(szDevice,&hDriver,NULL)) return 0;
if(!hDriver) return 0;
DWORD dwBufSize = 0;
LPDEVMODE lpDM;
// get DEVMODE stuff from driver
dwBufSize =DocumentProperties( NULL,
(HANDLE)hDriver,
(LPSTR)szDevice,
(LPDEVMODE)NULL,
(LPDEVMODE)NULL,
(DWORD) 0);
// alloc space for devmode stuff
HANDLE hDevMode= GlobalAlloc(GMEM_MOVEABLE, dwBufSize);
lpDM = (LPDEVMODE)GlobalLock(hDevMode);
dwBufSize =DocumentProperties(NULL,
(HANDLE)hDriver,
(LPSTR)szDevice,
(LPDEVMODE)lpDM,
(LPDEVMODE)NULL,
(DWORD)DM_COPY);
if((lpDM->dmFields & DM_COPIES) && nCopy!=1)
lpDM->dmCopies=nCopy;
ClosePrinter(hDriver);
pDC = new CDC;
pDC->CreateDC(szDriver,szDevice,szOutput,lpDM);
pDC->m_bPrinting = TRUE;
// Unlock memory handle.
::GlobalUnlock(hDevMode);
DOCINFO m_docInfo;
memset(&m_docInfo, 0, sizeof(m_docInfo));
m_docInfo.cbSize = sizeof(m_docInfo);
m_docInfo.lpszDocName = szDocumentName;
m_docInfo.lpszOutput = NULL;
BOOL bRet=TRUE;
// start document printing process
if (pDC->StartDoc(&m_docInfo)!= SP_ERROR)
{
pDrawReport->OnDrawReport(pDC);
pDC->EndPage(); // fin de page
pDC->EndDoc();
}
else bRet=FALSE;
delete pDC;
delete pDrawReport;
pDrawReport=NULL;
if(hDevMode != NULL)
{
DEVMODE FAR* pDevMode =(DEVMODE FAR*)GlobalLock(hDevMode);
::GlobalFree(hDevMode);
}
return bRet;
} |
Partager