Steps to Send a Document to a Printer

Last reviewed: January 5, 1995
Article ID: Q75339
The information in this article applies to:
  • Microsoft Windows Software Development Kit (SDK) for Windows versions 3.0 and 3.1

SUMMARY

If code simplicity is more desirable than printing efficiency, an application can implement printing with almost no additional code. For this discussion, the application defines a DrawStuff procedure that renders text and/or graphics into a specified display context. The application can render the image to the screen by getting a screen display context and passing its handle to DrawStuff(). Printing is more involved; the seven steps required are detailed below.

  1. Use GetProfileString() to get the printer driver name and port to print to from the WIN.INI file. Specify "windows" as the application and "device" as the key name.

  2. Call the CreateDC() to get a display context for the printer.

The following code demonstrates these two steps:

     //
     // HDC GetPrinterDC(void)
     //
     // Return a DC to the currently selected printer.
     // Returns NULL on error.
     //

     HDC GetPrinterDC(void)
     {
        static char szPrinter[64];
               char *szDevice, *szDriver, *szOutput;

        GetProfileString("windows", "device", "", szPrinter, 64);

        if ((szDevice = strtok(szPrinter, "," ))
              && (szDriver = strtok(NULL, ", "))
              && (szOutput = strtok(NULL, ", ")))
           return CreateDC(szDriver, szDevice, szOutput, NULL);

        return NULL;
     }

  • Use the STARTDOC Escape to start a print job. [In Windows 3.1 and later, call the StartDoc() function rather than the STARTDOC escape.]

         szJobName = "<job name>";
         Escape(hDC, STARTDOC, lstrlen(szJobName), szJobName, NULL);
    

    [3.5. In Windows 3.1 and later, call StartPage() to begin a page.]

  • Draw the page by calling DrawStuff(hDC).

  • Use the NEWFRAME Escape to start the next page. [In Windows 3.1 and later, call the EndPage() function rather than the NEWFRAME escape.]

         Escape(hDC, NEWFRAME, 0, 0L, 0L);
    

    (If more than one page is printed, repeat steps 4 and 5 for each page.)

  • Use the ENDDOC Escape to end the print job. [In Windows 3.1 and later, call the EndDoc() function rather than the ENDDOC escape.]

         Escape(hDC, ENDDOC, 0, 0L, 0L);
    

  • Call DeleteDC() to free the printer display context.

         DeleteDC(hDC);
    

    Printing requires little extra work if the drawing code is modular. The drawback to the approach above is that it can require more memory and printing time than may otherwise be necessary. For more information on speeding the printing process, query on the following words in the Microsoft Knowledge Base:

       prod(winsdk) and printing and banding
    

  • Additional reference words: 3.00 3.10
    KBCategory: kbprg
    KBSubcategory: GdiPrn


    THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

    Last reviewed: January 5, 1995
    © 1998 Microsoft Corporation. All rights reserved. Terms of Use.