Components for Developers © 2000-2008, Two Pilots

Virtual Printer Download Demo Pricing FAQ How to... Tutorials Examples Testimonials

 

Virtual Printer Drivers Custom Development Service

 

"How to" articles

 

// How to change current paper form

int _iPaperCount = 0;
WORD* _pPapers = NULL;
char* _pPaperNames = NULL;
POINT* _pPaperSizes = NULL;


// Function that enumerates all available paper forms:

void FillPapers()
{
        HANDLE hPrinter = NULL;

        if (_pPapers)
        {
                delete [] _pPapers;
                _pPapers = NULL;
        }

        if (_pPaperNames)
        {
                delete [] _pPaperNames;
                _pPaperNames = NULL;
        }

        if (_pPaperSizes)
        {
                delete [] _pPaperSizes;
                _pPaperSizes = NULL;
        }

        if (OpenPrinter(PRINTER_NAME, &hPrinter, NULL))
        {
                DWORD dwNeeded = 0;
                
                // get printer forms

                _iPaperCount = DeviceCapabilities(PRINTER_NAME, NULL, DC_PAPERS, NULL, NULL);
                if (_iPaperCount)
                {
                        _pPapers = new WORD[_iPaperCount];
                        ZeroMemory(_pPapers, sizeof(WORD)*_iPaperCount);
                        DeviceCapabilities(PRINTER_NAME, NULL, DC_PAPERS, (LPSTR) _pPapers, NULL);

                        _pPaperNames = new char[_iPaperCount*64];
                        ZeroMemory(_pPaperNames, sizeof(char)*64*_iPaperCount);
                        DeviceCapabilities(PRINTER_NAME, NULL, DC_PAPERNAMES, _pPaperNames, NULL);

                        _pPaperSizes = new POINT[_iPaperCount];
                        ZeroMemory(_pPaperSizes, sizeof(POINT)*_iPaperCount);
                        DeviceCapabilities(PRINTER_NAME, NULL, DC_PAPERSIZE, (LPSTR) _pPaperSizes, NULL);
                }

                ClosePrinter(hPrinter);
        }
        else
        {
            // report error
        }
}


// Function that sets current paper form:

BOOL SetPrinterPaper(short dmPaperSize, const char* pszFormName)
{
        BOOL bResult = FALSE;
        HANDLE hPrinter = NULL;

        if (OpenPrinter(PRINTER_NAME, &hPrinter, NULL))
        {
                DWORD dwNeeded = 0;
                GetPrinter(hPrinter, 2, NULL, 0, &dwNeeded);
                
                if (dwNeeded > 0)
                {
                        BYTE* pPrinterInfo = new BYTE[dwNeeded];
                        
                        if (GetPrinter(hPrinter, 2, pPrinterInfo, dwNeeded, &dwNeeded))
                        {
                                DEVMODE* pDevMode = ((PRINTER_INFO_2*) pPrinterInfo)->pDevMode;
                                pDevMode->dmPaperSize = dmPaperSize;
                                lstrcpy((char*) &pDevMode->dmFormName, pszFormName);
                                SetPrinter(hPrinter, 2, pPrinterInfo, 0);
                                bResult = TRUE;

                        }
                        else
                        {
                            // report error
                        }

                        delete [] pPrinterInfo;
                }

                ClosePrinter(hPrinter);
        }
        else
        {
            // report error
        }

        return bResult;
}

 

// How to add new paper form of custom size

if (OpenPrinter(PRINTER_NAME, &hPrinter, NULL))
{
        FORM_INFO_1 FormInfo = {0};
        FormInfo.pName = (char*) &_szNewFormName;
        FormInfo.Size.cx = FormInfo.ImageableArea.right = _iNewFormWidth*1000;
        FormInfo.Size.cy = FormInfo.ImageableArea.bottom = _iNewFormLength*1000;

        if (AddForm(hPrinter, 1, (BYTE*) &FormInfo))
        {
                FillPapers();

                // set new paper to the printer
                
                for (int i=0; i<_iPaperCount; i++)
                {
                        if (lstrcmp(_szNewFormName, &_pPaperNames[i*64]) == 0)
                        {
                                SetPrinterPaper(_pPapers[i], _szNewFormName);
                                FillPapers();
                                break;
                        }
                }
        }
        else
        {
            // report error
        }

        ClosePrinter(hPrinter);
}

 

// How to change paper orientation and print quality (resolution)

 

HANDLE hPrinter = NULL;
PRINTER_DEFAULTS prnDef = { NULL, NULL, PRINTER_ALL_ACCESS };

if (OpenPrinter(PRINTER_NAME, &hPrinter, &prnDef))
{
    DWORD dwNeeded = 0;

    GetPrinter(hPrinter, 2, NULL, 0, &dwNeeded);
    if (dwNeeded > 0)
    {
        BYTE* pPrinterInfo = new BYTE[dwNeeded];

        // get current printer settings
        if (GetPrinter(hPrinter, 2, pPrinterInfo, dwNeeded, &dwNeeded))
        {
            DEVMODE* pDevMode = ((PRINTER_INFO_2*) pPrinterInfo)->pDevMode;
            pDevMode->dmFields = pDevMode->dmFields|DM_ORIENTATION|DM_PRINTQUALITY|DM_YRESOLUTION;

            // change parameters
            pDevMode->dmOrientation = 1;    // Orientation: 1 - portrait; 2 - landscape.
            pDevMode->dmPrintQuality = 300; // Horizontal resolution value
            pDevMode->dmYResoultion = 300; // Vertical resoultion value

            // save changed settings
            if (!SetPrinter(hPrinter, 2, pPrinterInfo, 0))
            {
                // report error
            }
        }
        else
        {
            // report error
        }

        delete [] pPrinterInfo;
    }
   
    ClosePrinter(hPrinter);
}
else
{
    // report error
}
Virtual Printer Download Demo Pricing FAQ How to... Tutorials Examples Testimonials

 

 

PDF Library | Virtual Printer | Converters to PDF

Support | Blog | Forum | Contacts | Site map

© 2000-2008, Two Pilots