SetLastError(0);
BOOL bFlag = EnumPrinters(PRINTER_ENUM_DEFAULT, NULL, 2, NULL, 0, &dwNeeded, &dwReturned);
{
if ((GetLastError() != ERROR_INSUFFICIENT_BUFFER) || (dwNeeded == 0))
{
return ID_BT_PRINT; //No printer or other error
}
}
// Allocate enough space for PRINTER_INFO_2.
ppi2 = (PRINTER_INFO_2 *)GlobalAlloc(GPTR, dwNeeded);
if (!ppi2)
{
return ID_BT_PRINT;
}
// The second EnumPrinters() will fill in all the current information.
bFlag = EnumPrinters(PRINTER_ENUM_DEFAULT, NULL, 2, (LPBYTE)ppi2, dwNeeded, &dwNeeded, &dwReturned);
if (!bFlag)
{
GlobalFree(ppi2);
return ID_BT_PRINT;
}
// If specified buffer is too small, set required size and fail.
DWORD dwDriverName = (DWORD)lstrlen(ppi2->pPrinterName) + 1;
// begin page printing loop
UINT nStartPage = 1; //printInfo.GetFromPage();
UINT nEndPage = 1; //printInfo.GetToPage();
int nStep = (nEndPage >= nStartPage) ? 1 : -1;
nEndPage = (nEndPage == 0xffff) ? 0xffff : nEndPage + nStep;
for (UINT i=nStartPage; i < nEndPage; i += nStep)
{
// attempt to start the current page
if (StartPage(hDCPrint) <= 0)
break;
//Prepare DC
SetMapMode(hDCPrint, MM_ANISOTROPIC);
int nLog = 72;
int nLogXPrint = GetDeviceCaps(hDCPrint, LOGPIXELSX);
int nLogYPrint = GetDeviceCaps(hDCPrint, LOGPIXELSY);
SIZE szViewExt;
SetViewportExtEx(hDCPrint, nLogXPrint, nLogYPrint, &szViewExt);
SetWindowExtEx(hDCPrint, nLog, nLog, &szViewExt);
int x = 20;
int y = 20;