如何获得当前电脑上所有打印机所有支持的纸张类型和大小..解决送分!

ufonasa 2008-01-20 04:33:42
RT
...全文
2968 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
vc815 2008-03-20
  • 打赏
  • 举报
回复
MARK
donghaima 2008-01-20
  • 打赏
  • 举报
回复
////////////////////////////////////////////////////////////////////////////////////////
//用途:枚举某打印机的可用纸张
//参数:PrintName=打印机名称
// Reserve=保留
//返回:成功返回TRUE,属性PaperName放置可用纸张的名称,这时应该继续用这个方法并将第1个
// 置""继续枚举直到返回FALSE
BOOL CUntitled::EnumPaper(LPCTSTR PrintName, LPCTSTR Reserve)
{
// TODO: Add your dispatch handler code here
strLastError="";
strPaperName="";

if(strlen(PrintName)>0)
{
strPaperBuff="";
PRINTER_INFO_2 *ppi2=GetPrintInfo((CHAR *)PrintName);
if(ppi2)
{
//获得可用打印机纸张类型数目
int nNeeded=DeviceCapabilities(PrintName,ppi2->pPortName,DC_PAPERNAMES,NULL,NULL);
if(nNeeded)
{
PAPERNAME *pszPaperNames=new PAPERNAME[nNeeded]; //分配纸张名称数组
//获得可用打印机纸张名称数组
if(DeviceCapabilities(PrintName,ppi2->pPortName,DC_PAPERNAMES,(LPTSTR)pszPaperNames,NULL)!=-1)
{
for(int m=0;m<nNeeded;m++)
{
strPaperBuff+=pszPaperNames[m];
strPaperBuff+="\t";
}
}
delete []pszPaperNames;
}
GlobalFree((HGLOBAL)ppi2);
}
else
{
strLastError="获得打印机信息失败,请检查打印机名称是否正确";
return FALSE;
}
}

if(strPaperBuff.GetLength()==0)
return FALSE;

//查找加号的位置,下标基值0
INT i=strPaperBuff.Find("\t");
//将信息读到字符串对象,正好读到加号前一个字符
strPaperName=strPaperBuff.Left(i);
//将加号后的字符串重新写到对象
i=strPaperBuff.GetLength()-i-1;
strPaperBuff=strPaperBuff.Right(i);
return TRUE;
}

////////////////////////////////////////////////////////////////////////////////////////
//用途:枚举系统打印机
//参数:FirstEnum=1,开始枚举;如果返回TRUE,应该将这个参数置0,继续枚举直到返回FALSE
// Reserve=保留
//返回:成功返回TRUE,属性PrintName放置打印机名称,这时应该继续用这个方法并将第1个
// 置0继续枚举直到返回FALSE
BOOL CUntitled::EnumPrint(long FirstEnum,LPCTSTR Reserve)
{
// TODO: Add your dispatch handler code here
strLastError="";
strPrintName="";

PRINTER_INFO_2 *pPrinterInfo=NULL;
DWORD dFlags=0;
DWORD cbNeeded=0;
DWORD cbReturned=0;
LPBYTE buff=NULL;

if(FirstEnum==1)
{
strPrintBuff="";
if(IsWindowsNT(""))
dFlags=PRINTER_ENUM_CONNECTIONS|PRINTER_ENUM_LOCAL;
else
dFlags=PRINTER_ENUM_LOCAL;

EnumPrinters(dFlags,NULL,2,NULL,NULL,&cbNeeded,&cbReturned);
if(cbNeeded>0)
{
buff=new BYTE[cbNeeded];
if(EnumPrinters(dFlags,NULL,2,buff,cbNeeded,&cbNeeded,&cbReturned)==TRUE)
{
pPrinterInfo=(PRINTER_INFO_2 *)buff;
for(DWORD m=0;m<cbReturned;m++)
{
strPrintBuff+=pPrinterInfo[m].pPrinterName;
strPrintBuff+="\t";
}
}
delete []buff;
}
}

if(strPrintBuff.GetLength()==0)
return FALSE;

//查找加号的位置,下标基值0
INT i=strPrintBuff.Find("\t");
//将信息读到字符串对象,正好读到加号前一个字符
strPrintName=strPrintBuff.Left(i);
//将加号后的字符串重新写到对象
i=strPrintBuff.GetLength()-i-1;
strPrintBuff=strPrintBuff.Right(i);
return TRUE;
}
donghaima 2008-01-20
  • 打赏
  • 举报
