RT

解决方案 »

  1.   

    ////////////////////////////////////////////////////////////////////////////////////////
    //用途:增加自定义纸张
    //参数: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;
    }
      

  2.   

    ////////////////////////////////////////////////////////////////////////////////////////
    //用途:增加自定义纸张
    //参数: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;
    }
      

  3.   

    ////////////////////////////////////////////////////////////////////////////////////////
    //用途:由纸张编号得到对应的纸张名称
    //参数: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;
    }
      

  4.   

    ////////////////////////////////////////////////////////////////////////////////////////
    //用途:枚举某打印机的可用纸张
    //参数: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;
    }