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

GDI/图象编程

开发平台:

Visual C++

  1.   1 /****************************************************************/
  2.   2 /*         Demo8_2   ---  Abort Procedure                       */
  3.   3 /****************************************************************/
  4.   4 
  5.   5 #include <windows.h>
  6.   6 #include "demo8_2.h"
  7.   7 
  8.   8 
  9.   9 int  PASCAL  WinMain(HANDLE, HANDLE, LPSTR, int);
  10.  10 long FAR PASCAL MainWndProc(HWND, unsigned, WORD, LONG);
  11.  11 
  12.  12 BOOL FAR PASCAL AbortProc(HWND, short);
  13.  13 BOOL FAR PASCAL PrnDlgProc(HWND, WORD, WORD, LONG);
  14.  14 
  15.  15 void DrawGraph(HDC, BOOL);
  16.  16 void DrawPencil(HDC);
  17.  17 void DrawLine(HDC, BOOL);
  18.  18 
  19.  19 void PrintGraph(HWND);
  20.  20 
  21.  21 
  22.  22 FARPROC lpAbortProc;
  23.  23 FARPROC lpPrnDlgProc;
  24.  24 
  25.  25 int   ToolID = IDM_PENCIL;
  26.  26 POINT OrgPoint;
  27.  27 POINT PrePoint;
  28.  28 POINT CurPoint;
  29.  29 
  30.  30 int CX, CY;
  31.  31 
  32.  32 HANDLE hInst;
  33.  33 BOOL   bCancel;
  34.  34 HWND   hPrnDlg;
  35.  35 
  36.  36 
  37.  37 /****************************************************************/
  38.  38 /*                      WinMain()                               */
  39.  39 /****************************************************************/
  40.  40 
  41.  41 int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance,
  42.  42                    LPSTR lpszCmdLine, int nCmdShow)
  43.  43 {
  44.  44    WNDCLASS wclass;
  45.  45    MSG      msg;
  46.  46    HWND     hWnd;
  47.  47    char     szName[] = "Demo8_2";
  48.  48 
  49.  49    if (!hPrevInstance)
  50.  50     {
  51.  51         wclass.style         = CS_HREDRAW | CS_VREDRAW;
  52.  52         wclass.lpfnWndProc   = MainWndProc;
  53.  53         wclass.cbClsExtra    = 0;
  54.  54         wclass.cbWndExtra    = 0;
  55.  55         wclass.hInstance     = hInstance;
  56.  56         wclass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
  57.  57         wclass.hCursor       = LoadCursor(NULL, IDC_ARROW);
  58.  58         wclass.hbrBackground = GetStockObject(WHITE_BRUSH);
  59.  59         wclass.lpszMenuName  = szName;
  60.  60         wclass.lpszClassName = szName;
  61.  61 
  62.  62         if (!RegisterClass (&wclass))
  63.  63            return (FALSE);
  64.  64     }
  65.  65 
  66.  66     hWnd = CreateWindow(
  67.  67                 szName,
  68.  68                 "Abort Procedure" ,
  69.  69                 WS_OVERLAPPEDWINDOW,
  70.  70                 CW_USEDEFAULT,
  71.  71                 CW_USEDEFAULT,
  72.  72                 CW_USEDEFAULT,
  73.  73                 CW_USEDEFAULT,
  74.  74                 NULL,
  75.  75                 NULL,
  76.  76                 hInstance,
  77.  77                 NULL );
  78.  78 
  79.  79     if (!hWnd)
  80.  80         return (FALSE);
  81.  81 
  82.  82     ShowWindow(hWnd, nCmdShow);
  83.  83     UpdateWindow(hWnd);
  84.  84 
  85.  85     while (GetMessage(&msg, NULL, NULL,NULL))
  86.  86        {
  87.  87            TranslateMessage(&msg);
  88.  88            DispatchMessage(&msg);
  89.  89        }
  90.  90     return (msg.wParam);
  91.  91 }
  92.  92 
  93.  93 
  94.  94 
  95.  95 /****************************************************************/
  96.  96 /*                      MainWndProc()                           */
  97.  97 /****************************************************************/
  98.  98 
  99.  99 long FAR PASCAL MainWndProc(HWND hWnd, unsigned message,
  100. 100                             WORD wParam, LONG lParam)
  101. 101 {
  102. 102    HDC           hDC;
  103. 103    HMENU         hMenu;
  104. 104    static BOOL   bLBDown;
  105. 105 
  106. 106    switch (message)
  107. 107     {
  108. 108       case WM_CREATE :
  109. 109                 hMenu = GetMenu(hWnd);
  110. 110                 CheckMenuItem(hMenu, IDM_PENCIL,
  111. 111                               MF_CHECKED);
  112. 112 
  113. 113                 hInst =
  114. 114                    ((LPCREATESTRUCT) lParam)->hInstance;
  115. 115                 return (0);
  116. 116 
  117. 117       case WM_COMMAND :
  118. 118                 hMenu = GetMenu(hWnd);
  119. 119                 switch (wParam)
  120. 120                   {
  121. 121                     case IDM_PENCIL :
  122. 122                     case IDM_LINE :
  123. 123 
  124. 124                          if (ToolID == wParam)
  125. 125                             return (0);
  126. 126 
  127. 127                          CheckMenuItem(hMenu, ToolID,
  128. 128                                         MF_UNCHECKED);
  129. 129                          ToolID = wParam;
  130. 130                          CheckMenuItem(hMenu, ToolID,
  131. 131                                         MF_CHECKED);
  132. 132                          break;
  133. 133 
  134. 134                     case IDM_CLEAR :
  135. 135                          InvalidateRect(hWnd, NULL, TRUE);
  136. 136                          break;
  137. 137 
  138. 138                     case IDM_PRINT :
  139. 139                          lpPrnDlgProc =
  140. 140                               MakeProcInstance(PrnDlgProc,
  141. 141                                                hInst);
  142. 142                          lpAbortProc =
  143. 143                               MakeProcInstance(AbortProc,
  144. 144                                                hInst);
  145. 145                          PrintGraph(hWnd);
  146. 146 
  147. 147                          FreeProcInstance(lpPrnDlgProc);
  148. 148                          FreeProcInstance(lpAbortProc);
  149. 149 
  150. 150                          break;
  151. 151 
  152. 152                     case IDM_QUIT :
  153. 153                          DestroyWindow(hWnd);
  154. 154                          break;
  155. 155                   }
  156. 156                 return (0);
  157. 157 
  158. 158       case WM_SIZE :
  159. 159                 CX = LOWORD(lParam);
  160. 160                 CY = HIWORD(lParam);
  161. 161                 return (0);
  162. 162 
  163. 163       case WM_LBUTTONDOWN :
  164. 164                 SetCapture(hWnd);
  165. 165                 bLBDown = TRUE;
  166. 166 
  167. 167                 OrgPoint = MAKEPOINT(lParam);
  168. 168                 CurPoint = PrePoint = OrgPoint;
  169. 169 
  170. 170                 return (0);
  171. 171 
  172. 172       case WM_LBUTTONUP :
  173. 173                 bLBDown = FALSE;
  174. 174                 ReleaseCapture();
  175. 175 
  176. 176                 hDC = GetDC(hWnd);
  177. 177                 DrawGraph(hDC, TRUE);
  178. 178                 ReleaseDC(hWnd, hDC);
  179. 179 
  180. 180                 return (0);
  181. 181 
  182. 182       case WM_MOUSEMOVE :
  183. 183                 if (bLBDown)
  184. 184                   {
  185. 185                     PrePoint = CurPoint;
  186. 186                     CurPoint = MAKEPOINT(lParam);
  187. 187 
  188. 188                     hDC = GetDC(hWnd);
  189. 189                     DrawGraph(hDC, FALSE);
  190. 190                     ReleaseDC(hWnd, hDC);
  191. 191                   }
  192. 192                 return (0);
  193. 193 
  194. 194       case WM_DESTROY :
  195. 195                 PostQuitMessage(0);
  196. 196                 return (0);
  197. 197 
  198. 198       default :
  199. 199          return(DefWindowProc(hWnd, message, wParam, lParam));
  200. 200     }
  201. 201 }
  202. 202 
  203. 203 
  204. 204 
  205. 205 void DrawGraph(HDC hDC, BOOL bSure)
  206. 206 {
  207. 207    switch (ToolID)
  208. 208     {
  209. 209       case IDM_PENCIL :
  210. 210               DrawPencil(hDC);
  211. 211               break;
  212. 212 
  213. 213       case IDM_LINE :
  214. 214               DrawLine(hDC, bSure);
  215. 215               break;
  216. 216     }
  217. 217 }
  218. 218 
  219. 219 
  220. 220 
  221. 221 void DrawPencil(HDC hDC)
  222. 222 {
  223. 223    MoveTo(hDC, PrePoint.x, PrePoint.y);
  224. 224    LineTo(hDC, CurPoint.x, CurPoint.y);
  225. 225 }
  226. 226 
  227. 227 
  228. 228 
  229. 229 void DrawLine(HDC hDC, BOOL bSure)
  230. 230 {
  231. 231    int  nDrawMode;
  232. 232 
  233. 233    if (! bSure)
  234. 234      {
  235. 235        nDrawMode = SetROP2(hDC, R2_NOT);
  236. 236 
  237. 237        MoveTo(hDC, OrgPoint.x, OrgPoint.y);
  238. 238        LineTo(hDC, PrePoint.x, PrePoint.y);
  239. 239 
  240. 240        MoveTo(hDC, OrgPoint.x, OrgPoint.y);
  241. 241        LineTo(hDC, CurPoint.x, CurPoint.y);
  242. 242 
  243. 243        SetROP2(hDC, nDrawMode);
  244. 244      }
  245. 245    else
  246. 246      {
  247. 247        MoveTo(hDC, OrgPoint.x, OrgPoint.y);
  248. 248        LineTo(hDC, CurPoint.x, CurPoint.y);
  249. 249      }
  250. 250 }
  251. 251 
  252. 252 
  253. 253 
  254. 254 HDC CreateDC_Printer()
  255. 255 {
  256. 256    HDC  hPrnDC;
  257. 257    char szProfile[70];
  258. 258    char *szDriver, *szDevice, *szOutput;
  259. 259 
  260. 260    GetProfileString("windows", "device", "", szProfile, 70);
  261. 261 
  262. 262    szDevice = (char *) strtok(szProfile, ",");
  263. 263    szDriver = (char *) strtok(NULL,     ",");
  264. 264    szOutput = (char *) strtok(NULL,     ",");
  265. 265 
  266. 266    if (szDevice && szDriver && szOutput)
  267. 267     {
  268. 268       hPrnDC = CreateDC(szDriver, szDevice, szOutput, NULL);
  269. 269       return (hPrnDC);
  270. 270     }
  271. 271 
  272. 272    return (NULL);
  273. 273 }
  274. 274 
  275. 275 
  276. 276 
  277. 277 void PrintGraph(HWND hWnd)
  278. 278 {
  279. 279    HDC      hDC, hMemDC;
  280. 280    HDC      hPrnDC;
  281. 281    HBITMAP  hBitmap;
  282. 282    BOOL     bPrinted = TRUE;
  283. 283    char     szName[] = "Demo8_2 -- Abort Proc";
  284. 284 
  285. 285    hPrnDC = CreateDC_Printer();
  286. 286    if (hPrnDC == NULL)
  287. 287      {
  288. 288        MessageBox(hWnd, "Printer Error", NULL,
  289. 289                   MB_OK | MB_ICONHAND);
  290. 290        return ;
  291. 291      }
  292. 292 
  293. 293    hDC = GetDC(hWnd);
  294. 294    hMemDC = CreateCompatibleDC(hDC);
  295. 295    hBitmap = CreateCompatibleBitmap(hDC, CX, CY);
  296. 296 
  297. 297    SelectObject(hMemDC, hBitmap);
  298. 298    BitBlt(hMemDC, 0, 0, CX, CY, hDC, 0, 0, SRCCOPY);
  299. 299    ReleaseDC(hWnd, hDC);
  300. 300 
  301. 301    bCancel = FALSE;
  302. 302    hPrnDlg = CreateDialog(hInst, "PRNDLG", hWnd,
  303. 303                           lpPrnDlgProc);
  304. 304    Escape(hPrnDC, SETABORTPROC, 0, (LPSTR) lpAbortProc,
  305. 305           NULL);
  306. 306 
  307. 307    if (Escape(hPrnDC, STARTDOC,
  308. 308               strlen(szName), szName, NULL) > 0)
  309. 309      {
  310. 310        BitBlt(hPrnDC, 0, 0, CX, CY, hMemDC, 0, 0, SRCCOPY);
  311. 311 
  312. 312        if (Escape(hPrnDC, NEWFRAME, 0, NULL, NULL) > 0)
  313. 313          Escape(hPrnDC, ENDDOC, 0, NULL, NULL);
  314. 314        else
  315. 315          bPrinted = FALSE;
  316. 316      }
  317. 317    else
  318. 318      bPrinted = FALSE;
  319. 319 
  320. 320    if (! bPrinted)
  321. 321      MessageBox(hWnd, "Print Error", NULL,
  322. 322                 MB_OK | MB_ICONHAND);
  323. 323 
  324. 324    if (! bCancel)
  325. 325      {
  326. 326        EnableWindow(hWnd, TRUE);
  327. 327        DestroyWindow(hPrnDlg);
  328. 328      }
  329. 329 
  330. 330    DeleteDC(hPrnDC);
  331. 331    DeleteDC(hMemDC);
  332. 332    DeleteObject(hBitmap);
  333. 333 }
  334. 334 
  335. 335 
  336. 336 BOOL FAR PASCAL AbortProc(HDC hPrnDC, short nCode)
  337. 337 {
  338. 338    MSG  msg;
  339. 339 
  340. 340    while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
  341. 341     {
  342. 342       if (bCancel) break;
  343. 343       if (! IsDialogMessage(hPrnDlg, &msg))
  344. 344         {
  345. 345            TranslateMessage(&msg);
  346. 346            DispatchMessage(&msg);
  347. 347         }
  348. 348     }
  349. 349 
  350. 350    return (! bCancel);
  351. 351 }
  352. 352 
  353. 353 
  354. 354 BOOL FAR PASCAL PrnDlgProc(HWND hDlg, WORD msg,
  355. 355                            WORD wParam, LONG lParam)
  356. 356 {
  357. 357    HWND  hPWnd;
  358. 358    HMENU hSysMenu;
  359. 359 
  360. 360    switch (msg)
  361. 361     {
  362. 362       case WM_INITDIALOG :
  363. 363                 hPWnd = GetParent(hDlg);
  364. 364                 EnableWindow(hPWnd, FALSE);
  365. 365 
  366. 366                 hSysMenu = GetSystemMenu(hDlg, 0);
  367. 367                 EnableMenuItem(hSysMenu, SC_CLOSE,
  368. 368                                MF_GRAYED);
  369. 369                 return (TRUE);
  370. 370 
  371. 371       case WM_COMMAND :
  372. 372                 switch (wParam)
  373. 373                  {
  374. 374                    case DI_CANCEL :
  375. 375                           bCancel = TRUE;
  376. 376                           hPWnd = GetParent(hDlg);
  377. 377                           EnableWindow(hPWnd, TRUE);
  378. 378                           DestroyWindow(hDlg);
  379. 379                           break;
  380. 380                  }
  381. 381                 return (TRUE);
  382. 382     }
  383. 383 
  384. 384    return (FALSE);
  385. 385 }