回复
////////////////////////////////////////////////////////////////////////////////////////
//用途:由纸张编号得到对应的纸张名称
//参数:szPrinterName=打印机名称
// szPortName=打印机端口名称
// nPaperSize=纸张索引号
// szPaperName[OUT]=纸张名称
void CUntitled::GetPaperFormName(LPTSTR szPrinterName, LPTSTR szPortName, short nPaperSize,PAPERNAME szPaperName)
{
strcpy(szPaperName,"");

//获得可用打印机纸张类型数目
int nNeeded=DeviceCapabilities(szPrinterName,szPortName,DC_PAPERNAMES,NULL,NULL);
if(nNeeded)
{
PAPERNAME *pszPaperNames=new PAPERNAME[nNeeded]; //分配纸张名称数组
//获得可用打印机纸张名称数组
if(DeviceCapabilities(szPrinterName,szPortName,DC_PAPERNAMES,(LPTSTR)pszPaperNames,NULL)!=-1)
{
//获得可用打印机纸张尺寸号数目(应该等于打印机纸张类型数目)
nNeeded=DeviceCapabilities(szPrinterName,szPortName,DC_PAPERS,NULL,NULL);
if(nNeeded)
{
LPWORD pPapers=new WORD[nNeeded]; //分配纸张尺寸号数组
//获得可用打印机纸张尺寸号数组
if(DeviceCapabilities(szPrinterName,szPortName,DC_PAPERS,(LPSTR)pPapers,NULL)!=-1)
{
//查找纸张尺寸nPaperSize在数组中的索引
for(int i=0;i<nNeeded;i++)
{
if(pPapers[i]==nPaperSize)
{ //找到指定的纸张Size,返回对应的纸张名称
_tcsncpy(szPaperName,pszPaperNames[i],64);
break;
}
}
}
delete []pPapers;
}
}
delete []pszPaperNames;
}
return;
}

////////////////////////////////////////////////////////////////////////////////////////
//用途:获得纸张类型索引号失败
//参数:szPrinterName=打印机名称
// szPortName=打印机端口名称
// szPaperName=纸张名称
//返回:获得纸张类型索引号,返回-1表示失败
short CUntitled::GetPaperSize(LPTSTR szPrinterName, LPTSTR szPortName,PAPERNAME szPaperName)
{
short nPaperSize=-1;

//获得可用打印机纸张类型数目
int nNeeded=DeviceCapabilities(szPrinterName,szPortName,DC_PAPERNAMES,NULL,NULL);
if(nNeeded)
{
PAPERNAME *pszPaperNames=new PAPERNAME[nNeeded]; //分配纸张名称数组
//获得可用打印机纸张名称数组
if(DeviceCapabilities(szPrinterName,szPortName,DC_PAPERNAMES,(LPTSTR)pszPaperNames,NULL)!=-1)
{
INT i;
//查找纸张类型szPaperName在数组中的索引
for(i=0;i<nNeeded && _tcscmp(pszPaperNames[i],szPaperName);i++);

if(i<nNeeded)
{
//获得可用打印机纸张尺寸号数目(应该等于打印机纸张类型数目)
nNeeded=DeviceCapabilities(szPrinterName,szPortName,DC_PAPERS,NULL,NULL);
if(nNeeded)
{
LPWORD pPapers=new WORD[nNeeded]; //分配纸张尺寸号数组
//获得可用打印机纸张尺寸号数组
if(DeviceCapabilities(szPrinterName,szPortName,DC_PAPERS,(LPSTR)pPapers,NULL)!=-1)
{
nPaperSize=pPapers[i]; //获得纸张类型szPaperName对应的尺寸号
}
delete []pPapers;
}
}
}
delete []pszPaperNames;
}
return nPaperSize;
}

