免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2787 | 回复: 0
打印 上一主题 下一主题

API 编程实现打印 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-28 16:01 |只看该作者 |倒序浏览
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;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP