Associating Presentation Spaces with Device Contexts

Drawing graphic objects requires a presentation space and a device context to direct output to a specific instance of an output device, such as a display window or a printer. This association enables the device context to identify the output device for that presentation space. Further, the device context identifies the particular instance of the output device, such as a printer or display window.

A presentation space can be associated with only one device context at a time. The reverse is also true: a device context can be associated with only one presentation space at a time.

The following figure shows how a presentation space is associated with a window device context. It is then disassociated from the window device context and associated with a printer device context. It cannot be associated with both device contexts simultaneously.

    WM_Create:
         hdcScreen = WinOpenWindowsDC (hwnd);
         phs = GpiCreatePS (...GPIA.Assoc);
          .
          .
          .

    WM_COMMAND:

      Case IDM_File PRINT:                       /* Device selection        */
         hdcPrinter = DevOpenDC (...);
         GpiAssociate (hps, NULL);               /* Disconnect from screen  */
         GpiAssociate (hps, hdcPrinter);         /* Connect to printer      */
          .
          .                                      /* Output                  */
          .
         GpiAssociate (hps, NULL);               /* Disconnect from print   */
         GpiAssociate (hps, hdcScreen);          /* Reconnect to screen     */
          .
          .
          .

    WM_PAINT:
         WinBeginPaint (hwnd, hps, NULL);
          .
          .                                      /* Output                  */
          .

The following figure shows how to open a window device context and associate it with a normal presentation space.

    HDC hdcWin;            /* Window device-context handle     */
    HPS hpsWin;            /* Normal-presentation-space handle */
    HWND hwndClient;       /* Client-window handle             */
    HAB hab;               /* Anchor-block handle              */
    SIZEL sizlPage;        /* Presentation page                */

    hdcWin = WinOpenWindowDC(hwndClient);
    hpsWin = GpiCreatePS(hab, hdcWin, &sizlPage,
                         PU_LOENGLISH | GPIA_ASSOC);

Note: This type of code is used when the device context is defined before the presentation space.

WinOpenWindowDC can be called only once for a particular window and returns an error if called a second time. WinQueryWindowDC can be used to obtain a window device context previously allocated using WinOpenWindowDC. The following figure shows how to create a presentation space with page units of 0.01 inch (PU_LOENGLISH) and associate it with a printer device context. As input to GpiCreatePS, you supply the height and width of the presentation page.

    HAB hab;          /* Anchor-block handle         */
    HPS hpsPrinter;   /* Presentation-space handle   */
    HDC hdcPrinter;   /* Device-context handle       */
    SIZEL sizlPage;   /* Page structure              */
    .
    .
    .
    hpsPrinter = GpiCreatePS(hab, hdcPrinter, &sizlPage,
       PU_LOENGLISH | GPIA_ASSOC);


[Back: Creating a Device Context]
[Next: Closing a Device Context]