////////////////////////////////////////////////////////////////////////////////////////
//用途:设置默认打印机
//参数:PrintName=打印机名称
// Reserve=保留
//返回:成功返回TRUE,反之FALSE
BOOL CUntitled::SetDefaultPrint(LPCTSTR PrintName, LPCTSTR Reserve)
{
// TODO: Add your dispatch handler code here
strLastError="";

BOOL bReturn=FALSE;
if(IsWindowsNT(""))
{
if(WindowsVer("")>=5) //win2000/2003/xp
{
if(SetDefaultPrinter(PrintName)==TRUE)
bReturn=TRUE;
else
strLastError="设置默认的打印机失败";
}
else //win nt 4 要写win.ini文件
{
LPTSTR pBuffer=NULL;
PRINTER_INFO_2 *ppi2=GetPrintInfo((CHAR *)PrintName);
if(ppi2)
{
pBuffer=new CHAR[lstrlen(PrintName)+lstrlen(ppi2->pDriverName)+lstrlen(ppi2->pPortName)+3];
lstrcpy(pBuffer,PrintName);
lstrcat(pBuffer,",");
lstrcat(pBuffer,ppi2->pDriverName);
lstrcat(pBuffer,",");
lstrcat(pBuffer,ppi2->pPortName);
//写到win.ini文件中
if(WriteProfileString("windows","device",pBuffer)==TRUE)
bReturn=TRUE;
else
strLastError="设置默认的打印机失败";

delete [] pBuffer;
GlobalFree((HGLOBAL)ppi2);
SendMessageTimeout(HWND_BROADCAST,WM_SETTINGCHANGE,0L,
(LPARAM)(LPCTSTR)"windows",SMTO_NORMAL,1000,NULL);
}
else
strLastError="获得打印机信息失败,请检查打印机名称是否正确";
}
}
else //win98,win95使用SetPrinter函数,修改成员Attributes
{
PRINTER_INFO_2 *ppi2=GetPrintInfo((CHAR *)PrintName);
if(ppi2)
{
ppi2->Attributes|=PRINTER_ATTRIBUTE_DEFAULT;
if(SetPrintInfo(ppi2)==TRUE)
bReturn=TRUE;
else
strLastError="设置默认的打印机失败";

SendMessageTimeout(HWND_BROADCAST,WM_SETTINGCHANGE,0L,0L,SMTO_NORMAL,1000,NULL);
GlobalFree((HGLOBAL)ppi2);
}
}
return bReturn;
}

////////////////////////////////////////////////////////////////////////////////////////
//用途:存放枚举出的某打印机可用纸张的名称或打印机的默认纸张名称
BSTR CUntitled::GetPaperName()
{
CString strResult;
// TODO: Add your property handler here

strResult=strPaperName;
return strResult.AllocSysString();
}

//废弃
void CUntitled::SetPaperName(LPCTSTR lpszNewValue)
{
// TODO: Add your property handler here
}

////////////////////////////////////////////////////////////////////////////////////////
//用途:存放枚举出的本地所有打印机名称或系统默认打印机名称
BSTR CUntitled::GetPrintName()
{
CString strResult;
// TODO: Add your property handler here

strResult=strPrintName;
return strResult.AllocSysString();
}

//废弃
void CUntitled::SetPrintName(LPCTSTR lpszNewValue)
{
// TODO: Add your property handler here
}

////////////////////////////////////////////////////////////////////////////////////////
//用途:获得打印机默认纸张
//参数:PrintName=打印机名称
// Reserve=保留
//返回:成功返回TRUE,属性PaperName放置默认纸张名称;反之FALSE
BOOL CUntitled::GetDefaultPaper(LPCTSTR PrintName, LPCTSTR Reserve)
{
// TODO: Add your dispatch handler code here
strLastError="";
strPaperName="";

BOOL bReturn=FALSE;
PRINTER_INFO_2 *ppi2=GetPrintInfo((CHAR *)PrintName);
if(ppi2)
{
LPDEVMODE pdm=(ppi2->pDevMode);
if(pdm)
{
PAPERNAME szPaperName;
GetPaperFormName((CHAR *)PrintName,ppi2->pPortName,pdm->dmPaperSize,szPaperName);
strPaperName=szPaperName;
bReturn=TRUE;
}
else
strLastError="获得打印机信息失败";

GlobalFree((HGLOBAL)ppi2);
}
else
strLastError="获得打印机信息失败,请检查打印机名称是否正确";

return bReturn;
}

