Annotation of mstools/samples/plgblt/plgblt.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.