|
|
1.1 root 1: /**************************************************************************\
2: * plgblt.c -- sample program demonstrating the new PlgBlt() API.
3: *
4: * design: There is one main window with one dialog box stretched to fill
5: * the top of it. The parameters for the plgblt painted into the main
6: * window are stored in the entry fields of this dialog box. The user
7: * may change these values and see the effect on the blt.
8: \**************************************************************************/
9:
10: #include <windows.h>
11: #include <commdlg.h>
12: #include <math.h>
13: #include <stdio.h>
14: #include "plgblt.h"
15: #include "track.h"
16: #include "bitmap.h"
17:
18:
19:
20: /* global variables. */
21: PTrackObject ptoDest, ptoSrc, ptoMask = NULL;
22: HDC hdcDest, hdcSrc, hdcMask;
23: HBITMAP hbmSrc, hbmMask = NULL;
24:
25: HANDLE hInst;
26: HWND hwndMain, hwndDlg;
27:
28:
29:
30:
31: /**************************************************************************\
32: *
33: * function: WinMain()
34: *
35: * input parameters: c.f. generic sample
36: *
37: \**************************************************************************/
38: int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
39: LPSTR lpCmdLine, int nCmdShow)
40: {
41: MSG msg;
42: RECT rect;
43: HANDLE haccel;
44:
45: UNREFERENCED_PARAMETER( lpCmdLine );
46:
47:
48: /* Check for previous instance. If none, then register class. */
49: if (!hPrevInstance) {
50: WNDCLASS wc;
51:
52: wc.style = NULL;
53: wc.lpfnWndProc = (WNDPROC)MainWndProc;
54:
55: wc.cbClsExtra = 0;
56: wc.cbWndExtra = 0;
57: wc.hInstance = hInstance;
58: wc.hIcon = LoadIcon(hInstance, "plgbltIcon");
59: wc.hCursor = LoadCursor(NULL, IDC_ARROW);
60: wc.hbrBackground = GetStockObject(LTGRAY_BRUSH);
61: wc.lpszMenuName = NULL;
62: wc.lpszClassName = "plgblt";
63:
64: if (!RegisterClass(&wc)) return (FALSE);
65: } /* class registered o.k. */
66:
67:
68: /* Create the main window. Return false if CreateWindow() fails */
69: hInst = hInstance;
70:
71: hwndMain = CreateWindow(
72: "plgblt",
73: "plgblt",
74: WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
75: CW_USEDEFAULT,
76: CW_USEDEFAULT,
77: CW_USEDEFAULT,
78: CW_USEDEFAULT,
79: NULL,
80: NULL,
81: hInstance,
82: NULL);
83:
84: if (!hwndMain) return (FALSE);
85:
86:
87: /* create the top dialog as a child of the main window. */
88: hwndDlg = CreateDialog (hInst, "plgbltDlg", hwndMain, (DLGPROC)DlgProc);
89:
90: /* Send main window a WM_SIZE message so that it will size the top
91: * dialog correctly.
92: */
93: GetClientRect (hwndMain, &rect);
94: SendMessage (hwndMain, WM_SIZE, 0, (rect.right - rect.left));
95: ShowWindow (hwndDlg, SW_SHOW);
96: ShowWindow(hwndMain, nCmdShow);
97:
98:
99: /* Load the accelerator table that provides clipboard support. */
100: haccel = LoadAccelerators (hInst, "bltAccel");
101:
102:
103:
104: /* Loop getting messages and dispatching them. */
105: while (GetMessage(&msg,NULL, NULL, NULL)) {
106: if (!TranslateAccelerator(hwndMain, haccel, &msg))
107: if (!IsDialogMessage (hwndDlg, &msg)){
108: DispatchMessage(&msg);
109: }
110: }
111:
112: /* Return the value from PostQuitMessage */
113: return (msg.wParam);
114: }
115:
116:
117:
118:
119: /**************************************************************************\
120: *
121: * function: MainWndProc()
122: *
123: * input parameters: normal window procedure parameters.
124: *
125: * There are 6 different HDCs used for the main window (in addition to the
126: * temporary one returned from BeginPaint). There are two for each of the
127: * three thirds of the window. The first one contains the bitmap. The
128: * second one is for the track object and is stored in the TRACKOBJECT
129: * structure.
130: *
131: * global variables:
132: * hwndDlg - dialog with entry fields containing parameters.
133: * ptoDest, ptoSrc, ptoMask - pointers to the direct manipulation objects
134: * hdcDest, hdcSrc, hdcMask - HDCs for the 3 sub regions of the window.
135: * hbmSrc, hbmMask - bitmap handles for source and mask.
136: \**************************************************************************/
137: LRESULT MainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
138: {
139: static int miniWidth;
140: static RECT rect;
141: static HANDLE hPenGrid, hPenSeparator;
142:
143: switch (message) {
144:
145: /**********************************************************************\
146: * WM_CREATE
147: *
148: * Get three new HDCs, then create three new track objects.
149: * Each track object has different allowed tracking modes.
150: * Finally create two pens for drawing later on.
151: \**********************************************************************/
152: case WM_CREATE:
153: hdcSrc = GetDC (hwnd);
154: hdcDest = GetDC (hwnd);
155: hdcMask = GetDC (hwnd);
156:
157: ptoDest = doTrackObject (NULL, TROB_NEW, hwnd,NULL);
158: ptoDest->allowedModes = TMALL;
159: ptoSrc = doTrackObject (NULL, TROB_NEW, hwnd,NULL);
160: ptoSrc->allowedModes = TMMOVE | TMSIZEXY;
161: ptoMask = doTrackObject (NULL, TROB_NEW, hwnd,NULL);
162: ptoMask->allowedModes = TMMOVE;
163:
164: hPenGrid = CreatePen (PS_SOLID, 1, GRIDCOLOR);
165: hPenSeparator = CreatePen (PS_SOLID, 2*SEPARATORWIDTH, (COLORREF) 0x01000000);
166: break;
167:
168:
169: /**********************************************************************\
170: * WM_DESTROY
171: *
172: * Complement of WM_CREATE. Free up all of the HDCs, send all of the
173: * track objects their delete messages, delete the pens,
174: * then call PostQuitMessage.
175: \**********************************************************************/
176: case WM_DESTROY:
177: ReleaseDC (hwnd, hdcSrc );
178: ReleaseDC (hwnd, hdcDest);
179: ReleaseDC (hwnd, hdcMask);
180: doTrackObject (ptoDest, TROB_DELETE, hwnd,NULL);
181: doTrackObject (ptoSrc , TROB_DELETE, hwnd,NULL);
182: doTrackObject (ptoMask, TROB_DELETE, hwnd,NULL);
183:
184: DeleteObject(hPenGrid);
185: DeleteObject(hPenSeparator);
186:
187: PostQuitMessage(0);
188: break;
189:
190:
191:
192: /**********************************************************************\
193: * WM_SIZE
194: *
195: * Stretch the top dialog to fill the width of the main window.
196: * Adjust the viewport origins of the 6 HDCs.
197: * Set the clip regions of the 6 HDCs.
198: \**********************************************************************/
199: case WM_SIZE: {
200: HRGN hrgn;
201:
202: SetWindowPos (hwndDlg, NULL, 0,0, LOWORD(lParam), DIALOGHEIGHT, NULL);
203:
204: GetClientRect (hwndMain, &rect);
205: miniWidth = rect.right/3;
206:
207: SetViewportOrgEx (hdcDest, 0, DIALOGHEIGHT, NULL);
208: SetViewportOrgEx (ptoDest->hdc, 0, DIALOGHEIGHT, NULL);
209: SetViewportOrgEx (hdcSrc, miniWidth, DIALOGHEIGHT, NULL);
210: SetViewportOrgEx (ptoSrc->hdc, miniWidth, DIALOGHEIGHT, NULL);
211: SetViewportOrgEx (hdcMask, 2*miniWidth, DIALOGHEIGHT, NULL);
212: SetViewportOrgEx (ptoMask->hdc, 2*miniWidth, DIALOGHEIGHT, NULL);
213:
214: ptoDest->rectClip.left = 0;
215: ptoDest->rectClip.top = DIALOGHEIGHT;
216: ptoDest->rectClip.right = miniWidth-2*SEPARATORWIDTH;
217: ptoDest->rectClip.bottom = rect.bottom;
218: hrgn = CreateRectRgnIndirect (&ptoDest->rectClip);
219: SelectClipRgn (hdcDest, hrgn);
220: SelectClipRgn (ptoDest->hdc, hrgn);
221: DeleteObject (hrgn);
222:
223: ptoSrc->rectClip.left = miniWidth;
224: ptoSrc->rectClip.top = DIALOGHEIGHT;
225: ptoSrc->rectClip.right = 2*miniWidth-2*SEPARATORWIDTH;
226: ptoSrc->rectClip.bottom = rect.bottom;
227: hrgn = CreateRectRgnIndirect (&ptoSrc->rectClip);
228: SelectClipRgn (hdcSrc, hrgn);
229: SelectClipRgn (ptoSrc->hdc, hrgn);
230: DeleteObject (hrgn);
231:
232: ptoMask->rectClip.left = 2*miniWidth;
233: ptoMask->rectClip.top = DIALOGHEIGHT;
234: ptoMask->rectClip.right = 3*miniWidth;
235: ptoMask->rectClip.bottom = rect.bottom;
236: hrgn = CreateRectRgnIndirect (&ptoMask->rectClip);
237: SelectClipRgn (hdcMask, hrgn);
238: SelectClipRgn (ptoMask->hdc, hrgn);
239: DeleteObject (hrgn);
240:
241: SendMessage (hwndDlg, WM_PUTUPLPOINTS, (DWORD)hdcDest, (LONG)ptoDest);
242: SendMessage (hwndDlg, WM_PUTUPSRCRECT, (DWORD)hdcSrc, (LONG)ptoSrc);
243: SendMessage (hwndDlg, WM_PUTUPMASKPT, (DWORD)hdcMask, (LONG)ptoMask);
244:
245: /* repaint the whole window. */
246: InvalidateRect (hwnd, NULL, TRUE);
247: } break;
248:
249:
250:
251: /**********************************************************************\
252: * WM_PAINT
253: *
254: * miniWidth, rect -- set by WM_SIZE message.
255: *
256: * First shift the viewport origin down so that 0,0 is the top left
257: * most visible point (out from underneath the top dialog). Second,
258: * draw the grid with wider lines on the axes. Finally, read the
259: * values out of the top dialog, do elementary validation, and then
260: * try to call plgblt() with the values.
261: \**********************************************************************/
262: case WM_PAINT: {
263: HDC hdc;
264: PAINTSTRUCT ps;
265:
266: hdc = BeginPaint(hwnd, &ps);
267:
268: /* Draw Separator lines for the three miniareas */
269: SelectObject(hdc, hPenSeparator);
270: MoveToEx (hdc, miniWidth-SEPARATORWIDTH,0, NULL);
271: LineTo (hdc, miniWidth-SEPARATORWIDTH, rect.bottom);
272: MoveToEx (hdc, 2*miniWidth-SEPARATORWIDTH,0, NULL);
273: LineTo (hdc, 2*miniWidth-SEPARATORWIDTH, rect.bottom);
274:
275: /* Grid the HDCs */
276: SelectObject(hdcSrc, hPenGrid);
277: DrawGrids (hdcSrc, miniWidth, rect.bottom);
278: SelectObject(hdcMask, hPenGrid);
279: DrawGrids (hdcMask, miniWidth, rect.bottom);
280:
281: /* Draw bitmaps if any, then draw track objects over them. */
282: if (hbmSrc) DrawBitmap (hdcSrc, hbmSrc);
283: if (hbmMask) DrawBitmap (hdcMask, hbmMask);
284: doTrackObject (ptoSrc , TROB_PAINT, hwnd, NULL);
285: doTrackObject (ptoMask, TROB_PAINT, hwnd, NULL);
286:
287: /* paint the left third of the window. */
288: SendMessage (hwnd, WM_PLGBLT, 0,0);
289:
290: EndPaint (hwnd, &ps);
291: } return FALSE;
292:
293:
294:
295: /**********************************************************************\
296: * WM_PLGBLT
297: *
298: * WM_USER message. This paints the left third of the window. It
299: * is called on the WM_PAINT message. It is separated out here because
300: * it is common for just the plgblt() to need to be called and not the
301: * whole window painted.
302: \**********************************************************************/
303: case WM_PLGBLT: {
304: POINT lpPoint[3];
305: int XSrc, YSrc, nWidth, nHeight, XMask, YMask;
306: BOOL success;
307: RECT cliprect;
308:
309: doTrackObject (ptoSrc , TROB_PAINT, hwnd, NULL);
310: doTrackObject (ptoMask, TROB_PAINT, hwnd, NULL);
311:
312: GetClipBox (hdcDest, &cliprect);
313: FillRect (hdcDest, &cliprect,
314: (HBRUSH) GetClassLong (hwnd, GCL_HBRBACKGROUND));
315: SelectObject(hdcDest, hPenGrid);
316:
317: DrawGrids (hdcDest, miniWidth, rect.bottom);
318: if (IsWindow(hwndDlg)) {
319:
320: /* Grab points out of the dialog entry fields. */
321: lpPoint[0].x = GetDlgItemInt(hwndDlg, DID_P1X, &success, TRUE);
322: lpPoint[0].y = GetDlgItemInt(hwndDlg, DID_P1Y, &success, TRUE);
323: lpPoint[1].x = GetDlgItemInt(hwndDlg, DID_P2X, &success, TRUE);
324: lpPoint[1].y = GetDlgItemInt(hwndDlg, DID_P2Y, &success, TRUE);
325: lpPoint[2].x = GetDlgItemInt(hwndDlg, DID_P3X, &success, TRUE);
326: lpPoint[2].y = GetDlgItemInt(hwndDlg, DID_P3Y, &success, TRUE);
327: XSrc = GetDlgItemInt(hwndDlg, DID_XSRC, &success, TRUE);
328: YSrc = GetDlgItemInt(hwndDlg, DID_YSRC, &success, TRUE);
329: nWidth = GetDlgItemInt(hwndDlg, DID_WIDTH, &success, TRUE);
330: nHeight = GetDlgItemInt(hwndDlg, DID_HEIGHT, &success, TRUE);
331: XMask = GetDlgItemInt(hwndDlg, DID_XMASK, &success, TRUE);
332: YMask = GetDlgItemInt(hwndDlg, DID_YMASK, &success, TRUE);
333:
334:
335: /**********************************************************/
336: /**********************************************************/
337: PlgBlt (hdcDest, lpPoint,
338: hdcSrc, XSrc, YSrc, nWidth, nHeight,
339: hbmMask, XMask, YMask);
340: /**********************************************************/
341: /**********************************************************/
342: }
343: doTrackObject (ptoSrc , TROB_PAINT, hwnd, NULL);
344: doTrackObject (ptoMask, TROB_PAINT, hwnd, NULL);
345: } break;
346:
347:
348:
349: /**********************************************************************\
350: * WM_LBUTTONDOWN & WM_RBUTTONDOWN
351: * On button down messages, hittest on the track object, and if
352: * it returns true, then send these messages to the track object.
353: \**********************************************************************/
354: case WM_RBUTTONDOWN:
355: case WM_LBUTTONDOWN:
356: if (doTrackObject(ptoDest, TROB_HITTEST, hwnd, lParam))
357: doTrackObject(ptoDest, message, hwnd, lParam);
358: else if (doTrackObject(ptoSrc, TROB_HITTEST, hwnd, lParam))
359: doTrackObject(ptoSrc, message, hwnd, lParam);
360: else if (doTrackObject(ptoMask, TROB_HITTEST, hwnd, lParam))
361: doTrackObject(ptoMask, message, hwnd, lParam);
362: break;
363:
364:
365:
366: /**********************************************************************\
367: * WM_LBUTTONUP & WM_RBUTTONDOWN & MW_MOUSEMOVE
368: * If the track object is in a "tracking mode" then send it these messages.
369: * If the transform dialog is not minimized, fill it with numbers.
370: * If the mouse dialog is not minimized, fill it with numbers.
371: \**********************************************************************/
372: case WM_RBUTTONUP:
373: case WM_LBUTTONUP:
374: /* user action complete. Force plgblt() update. */
375: PostMessage (hwndMain, WM_PLGBLT, 0,0);
376: case WM_MOUSEMOVE:
377: if (ptoDest->Mode) {
378: doTrackObject(ptoDest, message, hwnd, lParam);
379: SendMessage (hwndDlg, WM_PUTUPLPOINTS, (DWORD) hdcDest, (LONG) ptoDest);
380: }
381: if (ptoSrc->Mode) {
382: doTrackObject(ptoSrc, message, hwnd, lParam);
383: SendMessage (hwndDlg, WM_PUTUPSRCRECT, (DWORD) hdcSrc, (LONG) ptoSrc);
384: }
385:
386: if (ptoMask->Mode) {
387: doTrackObject(ptoMask, message, hwnd, lParam);
388: SendMessage (hwndDlg, WM_PUTUPMASKPT, (DWORD) hdcMask, (LONG) ptoMask);
389: }
390:
391: break;
392:
393:
394:
395: /**********************************************************************\
396: * Accelerator & clipboard support.
397: *
398: * Certain key strokes (c.f. *.rc) will cause the following WM_COMMAND
399: * messages. In response the app will copy a bitmap into the clipboard
400: * or paste down from it. In both cases, it is necessary to create a
401: * new bitmap since a bitmap in the clipboard belongs to the clipboard
402: * and not to the application.
403: \**********************************************************************/
404: case WM_COMMAND:
405: switch (LOWORD(wParam)) {
406: HBITMAP hbmCompat, hbmOld;
407: HDC hdcCompat;
408:
409: /******************************************************************\
410: * WM_COMMAND, AID_COPY
411: *
412: * Create a new bitmap, copy the destination HDC bits into it,
413: * and send the new bitmap to the clipboard.
414: \******************************************************************/
415: case AID_COPY: {
416: int X[4],Y[4];
417: int nWidth, nHeight;
418: int Xmin, Ymin, Xmax, Ymax;
419: BOOL success;
420: int i;
421:
422: for (i = 0; i<3 ; i++) {
423: X[i] = GetDlgItemInt(hwndDlg, DID_P1X + 2*i, &success, TRUE);
424: Y[i] = GetDlgItemInt(hwndDlg, DID_P1Y + 2*i, &success, TRUE);
425: }
426:
427: X[3] = (X[1] - X[0]) + X[2];
428: Y[3] = (Y[2] - Y[0]) + Y[1];
429:
430: Xmin = Xmax = X[0];
431: Ymin = Ymax = Y[0];
432:
433: for (i = 1; i<4 ; i++) {
434: Xmin = (X[i] < Xmin) ? X[i] : Xmin;
435: Ymin = (Y[i] < Ymin) ? Y[i] : Ymin;
436: Xmax = (X[i] > Xmax) ? X[i] : Xmax;
437: Ymax = (Y[i] > Ymax) ? Y[i] : Ymax;
438: }
439:
440: nWidth = Xmax - Xmin;
441: nHeight = Ymax - Ymin;
442:
443: hdcCompat = CreateCompatibleDC(hdcDest);
444: hbmCompat = CreateCompatibleBitmap (hdcDest, nWidth, nHeight);
445: hbmOld = SelectObject(hdcCompat,hbmCompat);
446:
447: BitBlt (hdcCompat, 0,0,nWidth, nHeight, hdcDest, Xmin,Ymin, SRCCOPY );
448:
449: SelectObject(hdcCompat,hbmOld);
450: DeleteDC(hdcCompat);
451:
452: OpenClipboard (hwnd);
453: SetClipboardData (CF_BITMAP,hbmCompat);
454: CloseClipboard ();
455:
456: DeleteObject (hbmCompat);
457:
458: } break;
459:
460:
461: /******************************************************************\
462: * WM_COMMAND, AID_PASTE
463: *
464: * Get bitmap handle from clipboard, create a new bitmap, draw
465: * the clipboard bitmap into the new one, and store the new
466: * handle in the global hbmSrc.
467: \******************************************************************/
468: case AID_PASTE: {
469: HBITMAP hbm;
470: BITMAP bm;
471:
472: OpenClipboard (hwnd);
473: if ( hbm = GetClipboardData (CF_BITMAP)) {
474: DeleteObject (hbmSrc);
475:
476: GetObject (hbm, sizeof(BITMAP), &bm);
477:
478: hdcCompat = CreateCompatibleDC(hdcDest);
479: hbmCompat = CreateCompatibleBitmap (hdcDest, bm.bmWidth, bm.bmHeight);
480: hbmOld = SelectObject(hdcCompat,hbmCompat);
481:
482: DrawBitmap (hdcCompat, hbm);
483:
484: SelectObject(hdcCompat,hbmOld);
485: DeleteDC(hdcCompat);
486:
487: hbmSrc = hbmCompat;
488:
489: InvalidateRect (hwnd, &ptoSrc->rectClip, TRUE);
490: InvalidateRect (hwnd, &ptoDest->rectClip, TRUE);
491: }
492: CloseClipboard ();
493: } break;
494:
495: /******************************************************************\
496: * WM_COMMAND, AID_CYCLE
497: *
498: * Post a COPY and PASTE command message to this window so that with
499: * one key stroke the user can copy the DEST image into the clipboard,
500: * paste it down into the SRC hdc and cause the blt.
501: \******************************************************************/
502: case AID_CYCLE:
503: PostMessage (hwnd, WM_COMMAND, MAKELONG (AID_COPY , 1), 0);
504: PostMessage (hwnd, WM_COMMAND, MAKELONG (AID_PASTE, 1), 0);
505: break;
506: } /* end switch */
507:
508: break; /* end wm_command */
509:
510:
511:
512:
513:
514:
515:
516:
517:
518:
519:
520:
521:
522:
523:
524: default:
525: return (DefWindowProc(hwnd, message, wParam, lParam));
526: }
527: return (NULL);
528: }
529:
530:
531:
532:
533: /**************************************************************************\
534: *
535: * function: DlgProc()
536: *
537: * input parameters: normal window procedure parameters.
538: *
539: * Respond to user button presses by getting new bitmaps or by sending
540: * the main window a WM_PLGBLT message. Also handle special user messages
541: * for updating the entry fields with the contents of the direct manipulation
542: * objects.
543: *
544: * global variables:
545: * hwndMain - the main window. also the parent of this dialog
546: * ptoDest, ptoSrc, ptoMask - pointers to the direct manipulation objects
547: * hdcDest, hdcSrc, hdcMask - HDCs for the 3 sub regions of the window.
548: * hbmSrc, hbmMask - bitmap handles for source and mask.
549: \**************************************************************************/
550: LRESULT DlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
551: {
552:
553: switch (message) {
554: /**********************************************************************\
555: * WM_INITDIALOG
556: *
557: * Fill the entry fields with sensible original values.
558: \**********************************************************************/
559: case WM_INITDIALOG:
560: SetDlgItemText(hwnd, DID_P1X , "0");
561: SetDlgItemText(hwnd, DID_P1Y , "0");
562: SetDlgItemText(hwnd, DID_P2X , "0");
563: SetDlgItemText(hwnd, DID_P2Y , "0");
564: SetDlgItemText(hwnd, DID_P3X , "0");
565: SetDlgItemText(hwnd, DID_P3Y , "0");
566: SetDlgItemText(hwnd, DID_XSRC , "0");
567: SetDlgItemText(hwnd, DID_YSRC , "0");
568: SetDlgItemText(hwnd, DID_WIDTH , "0");
569: SetDlgItemText(hwnd, DID_HEIGHT , "0");
570: SetDlgItemText(hwnd, DID_XMASK , "0");
571: SetDlgItemText(hwnd, DID_YMASK , "0");
572: return TRUE;
573:
574:
575:
576: /**********************************************************************\
577: * WM_PUTUPLPOINTS
578: *
579: * wParam - HDC with the needed world transform.
580: * lParam - Pointer to the track object.
581: *
582: * Fill the entry fields for the array of 3 dest parallelogram points.
583: * Conditionally change the first point depending on tracking mode.
584: \**********************************************************************/
585: case WM_PUTUPLPOINTS: {
586: POINT p, origin;
587: PTrackObject pto;
588: HDC hdc;
589:
590: hdc = (HDC) wParam;
591: pto = (PTrackObject) lParam;
592: GetViewportOrgEx (hdc, &origin);
593:
594: if (pto->Mode & TMMOVE) {
595: p.x = pto->rect.left;
596: p.y = pto->rect.top;
597: LPtoDP (pto->hdc, &p, 1);
598: p.x -= origin.x; p.y -= origin.y;
599:
600: SetDlgItemInt(hwnd, DID_P1X, p.x, TRUE);
601: SetDlgItemInt(hwnd, DID_P1Y, p.y, TRUE);
602:
603: }
604:
605: p.x = pto->rect.right;
606: p.y = pto->rect.top;
607: LPtoDP (pto->hdc, &p, 1);
608: p.x -= origin.x; p.y -= origin.y;
609:
610: SetDlgItemInt(hwnd, DID_P2X, p.x, TRUE);
611: SetDlgItemInt(hwnd, DID_P2Y, p.y, TRUE);
612:
613: p.x = pto->rect.left;
614: p.y = pto->rect.bottom;
615: LPtoDP (pto->hdc, &p, 1);
616: p.x -= origin.x; p.y -= origin.y;
617: SetDlgItemInt(hwnd, DID_P3X, p.x, TRUE);
618: SetDlgItemInt(hwnd, DID_P3Y, p.y, TRUE);
619:
620: } return FALSE;
621:
622:
623:
624:
625: /**********************************************************************\
626: * WM_PUTUPSRCRECT
627: *
628: * wParam - HDC with the needed world transform.
629: * lParam - Pointer to the track object.
630: *
631: * Fill the entry fields for the source rectangle points.
632: * Conditionally change <x,y> or <width,height> depending on tracking mode.
633: \**********************************************************************/
634: case WM_PUTUPSRCRECT: {
635: POINT p1,p2, origin;
636: PTrackObject pto;
637: HDC hdc;
638:
639: hdc = (HDC) wParam;
640: pto = (PTrackObject) lParam;
641: GetViewportOrgEx (hdc, &origin);
642:
643: p1.x = pto->rect.left;
644: p1.y = pto->rect.top;
645: LPtoDP (pto->hdc, &p1, 1);
646:
647: p2.x = pto->rect.right;
648: p2.y = pto->rect.bottom;
649: LPtoDP (pto->hdc, &p2, 1);
650: p2.x -= p1.x; p2.y -= p1.y;
651:
652: p1.x -= origin.x; p1.y -= origin.y;
653:
654: if (!(pto->Mode & TMSIZEXY)) {
655: SetDlgItemInt(hwnd, DID_XSRC, p1.x, TRUE);
656: SetDlgItemInt(hwnd, DID_YSRC, p1.y, TRUE);
657: }
658:
659: if (!(pto->Mode & TMMOVE)) {
660: SetDlgItemInt(hwnd, DID_WIDTH, p2.x, TRUE);
661: SetDlgItemInt(hwnd, DID_HEIGHT, p2.y, TRUE);
662: }
663: } return FALSE;
664:
665:
666:
667: /**********************************************************************\
668: * WM_PUTUPMASKPT
669: *
670: * wParam - HDC with the needed world transform.
671: * lParam - Pointer to the track object.
672: *
673: * Fill the entry fields for the mask location point.
674: \**********************************************************************/
675: case WM_PUTUPMASKPT: {
676: POINT p1, origin;
677: PTrackObject pto;
678: HDC hdc;
679:
680: hdc = (HDC) wParam;
681: pto = (PTrackObject) lParam;
682: GetViewportOrgEx (hdc, &origin);
683:
684: p1.x = pto->rect.left;
685: p1.y = pto->rect.top;
686: LPtoDP (pto->hdc, &p1, 1);
687: p1.x -= origin.x; p1.y -= origin.y;
688:
689: SetDlgItemInt(hwnd, DID_XMASK, p1.x, TRUE);
690: SetDlgItemInt(hwnd, DID_YMASK, p1.y, TRUE);
691:
692: } return FALSE;
693:
694:
695:
696:
697: /**********************************************************************\
698: * WM_COMMAND, DID_DRAW
699: *
700: * Draw button hit - send main window message to call PlgBlt().
701: \**********************************************************************/
702: case WM_COMMAND: {
703: HBITMAP hbm;
704:
705: if (LOWORD(wParam) == DID_DRAW) {
706: SendMessage (hwndMain, WM_PLGBLT, 0,0);
707:
708:
709: /**********************************************************************\
710: * WM_COMMAND, DID_NEWSRC
711: *
712: * Try to get a new source bitmap. Then
713: * invalidate two sub windows so that we force a repaint.
714: \**********************************************************************/
715: } else if (LOWORD(wParam) == DID_NEWSRC) {
716: if ( hbm = GetBitmap (hdcSrc, hInst, FALSE)) {
717: DeleteObject (hbmSrc);
718: hbmSrc = hbm;
719: InvalidateRect (hwndMain, &ptoSrc->rectClip, TRUE);
720: InvalidateRect (hwndMain, &ptoDest->rectClip, TRUE);
721: }
722:
723: /**********************************************************************\
724: * WM_COMMAND, DID_Mask
725: *
726: * Try to get a new mask bitmap. Then
727: * invalidate two sub windows so that we force a repaint.
728: \**********************************************************************/
729: } else if (LOWORD(wParam) == DID_NEWMASK) {
730: if ( hbm = GetBitmap (hdcMask, hInst, TRUE)) {
731: DeleteObject (hbmMask);
732: hbmMask = hbm;
733: InvalidateRect (hwndMain, &ptoMask->rectClip, TRUE);
734: InvalidateRect (hwndMain, &ptoDest->rectClip, TRUE);
735: }
736: }
737:
738: } return FALSE; /* end WM_COMMAND */
739:
740:
741: } /* end switch */
742: return (NULL);
743: }
744:
745:
746:
747: #define TICKSPACE 20
748:
749: /**************************************************************************\
750: *
751: * function: DrawGrids()
752: *
753: * input parameters:
754: * hdc - Device context to draw into.
755: * width, height - size of the rectangle to fill with grids.
756: *
757: * global variables: none.
758: *
759: \**************************************************************************/
760: VOID DrawGrids (HDC hdc, int width, int height)
761: {
762: int i;
763:
764: /* Draw vertical lines. Double at the axis */
765: for (i = 0; i<= width; i+=TICKSPACE){
766: MoveToEx (hdc, i, 0, NULL);
767: LineTo (hdc, i, height);
768: }
769: MoveToEx (hdc, 1, 0, NULL);
770: LineTo (hdc, 1, height);
771:
772: /* Draw horizontal lines. Double at the axis */
773: for (i = 0; i<= height; i+=TICKSPACE){
774: MoveToEx (hdc, 0,i, NULL);
775: LineTo (hdc, width,i);
776: }
777: MoveToEx (hdc, 0, 1, NULL);
778: LineTo (hdc, width,1);
779:
780: return;
781: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.