////////////////////////////////////////////////////////////////////////////////////////
//用途:获得系统默认打印机名称
//参数:Reserve=保留
//返回:成功返回TRUE,属性PrintName放置默认打印机名称;反之FALSE
BOOL CUntitled::GetDefaultPrint(LPCTSTR Reserve)
{
// TODO: Add your dispatch handler code here
strLastError="";
strPrintName="";

BOOL bReturn=FALSE;

CPrintDialog pd(FALSE);
if(pd.GetDefaults())
{
if(pd.m_pd.hDC)
DeleteDC(pd.m_pd.hDC);

if(pd.m_pd.hDevNames)
{
LPDEVNAMES pdn=(LPDEVNAMES)GlobalLock(pd.m_pd.hDevNames);
strPrintName=(LPTSTR)pdn+pdn->wDeviceOffset;
GlobalUnlock(pd.m_pd.hDevNames);
GlobalFree(pd.m_pd.hDevNames);
bReturn=TRUE;
}
else
strLastError="没有安装打印机";
}
else
strLastError="操作打印机对话框失败";

return bReturn;
}
donghaima 2008-01-20
  • 打赏
  • 举报
回复
////////////////////////////////////////////////////////////////////////////////////////
//用途:增加自定义纸张
//参数:PrintName=打印机名称
// PaperName=要增加的纸张名称,这个参数在WIN9.X不使用
// Width=纸张的宽度,以0.1微米为单位
// Height=纸张的高度,以0.1微米为单位
// Left=打印机左边距,以0.1微米为单位,这个参数在WIN9.X不使用
// Right=打印机右边距,以0.1微米为单位,这个参数在WIN9.X不使用
// Top=打印机上边距,以0.1微米为单位,这个参数在WIN9.X不使用
// Bottom=打印机下边距,以0.1微米为单位,这个参数在WIN9.X不使用
// Reserve=保留
//返回:成功返回TRUE,失败返回FALSE
//注释:可以用这个方法修改已经存在的自定义纸张属性
BOOL CUntitled::AddCustomPaper(LPCTSTR PrintName, LPCTSTR PaperName, long Width, long Height, long Left, long Right, long Top, long Bottom, LPCTSTR Reserve)
{
// TODO: Add your dispatch handler code here
strLastError="";

BOOL bReturn=FALSE;
if(IsWindowsNT("")) //Windows NT4/2000/XP才支持
{
FORM_INFO_1 fi1;

fi1.Flags=FORM_USER;
fi1.pName=(LPTSTR)PaperName;
fi1.Size.cx=Width*100;
fi1.Size.cy=Height*100;
fi1.ImageableArea.left=Left*100;
fi1.ImageableArea.top=Top*100;
fi1.ImageableArea.right=fi1.Size.cx-Right*100;
fi1.ImageableArea.bottom=fi1.Size.cy-Bottom*100;

HANDLE hPrinter=GetPrinterHandle((CHAR *)PrintName);
if (hPrinter)
{
if(SetForm(hPrinter,(LPSTR)PaperName,1,(LPBYTE)&fi1)||//已存在该类型纸张则更改
AddForm(hPrinter,1,(LPBYTE)&fi1)==TRUE) //否则添加此自定义纸张
bReturn=TRUE;
else
strLastError="修改或增加自定义纸张失败";

ClosePrinter(hPrinter);
}
else
strLastError="获得打印机句柄失败,请检查打印机名称是否正确";
}
else
{
PRINTER_INFO_2 *ppi2=GetPrintInfo((CHAR *)PrintName);

if(ppi2)
{
ppi2->pDevMode->dmFields=DM_PAPERSIZE|DM_PAPERWIDTH|DM_PAPERLENGTH;
ppi2->pDevMode->dmPaperSize=(WORD)DMPAPER_USER;
ppi2->pDevMode->dmPaperWidth=(WORD)Width;
ppi2->pDevMode->dmPaperLength=(WORD)Height;

if(SetPrintInfo(ppi2)==FALSE)
strLastError="修改或增加自定义纸张失败";

GlobalFree((HGLOBAL)ppi2);
}
else
strLastError="获得打印机信息失败,请检查打印机名称是否正确";
}
return bReturn;
}

////////////////////////////////////////////////////////////////////////////////////////
//用途:获得打印机句柄
//参数:szPrinterName=打印机名称
//返回:返回打印机句柄
HANDLE CUntitled::GetPrinterHandle(LPTSTR szPrinterName)
{
PRINTER_DEFAULTS pds;
HANDLE hPrinter = NULL;

ZeroMemory(&pds, sizeof(PRINTER_DEFAULTS));
pds.DesiredAccess = PRINTER_ALL_ACCESS;
OpenPrinter(szPrinterName, &hPrinter, &pds);

return hPrinter;
}

