- 论坛徽章:
- 0
|
API实现打印,基本步骤是:1.获取打印机名(本例是取得系统默认打印机);2.根据打印机名创建打印DC;3.打印过程,这一步与MFC中封装的打印流程类似,也有StartDoc,设置DC,循环打印每一页(本例只是打印一页,多页打印只需要事先计算出打印的总页数,设置nEndPage值,然后根据当前笔的Y坐标进行换页即可),最后EndDoc的过程,以下是示例代码:
BOOL OnPrint()
{
//1. Get Printer name
char *szDriverName = NULL;
nsOS nsVersion = CheckOSVersion(); //取OS版本
if(nsVersion <= nsOSME)
{
DWORD dwNeeded = 0;
DWORD dwReturned = 0;
PRINTER_INFO_2 *ppi2 = NULL;
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;
szDriverName = new char[dwDriverName];
lstrcpy(szDriverName, ppi2->pPrinterName);
}
else if(nsVersion == nsOSNT)
{
char szprinter[MAX_PATH];
if (GetProfileString("windows", "device", ",,,", szprinter, MAX_PATH) <= 0)
{
return ID_BT_PRINT;
}
// Printer name precedes first "," character.
strtok(szprinter, ",");
DWORD dwDriverName = (DWORD)lstrlen(szprinter) + 1;
szDriverName = new char[dwDriverName];
lstrcpy(szDriverName, szprinter);
}
else //2K or later
{
szDriverName = new char[MAX_PATH];
DWORD dwBuffer = MAX_PATH;
GetDefaultPrinter(szDriverName, &dwBuffer);
if(strlen(szDriverName) < 1 || dwBuffer < 1)
{
delete[] szDriverName;
return ID_BT_PRINT;
}
}
//2.Print process
HDC hDCPrint = NULL;
hDCPrint = CreateDC(NULL, szDriverName, NULL, NULL);
delete[] szDriverName;
szDriverName = NULL;
//Set DOCINFO
DOCINFO docInfo;
memset(&docInfo, 0, sizeof(DOCINFO));
docInfo.cbSize = sizeof(DOCINFO);
docInfo.lpszDocName = NULL;
docInfo.lpszOutput = NULL;
if(StartDoc(hDCPrint, &docInfo) <= 0)
{
AbortDoc(hDCPrint);
return ID_BT_PRINT;
}
int nSaveDC = SaveDC(hDCPrint);
//Create font
HFONT hFont = CreateFont(16, 0, 0, 0, 400, 0, 0, 0,
DEFAULT_CHARSET, OUT_TT_PRECIS,
CLIP_TT_ALWAYS, PROOF_QUALITY,
VARIABLE_PITCH | FF_MODERN | 0x04,
"MS Sans Serif");
HFONT hOldFont = (HFONT)SelectObject(hDCPrint, hFont);
char sInfoText[MAX_PATH];
memset(sInfoText, 0, MAX_PATH);
// 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;
// Print content
memset(sInfoText, 0, MAX_PATH);
strcpy(sInfoText, "MyText");
DoPrint(hDCPrint, sInfoText, x, y);
//end of this page print
if(EndPage(hDCPrint) <= 0)
break;
}
EndDoc(hDCPrint);
SelectObject(hDCPrint, hOldFont);
RestoreDC(hDCPrint, nSaveDC);
DeleteDC(hDCPrint);
}
BOOL DoPrint(HDC hDCPrint, LPTSTR lpsInfo, int &x, int &y)
{
if(hDCPrint == NULL || lpsInfo == NULL || strlen(lpsInfo) <= 0)
return FALSE;
SIZE szViewExt;
SIZE szWindowExt;
GetViewportExtEx(hDCPrint, &szViewExt);
GetWindowExtEx(hDCPrint, &szWindowExt);
int nWidth = GetDeviceCaps(hDCPrint, HORZRES);
int nStrLength = strlen(lpsInfo);
int nRestStrLength = nStrLength;
int nIndex = 0;
SIZE sztext;
GetTextExtentPoint32(hDCPrint, lpsInfo, nStrLength, &sztext);
sztext.cx = int(float(sztext.cx) * szViewExt.cx / szWindowExt.cx);
float fLine = float(sztext.cx) / float(nWidth);
int cbString = int(nStrLength / fLine);
LPTSTR pStr = lpsInfo;
do //control string length,print one string in multi-line if necessary
{
pStr = lpsInfo + nIndex;
if(nRestStrLength > cbString)
TextOut(hDCPrint, x, y, pStr, cbString);
else
TextOut(hDCPrint, x, y, pStr, nRestStrLength);
nRestStrLength -= cbString;
y += (sztext.cy + SPACEWIDTH);
nIndex += cbString;
} while(nIndex < nStrLength);
return TRUE;
}
enum nsOS
{
nsOS95 = 0,
nsOS98,
nsOSME,
nsOSNT,
nsOS2K,
nsOSXP,
nsOSVista,
nsUpper
};
nsOS CheckOSVersion()
{
OSVERSIONINFO osvi;
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx (&osvi);
nsOS nsVersion = nsOS95;
if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10) //98
nsVersion = nsOS98;
else if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90) //ME
nsVersion = nsOSME;
else if(osvi.dwPlatformId == VER_PLATFORM_WIN32_NT && osvi.dwMajorVersion <= 4) //NT
nsVersion = nsOSNT;
else if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 ) //2K
nsVersion = nsOS2K;
else if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 ) //XP
nsVersion = nsOSXP;
else if ( osvi.dwMajorVersion >= 6) //Vista
nsVersion = nsOSVista;
return nsVersion;
} |
|