Annotation of q_a/samples/maskblt/maskblt.c, revision 1.1

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

unix.superglobalmegacorp.com

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