////////////////////////////////////////////////////////////////////////////////////////
//用途:删除自定义纸张
//参数:PrintName=打印机名称
// PaperName=要删除的自定义纸张名称
// Reserve=保留
//返回:成功返回TRUE,失败返回FALSE
//注释:这个方法不能在WIN9.X上使用
BOOL CUntitled::DelCustomPaper(LPCTSTR PrintName, LPCTSTR PaperName, LPCTSTR Reserve)
{
// TODO: Add your dispatch handler code here
strLastError="";

BOOL bReturn=FALSE;
if (IsWindowsNT("")) //Windows NT4/2000/XP才支持
{
HANDLE hPrinter=GetPrinterHandle((CHAR *)PrintName);
if (hPrinter)
{
if(DeleteForm(hPrinter,(LPSTR)PaperName)==TRUE)
bReturn=TRUE;
else
strLastError="删除自定义纸张失败";

ClosePrinter(hPrinter);
}
else
strLastError="获得打印机句柄失败,请检查打印机名称是否正确";
}
else
strLastError="这个方法不能在WIN9.X下使用";

return bReturn;
}

////////////////////////////////////////////////////////////////////////////////////////
//用途:获取打印机详细信息
//参数:szPrinterName=打印机名称
//返回:打印机信息的结构指针
//注释:返回的指针用后必须以GlobalFree释放
PRINTER_INFO_2 * CUntitled::GetPrintInfo(LPTSTR szPrinterName)
{
HANDLE hPrinter=GetPrinterHandle(szPrinterName);
PRINTER_INFO_2 *ppi2=NULL;
DWORD cbNeeded=0;

if(hPrinter)
{
GetPrinter(hPrinter,2,0,0,&cbNeeded);
if(cbNeeded)
{
ppi2=(PRINTER_INFO_2 *)GlobalAlloc(GPTR,cbNeeded);
if(ppi2)
{
if(!GetPrinter(hPrinter,2,(LPBYTE)ppi2,cbNeeded,&cbNeeded))
{
GlobalFree((HGLOBAL)ppi2);
ppi2=NULL;
}
}
}
ClosePrinter(hPrinter);
}
return ppi2;
}

////////////////////////////////////////////////////////////////////////////////////////
//用途:设置打印机详细信息
//参数:打印机信息的结构指针
//返回:成功返回TRUE,反之FALSE
BOOLEAN CUntitled::SetPrintInfo(PRINTER_INFO_2 *ppi2)
{
HANDLE hPrinter=GetPrinterHandle(ppi2->pPrinterName);

BOOL bReturn=FALSE;
DWORD fMode;

if (hPrinter)
{
fMode=DM_IN_BUFFER|DM_OUT_BUFFER;
bReturn=(DocumentProperties(NULL, hPrinter,
ppi2->pPrinterName,
ppi2->pDevMode,
ppi2->pDevMode,
fMode)==IDOK&&
SetPrinter(hPrinter,2,(LPBYTE)ppi2,0));
ClosePrinter(hPrinter);
}
return bReturn;
}

////////////////////////////////////////////////////////////////////////////////////////
//用途:设定打印机的默认纸张
//参数:PrintName=打印机名称
// PaperName=纸张名称
// Orientation=纸张方向,1=横向,2=纵向
// Reserve=保留
//返回:成功返回TRUE,反之FALSE
BOOL CUntitled::SetDefaultPaper(LPCTSTR PrintName, LPCTSTR PaperName, long Orientation, LPCTSTR Reserve)
{
// TODO: Add your dispatch handler code here
strLastError="";

BOOL bReturn=FALSE;
PRINTER_INFO_2 *ppi2=GetPrintInfo((CHAR *)PrintName);

if(ppi2)
{
short nPaperSize=GetPaperSize((CHAR *)PrintName,ppi2->pPortName,(CHAR *)PaperName);
if(nPaperSize!=-1)
{
ppi2->pDevMode->dmFields=DM_PAPERSIZE|DM_PAPERWIDTH|DM_PAPERLENGTH|DM_ORIENTATION;
ppi2->pDevMode->dmPaperSize=nPaperSize;
ppi2->pDevMode->dmPaperWidth=0;
ppi2->pDevMode->dmPaperLength=0;
ppi2->pDevMode->dmOrientation=(short)Orientation;
bReturn=SetPrintInfo(ppi2);
if(bReturn==FALSE)
strLastError="设置纸张名称或方向失败";
}
else
strLastError="获得纸张类型索引号失败";

GlobalFree((HGLOBAL)ppi2);
}
else
strLastError="获得打印机信息失败,请检查打印机名称是否正确";

return bReturn;
}

