回 帖 发 新 帖 刷新版面

主题:PageSetupdlg打印机无法初始化问题

在使用PageSetupdlg时有如下代码:
BOOL GetPageInfo(HWND hwnd, DEVMODE *lpDevMode, DEVNAMES *lpDevNames, LPRECT lprtMargin)
{
    PAGESETUPDLG psd;

    SecureZeroMemory(&psd,sizeof(PAGESETUPDLG));
    psd.lStructSize = sizeof(psd);
    psd.hwndOwner = hwnd;
    psd.Flags = PSD_INHUNDREDTHSOFMILLIMETERS|PSD_RETURNDEFAULT;
    if(PageSetupDlg(&psd))
    {
        CopyMemory(lpDevMode,GlobalLock(psd.hDevMode),sizeof(DEVMODE));
        GlobalUnlock(psd.hDevMode);
        GlobalFree(psd.hDevMode); 
        CopyMemory(lpDevNames,GlobalLock(psd.hDevNames),sizeof(DEVNAMES));
        GlobalUnlock(psd.hDevNames);
        GlobalFree(psd.hDevNames);
        if(lprtMargin) *lprtMargin = psd.rtMargin;
        return TRUE;
    }
    return FALSE;
}


BOOL SetPageInfo(HWND hwnd, DEVMODE *lpDevMode, DEVNAMES *lpDevNames, LPRECT lprtMargin)
{
    PAGESETUPDLG psd;

    SecureZeroMemory(&psd,sizeof(PAGESETUPDLG));
    psd.lStructSize = sizeof(PAGESETUPDLG);
    psd.hwndOwner = hwnd;
    psd.Flags = PSD_INHUNDREDTHSOFMILLIMETERS;    
    if(lpDevMode)
    {
        psd.hDevMode = GlobalAlloc(GMEM_MOVEABLE,sizeof(DEVMODE));
        if(!psd.hDevMode) return FALSE;
        CopyMemory(GlobalLock(psd.hDevMode),lpDevMode,sizeof(DEVMODE));
        GlobalUnlock(psd.hDevMode);
    }
    if(lpDevNames)
    {
        psd.hDevNames = GlobalAlloc(GMEM_MOVEABLE,sizeof(DEVNAMES));
        if(!psd.hDevNames)
        {
            GlobalFree(psd.hDevMode); 
            return FALSE;
        }
        CopyMemory(GlobalLock(psd.hDevNames),lpDevNames,sizeof(DEVNAMES));
        GlobalUnlock(psd.hDevNames);
    }
    if(lprtMargin)
    {
        psd.Flags |= PSD_MARGINS;
        psd.rtMargin = *lprtMargin;
    }
    if(PageSetupDlg(&psd))
    {
        if(psd.hDevMode)
        {
            if(lpDevMode)
            {
                CopyMemory(lpDevMode,GlobalLock(psd.hDevMode),sizeof(DEVMODE));
                GlobalUnlock(psd.hDevMode);
            }
            GlobalFree(psd.hDevMode); 
        }
        if(psd.hDevNames)
        {
            if(lpDevNames)
            {
                CopyMemory(lpDevNames,GlobalLock(psd.hDevNames),sizeof(DEVNAMES));
                GlobalUnlock(psd.hDevNames);
            }
            GlobalFree(psd.hDevNames); 
        }
        if(lprtMargin) *lprtMargin = psd.rtMargin;
        return TRUE;
    }
    return FALSE;
}

使用SetPageInfo获得打印纸的信息后再次调用SetPageInfo后,页面对话框中纸张大小方向和页边距都是对的,就是来源和点击“打印机”后显示的打印机不是参数中设置的打印机,不知道什么原因?记事本中的页面设置却可以,不知道怎么回事?

回复列表 (共2个回复)

沙发

怎么没有人知道吗?
怎么都不用这个对话框吗?
自己顶了。。。

板凳

自己搞定:
psd.hDevNames使用错,应该像下面这样使用(引用):

BOOL   CMyApp::SetPrinterDevice(char*   pszDeviceName)   
        {   
        //   Open   printer   and   obtain   PRINTER_INFO_2   structure.   
        HANDLE   hPrinter;   
        if   (OpenPrinter(pszDeviceName,   &hPrinter,   NULL)   ==   FALSE)   
                return   FALSE;   
        DWORD   dwBytesReturned,   dwBytesNeeded;   
        GetPrinter(hPrinter,   2,   NULL,   0,   &dwBytesNeeded);   
        PRINTER_INFO_2*   p2   =   (PRINTER_INFO_2*)GlobalAlloc(GPTR,   
                dwBytesNeeded);   
        if   (GetPrinter(hPrinter,   2,   (LPBYTE)p2,   dwBytesNeeded,   
                &dwBytesReturned)   ==   0)   {   
        GlobalFree(p2);   
        ClosePrinter(hPrinter);   
        return   FALSE;   
        }   
        ClosePrinter(hPrinter);   
    
        //   Allocate   a   global   handle   for   DEVMODE   and   copy   DEVMODE   data.   
        HGLOBAL     hDevMode   =   GlobalAlloc(GHND,   sizeof(*p2->pDevMode));   
        DEVMODE*   pDevMode   =   (DEVMODE*)GlobalLock(hDevMode);   
        memcpy(pDevMode,   p2->pDevMode,   sizeof(*p2->pDevMode));   
        GlobalUnlock(hDevMode);   
    
        //   Compute   size   of   DEVNAMES   structure   you'll   need.   
        DWORD   drvNameLen   =   strlen(p2->pDriverName);     //   driver   name   
        DWORD   ptrNameLen   =   strlen(p2->pPrinterName);   //   printer   name   
        DWORD   porNameLen   =   strlen(p2->pPortName);         //   port   name   
        DWORD   devNameSize   =   sizeof(DEVNAMES)   +   
                ptrNameLen   +   porNameLen   +   drvNameLen   +   3;   
    
        //   Allocate   a   global   handle   big   enough   to   hold   DEVNAMES.   
        HGLOBAL       hDevNames   =   GlobalAlloc(GHND,   devNameSize);   
        DEVNAMES*   pDevNames   =   (DEVNAMES*)GlobalLock(hDevNames);   
    
        //   Copy   the   DEVNAMES   information   from   PRINTER_INFO_2   structure.   
        pDevNames->wDriverOffset   =   sizeof(DEVNAMES);   
        memcpy((char*)pDevNames   +   pDevNames->wDriverOffset,   
                p2->pDriverName,   drvNameLen);   
    
        pDevNames->wDeviceOffset   =   sizeof(DEVNAMES)   +   
        drvNameLen   +   1;   
        memcpy((char*)pDevNames   +   pDevNames->wDeviceOffset,   
                p2->pPrinterName,   ptrNameLen);   
    
        pDevNames->wOutputOffset   =   sizeof(DEVNAMES)   +   
                drvNameLen   +   ptrNameLen   +   2;   
        memcpy((char*)pDevNames   +   pDevNames->wOutputOffset,   
                p2->pPortName,   porNameLen);   
    
        pDevNames->wDefault   =   0;   
    
        GlobalUnlock(hDevNames);   
        GlobalFree(p2);       //   free   PRINTER_INFO_2   
    
        m_hDevMode   =   hDevMode;   
        m_hDevNames   =   hDevNames;   
        return   TRUE;   
        }   


设置页面时,将hDevNames设置NULL就行了。

我来回复

您尚未登录,请登录后再回复。点此登录或注册