PAINT_PR.C
上传用户:cncajx
上传日期:2007-01-03
资源大小:190k
文件大小:4k
源码类别:

GDI/图象编程

开发平台:

Visual C++

  1.   1 #include "paint.h"
  2.   2 #include <windows.h>
  3.   3 
  4.   4 BOOL FAR PASCAL AbortProc(HWND, short);
  5.   5 BOOL FAR PASCAL PrnDlgProc(HWND, WORD, WORD, LONG);
  6.   6 
  7.   7 BOOL    bCancel;
  8.   8 HWND    hPrnDlg;
  9.   9 
  10.  10 extern HDC    hMemDC;
  11.  11 extern HANDLE hInst;
  12.  12 
  13.  13 
  14.  14 HDC CreateDC_Printer()
  15.  15 {
  16.  16    HDC  hPrnDC;
  17.  17    char szProfile[70];
  18.  18    char *szDriver, *szDevice, *szOutput;
  19.  19 
  20.  20    GetProfileString("windows", "device", "", szProfile, 70);
  21.  21 
  22.  22    szDevice = (char *) strtok(szProfile, ",");
  23.  23    szDriver = (char *) strtok(NULL,     ",");
  24.  24    szOutput = (char *) strtok(NULL,     ",");
  25.  25 
  26.  26    if (szDevice && szDriver && szOutput)
  27.  27     {
  28.  28       hPrnDC = CreateDC(szDriver, szDevice, szOutput, NULL);
  29.  29       return (hPrnDC);
  30.  30     }
  31.  31 
  32.  32    return (NULL);
  33.  33 }
  34.  34 
  35.  35 
  36.  36 
  37.  37 void PrintGraph(HWND hWnd, int MemX, int MemY)
  38.  38 {
  39.  39    HDC      hPrnDC;
  40.  40    BOOL     bPrinted = TRUE;
  41.  41    FARPROC  lpAbortProc;
  42.  42    FARPROC  lpPrnDlgProc;
  43.  43    char     szName[] = "Paint - Printing";
  44.  44 
  45.  45    hPrnDC = CreateDC_Printer();
  46.  46    if (hPrnDC == NULL)
  47.  47      {
  48.  48        MessageBox(hWnd, "Printer Error", NULL,
  49.  49                   MB_OK | MB_ICONHAND);
  50.  50        return ;
  51.  51      }
  52.  52 
  53.  53    lpPrnDlgProc = MakeProcInstance(PrnDlgProc, hInst);
  54.  54    lpAbortProc  = MakeProcInstance(AbortProc, hInst);
  55.  55 
  56.  56    bCancel = FALSE;
  57.  57    hPrnDlg = CreateDialog(hInst, "PRNDLG", hWnd,
  58.  58                           lpPrnDlgProc);
  59.  59    Escape(hPrnDC, SETABORTPROC, 0, (LPSTR) lpAbortProc,
  60.  60           NULL);
  61.  61 
  62.  62    if (Escape(hPrnDC, STARTDOC,
  63.  63               strlen(szName), szName, NULL) > 0)
  64.  64      {
  65.  65        BitBlt(hPrnDC, 0, 0, MemX, MemY,
  66.  66               hMemDC, 0, 0, SRCCOPY);
  67.  67 
  68.  68        if (Escape(hPrnDC, NEWFRAME, 0, NULL, NULL) > 0)
  69.  69          Escape(hPrnDC, ENDDOC, 0, NULL, NULL);
  70.  70        else
  71.  71          bPrinted = FALSE;
  72.  72      }
  73.  73    else
  74.  74      bPrinted = FALSE;
  75.  75 
  76.  76    if (! bPrinted)
  77.  77      MessageBox(hWnd, "Print Error", NULL,
  78.  78                 MB_OK | MB_ICONHAND);
  79.  79 
  80.  80    if (! bCancel)
  81.  81      {
  82.  82        EnableWindow(hWnd, TRUE);
  83.  83        DestroyWindow(hPrnDlg);
  84.  84      }
  85.  85 
  86.  86    DeleteDC(hPrnDC);
  87.  87    FreeProcInstance(lpPrnDlgProc);
  88.  88    FreeProcInstance(lpAbortProc);
  89.  89 }
  90.  90 
  91.  91 
  92.  92 BOOL FAR PASCAL AbortProc(HDC hPrnDC, short nCode)
  93.  93 {
  94.  94    MSG  msg;
  95.  95 
  96.  96    while (!bCancel &&
  97.  97           PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
  98.  98     {
  99.  99       if (! IsDialogMessage(hPrnDlg, &msg))
  100. 100         {
  101. 101            TranslateMessage(&msg);
  102. 102            DispatchMessage(&msg);
  103. 103         }
  104. 104     }
  105. 105 
  106. 106    return (! bCancel);
  107. 107 }
  108. 108 
  109. 109 
  110. 110 BOOL FAR PASCAL PrnDlgProc(HWND hDlg, WORD msg,
  111. 111                            WORD wParam, LONG lParam)
  112. 112 {
  113. 113    HWND  hPWnd;
  114. 114    HMENU hSysMenu;
  115. 115 
  116. 116    switch (msg)
  117. 117     {
  118. 118       case WM_INITDIALOG :
  119. 119                 hPWnd = GetParent(hDlg);
  120. 120                 EnableWindow(hPWnd, FALSE);
  121. 121 
  122. 122                 hSysMenu = GetSystemMenu(hDlg, 0);
  123. 123                 EnableMenuItem(hSysMenu, SC_CLOSE,
  124. 124                                MF_GRAYED);
  125. 125                 return (TRUE);
  126. 126 
  127. 127       case WM_COMMAND :
  128. 128                 switch (wParam)
  129. 129                  {
  130. 130                    case DI_CANCEL :
  131. 131                           bCancel = TRUE;
  132. 132                           hPWnd = GetParent(hDlg);
  133. 133                           EnableWindow(hPWnd, TRUE);
  134. 134                           DestroyWindow(hDlg);
  135. 135                           break;
  136. 136                  }
  137. 137                 return (TRUE);
  138. 138     }
  139. 139 
  140. 140    return (FALSE);
  141. 141 }