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;
}

