如何获得当前电脑上所有打印机所有支持的纸张类型和大小..解决送分! RT 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 //////////////////////////////////////////////////////////////////////////////////////////用途:增加自定义纸张//参数: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,反之FALSEBOOLEAN 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,反之FALSEBOOL 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;} //////////////////////////////////////////////////////////////////////////////////////////用途:增加自定义纸张//参数: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,反之FALSEBOOLEAN 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,反之FALSEBOOL 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;} //////////////////////////////////////////////////////////////////////////////////////////用途:由纸张编号得到对应的纸张名称//参数: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,反之FALSEBOOL 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放置默认纸张名称;反之FALSEBOOL 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放置默认打印机名称;反之FALSEBOOL 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;} //////////////////////////////////////////////////////////////////////////////////////////用途:枚举某打印机的可用纸张//参数:PrintName=打印机名称// Reserve=保留//返回:成功返回TRUE,属性PaperName放置可用纸张的名称,这时应该继续用这个方法并将第1个// 置""继续枚举直到返回FALSEBOOL 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继续枚举直到返回FALSEBOOL 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;} 谢谢ttotcs3大哥帮我解决彩信下行的问题。 日期 转换成 字符串,怎么样去掉 时间? 简单文字显示问题。解决立即接贴。 屏幕动态点的捕捉函数问题,大虾帮忙啊 帮帮我呀~~~,为什么我的DataList显示不了 ACCESS数据转到SQL中 正则表达式问题 加密后的dll文件影响到程序的运行速度该怎么办? C#中想在状态栏上显示打开的文件名,可怎么都不显示 新手想实现一个小功能,求 为什么么这个给原始图加水印的方法会把原图压缩很多?!! tabpage (标签)之间的距离能否调整 解决送分!!
//用途:增加自定义纸张
//参数: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;
}
//用途:增加自定义纸张
//参数: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;
}
//用途:由纸张编号得到对应的纸张名称
//参数: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;
}
//用途:枚举某打印机的可用纸张
//参数: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;
}