社区
C#
帖子详情
如何获得当前电脑上所有打印机所有支持的纸张类型和大小..解决送分!
ufonasa
2008-01-20 04:33:42
RT
...全文
2968
6
打赏
收藏
如何获得当前电脑上所有打印机所有支持的纸张类型和大小..解决送分!
RT
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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、.......等之类的,除了专用票据,其它都是可以预见的,而且打印只要能打大的,小的都不成问题,用报表的设置行进处理较好。
PB
打印机
设置.rar
调用
当前
电脑
上所有已安装的
打印机
列表(包含共享
打印机
),设置默认
打印机
,设置打印
纸张
大小
、方向、页边距、默认
纸张
等及安装
打印机
16春学期《计算机应用基础》在线作业及答案.docx
在Word中,设定
纸张
打印
大小
时,应当使用的命令是______。 A. \文件\菜单中的\打印预览\命令 B. \文件\菜单中的\页面设置\命令。 C. \视图\菜单中的\工具栏\命令 D. \视图\菜单中的\页面\命令 满分:1 分 4. 用户名...
常见小票
打印机
打印故障及
解决
方法汇总视频教程
通过对“常见小票
打印机
故障及
解决
方法汇总视频教程”课程学习,达到以下目的:1、可以独立自主安装
打印机
驱动以及安装
打印机
硬件设备 2、可以独立自主排除常见
打印机
故障
易人信封打印软件 v4.5.rar
易人信封打印软件是一款专门用于信封打印的软件,可以
支持
用户大批量地一次性导入数据,进行批量打印,大幅度提高信封填写速度(
支持
所有
打印机
)(点击下载信封打印使用说明书)。 关于位置校准: 1. 校准
打印机
: ...
北交《计算机应用基础》在线作业二-0004.docx
用鼠标右键单击我的
电脑
图标 答案:B 成本低、应用广但覆盖范围有限的是( ) A:WAN B:MAN C:LAN D:Internet 答案:C 在PowerPoint中,为所有幻灯片设置统一的、特有的外观风格,应运用( ) 北交《计算机应用基础》...
C#
110,580
社区成员
642,559
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章