donghaima 2008-01-20
  • 打赏
  • 举报
回复
////////////////////////////////////////////////////////////////////////////////////////
//用途:增加自定义纸张
//参数:PrintName=打印机名称
// PaperName=要增加的纸张名称,这个参数在WIN9.X不使用
// Width=纸张的宽度,以0.1微米为单位
// Height=纸张的高度,以0.1微米为单位
// Left=打印机左边距,以0.1微米为单位,这个参数在WIN9.X不使用
// Right=打印机右边距,以0.1微米为单位,这个参数在WIN9.X不使用
// Top=打印机上边距,以0.1微米为单位,这个参数在WIN9.X不使用
// Bottom=打印机下边距,以0.1微米为单位,这个参数在WIN9.X不使用
// Reserve=保留
//返回:成功返回TRUE,失败返回FALSE
//注释:可以用这个方法修改已经存在的自定义纸张属性
BOOL CUntitled::AddCustomPaper(LPCTSTR PrintName, LPCTSTR PaperName, long Width, long Height, long Left, long Right, long Top, long Bottom, LPCTSTR Reserve)
{
// TODO: Add your dispatch handler code here
strLastError="";

BOOL bReturn=FALSE;
if(IsWindowsNT("")) //Windows NT4/2000/XP才支持
{
FORM_INFO_1 fi1;

fi1.Flags=FORM_USER;
fi1.pName=(LPTSTR)PaperName;
fi1.Size.cx=Width*100;
fi1.Size.cy=Height*100;
fi1.ImageableArea.left=Left*100;
fi1.ImageableArea.top=Top*100;
fi1.ImageableArea.right=fi1.Size.cx-Right*100;
fi1.ImageableArea.bottom=fi1.Size.cy-Bottom*100;

HANDLE hPrinter=GetPrinterHandle((CHAR *)PrintName);
if (hPrinter)
{
if(SetForm(hPrinter,(LPSTR)PaperName,1,(LPBYTE)&fi1)||//已存在该类型纸张则更改
AddForm(hPrinter,1,(LPBYTE)&fi1)==TRUE) //否则添加此自定义纸张
bReturn=TRUE;
else
strLastError="修改或增加自定义纸张失败";

ClosePrinter(hPrinter);
}
else
strLastError="获得打印机句柄失败,请检查打印机名称是否正确";
}
else
{
PRINTER_INFO_2 *ppi2=GetPrintInfo((CHAR *)PrintName);

if(ppi2)
{
ppi2->pDevMode->dmFields=DM_PAPERSIZE|DM_PAPERWIDTH|DM_PAPERLENGTH;
ppi2->pDevMode->dmPaperSize=(WORD)DMPAPER_USER;
ppi2->pDevMode->dmPaperWidth=(WORD)Width;
ppi2->pDevMode->dmPaperLength=(WORD)Height;

if(SetPrintInfo(ppi2)==FALSE)
strLastError="修改或增加自定义纸张失败";

GlobalFree((HGLOBAL)ppi2);
}
else
strLastError="获得打印机信息失败,请检查打印机名称是否正确";
}
return bReturn;
}

////////////////////////////////////////////////////////////////////////////////////////
//用途:获得打印机句柄
//参数:szPrinterName=打印机名称
//返回:返回打印机句柄
HANDLE CUntitled::GetPrinterHandle(LPTSTR szPrinterName)
{
PRINTER_DEFAULTS pds;
HANDLE hPrinter = NULL;

ZeroMemory(&pds, sizeof(PRINTER_DEFAULTS));
pds.DesiredAccess = PRINTER_ALL_ACCESS;
OpenPrinter(szPrinterName, &hPrinter, &pds);

return hPrinter;
}

////////////////////////////////////////////////////////////////////////////////////////
//用途:删除自定义纸张
//参数:PrintName=打印机名称
// PaperName=要删除的自定义纸张名称
// Reserve=保留
//返回:成功返回TRUE,失败返回FALSE
//注释:这个方法不能在WIN9.X上使用
BOOL CUntitled::DelCustomPaper(LPCTSTR PrintName, LPCTSTR PaperName, LPCTSTR Reserve)
{
// TODO: Add your dispatch handler code here
strLastError="";

BOOL bReturn=FALSE;
if (IsWindowsNT("")) //Windows NT4/2000/XP才支持
{
HANDLE hPrinter=GetPrinterHandle((CHAR *)PrintName);
if (hPrinter)
{
if(DeleteForm(hPrinter,(LPSTR)PaperName)==TRUE)
bReturn=TRUE;
else
strLastError="删除自定义纸张失败";

ClosePrinter(hPrinter);
}
else
strLastError="获得打印机句柄失败,请检查打印机名称是否正确";
}
else
strLastError="这个方法不能在WIN9.X下使用";

return bReturn;
}

