Creating a Printer Device Context

An application can create a printer DC in several different ways:

  • By calling the PrintDlg function to display a common dialog box that allows the user to specify printer options, then creating a printer DC by using those options.

  • By creating a printer DC by using the default printer data from the GetDefaultPrinter and GetPrinter functions.

  • By creating a printer DC by using the default printer data from the Win.ini file.

    Note  This way is no longer recommended.

This section contains code demonstrating the second method.

    TCHAR    szDriver[16] = _T("WINSPOOL");
    TCHAR   szPrinter[256];
    DWORD   cchBuffer = 255;
    HDC     hdcPrint = NULL;
    HANDLE  hPrinter = NULL;
    PRINTER_INFO_2  *pPrinterData;
    BYTE    pdBuffer[16384];
    BOOL    bReturn = FALSE;

    DWORD   cbBuf = sizeof (pdBuffer);
    DWORD   cbNeeded = 0;
    pPrinterData = (PRINTER_INFO_2 *)&pdBuffer[0];

    // get the default printer name
    bReturn = GetDefaultPrinter(
        szPrinter,
        &cchBuffer);

    if (bReturn) {
        // open the default printer
        bReturn = OpenPrinter(
            szPrinter,
            &hPrinter,
            NULL);
    }

    if (bReturn) {
        // get the printer port name
        bReturn =  GetPrinter(
            hPrinter,
            2,
            &pdBuffer[0],
            cbBuf,
            &cbNeeded);

           // this handle is no longer needed
        ClosePrinter(hPrinter);
    }

    if (bReturn) {
       // create the Print DC
       hdcPrint = CreateDC(szDriver, szPrinter, 
            pPrinterData->pPortName, NULL); 
    }

    if (hdcPrint) {
        // Print a test page that contains the string  
        // "PRINTER TEST" in the upper left corner.  
     
        Escape(hdcPrint, STARTDOC, 8, "Test-Doc", NULL); 
        TextOut(hdcPrint, 50, 50, _T("PRINTER TEST"), 12); 
        Escape(hdcPrint, NEWFRAME, 0, NULL, NULL); 
        Escape(hdcPrint, ENDDOC, 0, NULL, NULL); 
     
        // Delete the printer DC.  
        DeleteDC(hdcPrint); 
    }

This section contains code demonstrating the last method.

To use the default printer, retrieve and parse the appropriate string from the Win.ini file. This string is retrieved by calling the GetProfileString function and specifying the appropriate section and entry names. In the case of the default printer, this data is stored in the [windows] section and identified by the entry named device. The seventh line in the following excerpt from a Win.ini file shows an entry for a Kodak Diconix printer.

[windows] 
    load= 
    run= 
    Beep=yes 
    Spooler=yes 
    NullPort=None 
    device=Diconix,winspool,LPT1: 
    CoolSwitch=1 
    BorderWidth=3 
    KeyboardSpeed=31 
    InitialKeyboardIndicators=2 
    CursorBlinkRate=530 
    DoubleClickSpeed=686 
    Programs=com exe bat pif cmd 
    Documents= 
    DeviceNotSelectedTimeout=15 
    TransmissionRetryTimeout=45 
    swapdisk= 
    NetWarn=1 
    fPromptOnVerbose=FALSE 
    fPromptOnWarning=FALSE 
    fPromptOnError=TRUE 
    fPrintVerbose=FALSE 
    fPrintFileLine=FALSE 
    shell= 
    ScreenSaveTimeOut=300 
    ScreenSaveActive=0 
    DebugOptions=2048 

The following example shows how a printer DC was created by using the data from Win.ini.

    HDC hdcPrint;                // printer DC handle  
    TCHAR szDevString[120];      // array for WIN.INI data  
    TCHAR *szPrinter, *szDriver; // printer and driver names  
    TCHAR *szPort;               // port name  
    TCHAR *nextChar;

    // Retrieve the printer, printer driver, and  
    // output-port names from WIN.INI.  
 
    GetProfileString(_T("windows"), _T("device"), _T(",,,"), 
        szDevString, 120); 
 
    // Parse the string of names, setting ptrs as required  
    // If the string contains the required names, use them to  
    // create a device context.  
 
    if ((szPrinter = _tcstok_s(szDevString, 
               _T(","), &nextChar)) 
            && (szDriver = _tcstok_s (NULL, 
               _T(", "), &nextChar)) 
            && (szPort = _tcstok_s (NULL, 
               _T(", "), &nextChar)))
    {
        hdcPrint = CreateDC(szDriver, szPrinter, 
            szPort, NULL); 
    }

    // Print a test page that contains the string  
    // "PRINTER TEST" in the upper left corner.  
 
    Escape(hdcPrint, STARTDOC, 8, "Test-Doc", NULL); 
    TextOut(hdcPrint, 50, 50, _T("PRINTER TEST"), 12); 
    Escape(hdcPrint, NEWFRAME, 0, NULL, NULL); 
    Escape(hdcPrint, ENDDOC, 0, NULL, NULL); 
 
    // Delete the printer DC.  
    DeleteDC(hdcPrint); 

 

 

Send comments about this topic to Microsoft

Build date: 9/7/2011