extern      BOOL         PrintPage(void)
{
    static      char         szSpMsg[] = "Printing";

    auto      ABORTPROC      lpfnAbortProc;
    auto      BOOL           bError = FALSE;
    auto      DWORD          dwExtent;
    auto      FARPROC        lpfnPrintDlgProc;
    auto      HDC            hdcPrn;
    auto      POINT          ptExtent;
    auto      RECT           rect;
    auto      LPMETAFILEPICT lpMFP, lpMF, lpMFPO;
    auto      PRNOBJ         *po;
    auto      short          xPage, yPage;
    auto      int            i = 0;

    if (NULL == (hdcPrn = GetPrinterDC()))
    return TRUE;

    xPage = GetDeviceCaps (hdcPrn, HORZRES);
    yPage = GetDeviceCaps (hdcPrn, VERTRES);

    EnableWindow (hAppWnd, FALSE);

    bUserAbort = FALSE;
    lpfnPrintDlgProc = MakeProcInstance (PrintDlgProc, hInst);
    hDlgPrint = CreateDialog (hInst, "PrintDlgBox", hAppWnd, lpfnPrintDlgProc);

    lpfnAbortProc = MakeProcInstance (AbortProc, hInst);
    Escape (hdcPrn, SETABORTPROC, 0, (LPSTR) lpfnAbortProc, NULL);

    if (Escape (hdcPrn, STARTDOC, sizeof szSpMsg - 1, szSpMsg, NULL) > 0 &&
        Escape (hdcPrn, NEXTBAND, 0, NULL, (LPSTR) &rect) > 0)
    {
        while (!IsRectEmpty (&rect) && !bUserAbort)
        {
            for (i=0; i<poIndex; i++)
            {
                (*lpfnAbortProc) (hdcPrn, 0);
                po = &poPage[i];

                switch (po->obj)
                {

                    .
                    .
                    .

                case OTBITMAP:      // Rasterbild drucken
                    {
                        static  BITMAP   bm;

                        auto    HDC      hdcMem;
                        auto    HANDLE   hOld;

                        GetObject(po->handle, sizeof(BITMAP), (LPSTR)&bm);

                        hdcMem = CreateCompatibleDC(0);
                        hOld = SelectObject(hdcMem, po->handle);

                        // Dieser Bitblit geht schief!
                        BitBlt(hdcPrn, po->x, po->y, bm.bmWidth, bm.bmHeight,
                        hdcMem, 0, 0, SRCCOPY);

                        SelectObject(hdcMem, hOld);
                        DeleteDC(hdcMem);
                    }
                    break;

                    .
                    .
                    .

                }
            }

            if (Escape (hdcPrn, NEXTBAND, 0, NULL, (LPSTR) &rect) < 0)
            {
                bError = TRUE;
                break;
            }
        }
    }
    else
    bError = TRUE;

    // Nicht vergessen: Hier alle Objekte auflsen!!!!

    if (!bError)
    {
        if (bUserAbort)
            Escape (hdcPrn, ABORTDOC, 0, NULL, NULL);
        else
            Escape (hdcPrn, ENDDOC, 0, NULL, NULL);
    }

    if (!bUserAbort)
    {
        EnableWindow (hAppWnd, TRUE);
        DestroyWindow (hDlgPrint);
    }

    FreeProcInstance (lpfnPrintDlgProc);
    FreeProcInstance (lpfnAbortProc);
    DeleteDC (hdcPrn);

    return bError || bUserAbort;
}