////////////////////////////////////////////////////////////////////////////////////////
//用途:获取打印机详细信息
//参数:szPrinterName=打印机名称
//返回:打印机信息的结构指针
//注释:返回的指针用后必须以GlobalFree释放
PRINTER_INFO_2 * CUntitled::GetPrintInfo(LPTSTR szPrinterName)
{
HANDLE hPrinter=GetPrinterHandle(szPrinterName);
PRINTER_INFO_2 *ppi2=NULL;
DWORD cbNeeded=0;

if(hPrinter)
{
GetPrinter(hPrinter,2,0,0,&cbNeeded);
if(cbNeeded)
{
ppi2=(PRINTER_INFO_2 *)GlobalAlloc(GPTR,cbNeeded);
if(ppi2)
{
if(!GetPrinter(hPrinter,2,(LPBYTE)ppi2,cbNeeded,&cbNeeded))
{
GlobalFree((HGLOBAL)ppi2);
ppi2=NULL;
}
}
}
ClosePrinter(hPrinter);
}
return ppi2;
}

////////////////////////////////////////////////////////////////////////////////////////
//用途:设置打印机详细信息
//参数:打印机信息的结构指针
//返回:成功返回TRUE,反之FALSE
BOOLEAN CUntitled::SetPrintInfo(PRINTER_INFO_2 *ppi2)
{
HANDLE hPrinter=GetPrinterHandle(ppi2->pPrinterName);

BOOL bReturn=FALSE;
DWORD fMode;

if (hPrinter)
{
fMode=DM_IN_BUFFER|DM_OUT_BUFFER;
bReturn=(DocumentProperties(NULL, hPrinter,
ppi2->pPrinterName,
ppi2->pDevMode,
ppi2->pDevMode,
fMode)==IDOK&&
SetPrinter(hPrinter,2,(LPBYTE)ppi2,0));
ClosePrinter(hPrinter);
}
return bReturn;
}

////////////////////////////////////////////////////////////////////////////////////////
//用途:设定打印机的默认纸张
//参数:PrintName=打印机名称
// PaperName=纸张名称
// Orientation=纸张方向,1=横向,2=纵向
// Reserve=保留
//返回:成功返回TRUE,反之FALSE
BOOL CUntitled::SetDefaultPaper(LPCTSTR PrintName, LPCTSTR PaperName, long Orientation, LPCTSTR Reserve)
{
// TODO: Add your dispatch handler code here
strLastError="";

BOOL bReturn=FALSE;
PRINTER_INFO_2 *ppi2=GetPrintInfo((CHAR *)PrintName);

if(ppi2)
{
short nPaperSize=GetPaperSize((CHAR *)PrintName,ppi2->pPortName,(CHAR *)PaperName);
if(nPaperSize!=-1)
{
ppi2->pDevMode->dmFields=DM_PAPERSIZE|DM_PAPERWIDTH|DM_PAPERLENGTH|DM_ORIENTATION;
ppi2->pDevMode->dmPaperSize=nPaperSize;
ppi2->pDevMode->dmPaperWidth=0;
ppi2->pDevMode->dmPaperLength=0;
ppi2->pDevMode->dmOrientation=(short)Orientation;
bReturn=SetPrintInfo(ppi2);
if(bReturn==FALSE)
strLastError="设置纸张名称或方向失败";
}
else
strLastError="获得纸张类型索引号失败";

GlobalFree((HGLOBAL)ppi2);
}
else
strLastError="获得打印机信息失败,请检查打印机名称是否正确";

return bReturn;
}

春天的气息 2008-01-20
  • 打赏
  • 举报
回复
解决起来比较麻烦,要使用到打印机驱动注册信息和接口DLL,如果你是程序中有这样的情况,可以反过来思考解决问题,目前打印机和打印纸不就是那些类型,16K、B5、 A4、.......等之类的,除了专用票据,其它都是可以预见的,而且打印只要能打大的,小的都不成问题,用报表的设置行进处理较好。

110,580

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