VC开发打印机相关API

来源:互联网 发布:算法工程师需要哪些知识 编辑:程序博客网 时间:2024/05/25 23:59
最近要弄打印相关的模块,  在网络上查找相关贴子, 发现都比较零散.  整理下经常用到的功能, 备以后使用查询.

遍历当前PC机中已有打印机, 使用EnumPrinter() API可完成

DWORD dwFlag = PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS;

PRINTER_INFO_4*  pPrinterInfo = NULL;
DWORD  dwNeed = 0;
DWORD  dwReturn = 0;

while( !EnumPrinters( dwFlag, NULL, 4, (LPBYTE)pPrinterInfo, dwNeed, &dwNeed, &dwReturn ) )
{
  DWORD dwErr = GetLastError();
  if( dwErr == ERROR_INSUFFICIENT_BUFFER )
  {
   if( pPrinterInfo )
   {
    LocalFree( pPrinterInfo );
   }
   pPrinterInfo = ( PRINTER_INFO_4* )LocalAlloc( LPTR, dwNeed );
  }
  else
  {
   break;
  }
}

for( int i = 0; i < (int)dwReturn; i++ )
{

    // 打印机名
    m_lstPrinter.push_back( pPrinterInfo[i].pPrinterName );
}

if( pPrinterInfo )
{
  LocalFree( pPrinterInfo );
}

枚举打印机纸张尺寸, 使用DeviceCapabilities()查询,  DC_PAPERNAMES参数是用来查询用来显示的纸张名称, DC_PAPERSIZE是用来参询具体纸张尺寸, 单位0.1MM.

UINT iBuffSize = DeviceCapabilities( m_strDevName.c_str(), NULL, DC_PAPERNAMES, NULL, NULL );
if( iBuffSize > 0 )
{
  char  szPaperNameList[32][64];
  UINT iFlag = DeviceCapabilities( m_strDevName.c_str(), NULL, DC_PAPERNAMES, (LPSTR)szPaperNameList, NULL );
  if( iFlag != -1 )
  {
   for( int i = 0; i < iBuffSize; i++ )
   {
    m_vecPaperName.push_back( szPaperNameList[i] );
   }
  }
}

iBuffSize = DeviceCapabilities( m_strDevName.c_str(), NULL, DC_PAPERSIZE, NULL, NULL );
if( iBuffSize > 0 )
{
  POINT arrPaperSize[32];
  memset( arrPaperSize, 0, 32 * sizeof( POINT ) );
  UINT iFlag = DeviceCapabilities( m_strDevName.c_str(), NULL, DC_PAPERSIZE, (LPSTR)arrPaperSize, NULL );
  if( iFlag != -1 )
  {
   for( int i = 0; i < iBuffSize; i++ )
   {
    m_vecPaperSize.push_back( arrPaperSize[i] );
   }
  }
}

// 创建打印DC

m_hPrinterDC = ::CreateDC( NULL, strDevName.c_str(), NULL, NULL );

// 设置当前打印纸张尺寸

PRINTDLG printInfoDlg;
ZeroMemory( &printInfoDlg, sizeof( PRINTDLG ) );
printInfoDlg.lStructSize = sizeof( PRINTDLG );
printInfoDlg.hwndOwner = hWnd;
printInfoDlg.hDevMode = 0;
printInfoDlg.hDevNames = 0;
printInfoDlg.nCopies = 1;
printInfoDlg.nFromPage = 0xFFFF;
printInfoDlg.nToPage = 0xFFFF;
printInfoDlg.nMinPage = 1;
printInfoDlg.nMinPage = 0xFFFF;
printInfoDlg.Flags = PD_RETURNDC | PD_USEDEVMODECOPIESANDCOLLATE;

    
// 读取默认打印机参数
if( PrintDlg( &printInfoDlg ) )
{


  //if( !GetDeviceCaps( printInfoDlg.hDC, RASTERCAPS ) & RC_STRETCHDIB )
  //{

           // 这里可以用来检查当前的打印设备是否可以支持一些绘制函数, 详细查MSDN

  //}

  DeleteDC( printInfoDlg.hDC );
}


LPDEVMODE lpDevMode = (LPDEVMODE)::GlobalLock( printInfoDlg.hDevMode );
if( lpDevMode )
{
   lpDevMode->dmPaperSize = DMPAPER_A6;   // 系统默认尺寸 A6 ( 4 * 6 英寸 )

                                                  DMPAPER_USER;  // 自定义尺寸

   lpDevMode->dmPaperWidth = 1048;                     // 自定义才需要设定

   lpDevMode->dmPaperLength = 1560;                   // 自定义才需要设定
 

  lpDevMode->dmOrientation = nOrient;
  lpDevMode->dmCopies = nCopies;
  lpDevMode->dmFields |= DM_PAPERSIZE | DM_PAPERWIDTH | DM_PAPERLENGTH | DM_ORIENTATION | DM_COPIES;
}
GlobalUnlock( printInfoDlg.hDevMode );

ResetDC( hDC, printInfoDlg.hDevMode );    // 把相关参数设置给当前打印DC

还有很多细节查看MSDN文档