Annotation of mstools/samples/ddeml/client/track.c, revision 1.1

1.1     ! root        1: /***************************************************************************
        !             2:  *                                                                         *
        !             3:  *  MODULE      : track.c                                                  *
        !             4:  *                                                                         *
        !             5:  *  PURPOSE     : Generic tracking code.                                   *
        !             6:  *                                                                         *
        !             7:  ***************************************************************************/
        !             8: #include <windows.h>
        !             9: #include <windowsx.h>
        !            10: #include "track.h"
        !            11: 
        !            12: RECT  rcTrack;
        !            13: RECT  rcDelta;
        !            14: POINT ptOrg;
        !            15: POINT ptPrev;
        !            16: DWORD  fsTrack;
        !            17: RECT  rcBoundary;
        !            18: INT cxMinTrack;
        !            19: INT cyMinTrack;
        !            20: 
        !            21: VOID DrawTrackRect(HWND hwnd, LPRECT prcOld, LPRECT prcNew);
        !            22: VOID HorzUpdate(HDC hdc, INT yOld, INT yNew, INT x1Old, INT x1New, INT x2Old,
        !            23:         INT x2New);
        !            24: VOID VertUpdate(HDC hdc, INT xOld, INT xNew, INT y1Old, INT y1New, INT y2Old,
        !            25:         INT y2New);
        !            26: LONG  APIENTRY TrackingWndProc(HWND hwnd, DWORD msg, WPARAM wParam, LPARAM lParam);
        !            27: 
        !            28: typedef    POINTS      MPOINT         ;
        !            29: #define MAKEMPOINT(l)                  (*((MPOINT *)&(l)))
        !            30: #define MPOINT2POINT(mpt,pt)            ((pt).x = (mpt).x, (pt).y = (mpt).y)
        !            31: 
        !            32: 
        !            33: /****************************************************************************
        !            34:  *                                                                          *
        !            35:  *  FUNCTION   : TrackRect()                                                *
        !            36:  *                                                                          *
        !            37:  *  PURPOSE    : Implements functionality similiar to the PM WinTrackRect() *
        !            38:  *                                                                          *
        !            39:  *  RETURNS    : TRUE on success, FALSE if tracking was canceled.           *
        !            40:  *               prcResult contains the resulting rectangle.                *
        !            41:  *                                                                          *
        !            42:  ****************************************************************************/
        !            43: BOOL TrackRect(
        !            44: HANDLE hInst,
        !            45: HWND   hwnd,        // bounding window
        !            46: INT    left,        // rectangle to track in bounding window coords.
        !            47: INT    top,
        !            48: INT    right,
        !            49: INT    bottom,
        !            50: INT    cxMin,
        !            51: INT    cyMin,
        !            52: DWORD   fs,
        !            53: LPRECT prcResult)   // result rect in bounding window coords.
        !            54: {
        !            55:     static BOOL fTracking = 0;
        !            56:     FARPROC lpOrgWndProc, lpTrackWndProc;
        !            57:     HWND hwndOldCapture, hwndOldFocus;
        !            58:     MSG msg;
        !            59: 
        !            60:     if (fTracking)
        !            61:         return FALSE;
        !            62: 
        !            63:     fTracking = TRUE;
        !            64: 
        !            65:     lpOrgWndProc = (FARPROC)GetWindowLong(hwnd, GWL_WNDPROC);
        !            66:     lpTrackWndProc = MakeProcInstance((FARPROC)TrackingWndProc, hInst);
        !            67:     SetWindowLong(hwnd, GWL_WNDPROC, (DWORD)lpTrackWndProc);
        !            68: 
        !            69:     hwndOldCapture = GetCapture();
        !            70:     SetCapture(hwnd);
        !            71: 
        !            72:     hwndOldFocus = SetFocus(hwnd);
        !            73:     UpdateWindow(hwnd);
        !            74: 
        !            75:     GetCursorPos(&ptOrg);
        !            76:     ScreenToClient(hwnd, &ptOrg);
        !            77: 
        !            78:     if (fs & TF_SETPOINTERPOS) {
        !            79: 
        !            80:         if (fs & TF_LEFT && fs & TF_RIGHT)
        !            81:             ptOrg.x = (left + right) / 2;
        !            82:         else if (fs & TF_LEFT)
        !            83:             ptOrg.x = left;
        !            84:         else if (fs & TF_RIGHT)
        !            85:             ptOrg.x = right;
        !            86: 
        !            87:         if (fs & TF_TOP && fs & TF_BOTTOM)
        !            88:             ptOrg.y = (top + bottom) / 2;
        !            89:         else if (fs & TF_TOP)
        !            90:             ptOrg.y = top;
        !            91:         else if (fs & TF_BOTTOM)
        !            92:             ptOrg.y = bottom;
        !            93: 
        !            94:         ClientToScreen(hwnd, &ptOrg);
        !            95:         SetCursorPos(ptOrg.x, ptOrg.y);
        !            96:         ScreenToClient(hwnd, &ptOrg);
        !            97:     }
        !            98: 
        !            99:     ptPrev = ptOrg;
        !           100:     cxMinTrack = cxMin;
        !           101:     cyMinTrack = cyMin;
        !           102:     GetClientRect(hwnd, &rcBoundary);
        !           103:     fsTrack = fs;
        !           104:     SetRect(&rcTrack, left, top, right, bottom);
        !           105:     SetRect(&rcDelta, left - ptOrg.x, top - ptOrg.y, right - ptOrg.x,
        !           106:             bottom - ptOrg.y);
        !           107:     DrawTrackRect(hwnd, &rcTrack, NULL);
        !           108: 
        !           109:     while (GetMessage(&msg, NULL, NULL, NULL))
        !           110:         DispatchMessage(&msg);
        !           111: 
        !           112:     DrawTrackRect(hwnd, &rcTrack, NULL);
        !           113: 
        !           114:     SetWindowLong(hwnd, GWL_WNDPROC, (DWORD)lpOrgWndProc);
        !           115:     FreeProcInstance(lpTrackWndProc);
        !           116: 
        !           117:     SetFocus(hwndOldFocus);
        !           118:     SetCapture(hwndOldCapture);
        !           119:     CopyRect(prcResult, &rcTrack);
        !           120: 
        !           121:     fTracking = FALSE;
        !           122: }
        !           123: 
        !           124: 
        !           125: 
        !           126: 
        !           127: 
        !           128: /****************************************************************************
        !           129:  *                                                                          *
        !           130:  *  FUNCTION   : DrawTrackRect()                                            *
        !           131:  *                                                                          *
        !           132:  *  PURPOSE    : XOR draws whats needed to move a selection from prcOld to  *
        !           133:  *               prcNew.  If prcNew == NULL this is considered a            *
        !           134:  *               first-time draw or last time erase.                        *
        !           135:  *                                                                          *
        !           136:  ****************************************************************************/
        !           137: VOID DrawTrackRect(
        !           138: HWND hwnd,
        !           139: LPRECT prcOld,
        !           140: LPRECT prcNew)
        !           141: {
        !           142:     HDC hdc;
        !           143: 
        !           144:     hdc = GetDC(hwnd);
        !           145:     SetROP2(hdc, R2_NOT);
        !           146:         // erase/draw the whole thing
        !           147:        MoveToEx(hdc, prcOld->left, prcOld->top, NULL);
        !           148:         LineTo(hdc, prcOld->right, prcOld->top);
        !           149:         LineTo(hdc, prcOld->right, prcOld->bottom);
        !           150:         LineTo(hdc, prcOld->left, prcOld->bottom);
        !           151:         LineTo(hdc, prcOld->left, prcOld->top);
        !           152:         if (prcNew) {
        !           153:            MoveToEx(hdc, prcNew->left, prcNew->top, NULL);
        !           154:             LineTo(hdc, prcNew->right, prcNew->top);
        !           155:             LineTo(hdc, prcNew->right, prcNew->bottom);
        !           156:             LineTo(hdc, prcNew->left, prcNew->bottom);
        !           157:             LineTo(hdc, prcNew->left, prcNew->top);
        !           158:         }
        !           159:     ReleaseDC(hwnd, hdc);
        !           160: }
        !           161: 
        !           162: 
        !           163: 
        !           164: /****************************************************************************
        !           165:  *                                                                          *
        !           166:  *  FUNCTION   : TrackingWndProc()                                          *
        !           167:  *                                                                          *
        !           168:  *  PURPOSE    : Window procedure that subclasses the given parent window.  *
        !           169:  *               This handles the mouse tracking and rectangle updates.     *
        !           170:  *                                                                          *
        !           171:  ****************************************************************************/
        !           172: LONG  APIENTRY TrackingWndProc(
        !           173: HWND hwnd,
        !           174: DWORD msg,
        !           175: WPARAM wParam,
        !           176: LPARAM lParam)
        !           177: {
        !           178:     switch (msg) {
        !           179:     case WM_MOUSEMOVE:
        !           180:         {
        !           181:             RECT rcNow, rcTest;
        !           182: 
        !           183:             if (ptPrev.x == (short)LOWORD(lParam) && ptPrev.y == (short)HIWORD(lParam))
        !           184:                 return 0;
        !           185:             CopyRect(&rcNow, &rcTrack);
        !           186:             if (fsTrack & TF_LEFT)
        !           187:                 rcNow.left = (short)LOWORD(lParam) + rcDelta.left;
        !           188:             if (fsTrack & TF_RIGHT)
        !           189:                 rcNow.right = (short)LOWORD(lParam) + rcDelta.right;
        !           190:             if (fsTrack & TF_TOP)
        !           191:                 rcNow.top = (short)HIWORD(lParam) + rcDelta.top;
        !           192:             if (fsTrack & TF_BOTTOM)
        !           193:                 rcNow.bottom = (short)HIWORD(lParam) + rcDelta.bottom;
        !           194: 
        !           195:             if (rcNow.left > rcNow.right - cxMinTrack)
        !           196:                 if (fsTrack & TF_LEFT)
        !           197:                     rcNow.left = rcNow.right - cxMinTrack;
        !           198:                 else
        !           199:                     rcNow.right = rcNow.left + cxMinTrack;
        !           200: 
        !           201:             if (rcNow.top > rcNow.bottom - cyMinTrack)
        !           202:                 if (fsTrack & TF_TOP)
        !           203:                     rcNow.top = rcNow.bottom - cyMinTrack;
        !           204:                 else
        !           205:                     rcNow.bottom = rcNow.top + cyMinTrack;
        !           206: 
        !           207:             if (fsTrack & TF_ALLINBOUNDARY) {
        !           208:                 if ((fsTrack & TF_MOVE) == TF_MOVE) {
        !           209:                     IntersectRect(&rcTest, &rcNow, &rcBoundary);
        !           210:                     if (!EqualRect(&rcTest, &rcNow)) {
        !           211:                         if (rcNow.left < rcBoundary.left)
        !           212:                             OffsetRect(&rcNow, rcBoundary.left - rcNow.left, 0);
        !           213:                         if (rcNow.right > rcBoundary.right)
        !           214:                             OffsetRect(&rcNow, rcBoundary.right - rcNow.right, 0);
        !           215:                         if (rcNow.top < rcBoundary.top)
        !           216:                             OffsetRect(&rcNow, 0, rcBoundary.top - rcNow.top);
        !           217:                         if (rcNow.bottom > rcBoundary.bottom)
        !           218:                             OffsetRect(&rcNow, 0, rcBoundary.bottom - rcNow.bottom);
        !           219:                     }
        !           220:                 } else
        !           221:                     IntersectRect(&rcNow, &rcNow, &rcBoundary);
        !           222:             }
        !           223: 
        !           224:             if (EqualRect(&rcNow, &rcTrack))
        !           225:                 return 0;
        !           226: 
        !           227:             DrawTrackRect(hwnd, &rcTrack, &rcNow);
        !           228: 
        !           229:             CopyRect(&rcTrack, &rcNow);
        !           230:             MPOINT2POINT(MAKEMPOINT(lParam), ptPrev);
        !           231:         }
        !           232:         break;
        !           233: 
        !           234:     case WM_LBUTTONUP:
        !           235:         SendMessage(hwnd, WM_MOUSEMOVE, wParam, lParam);
        !           236:         PostMessage(hwnd, WM_QUIT, 0, 0);       // pop out of modal loop
        !           237:         return 0;
        !           238:         break;
        !           239: 
        !           240:     default:
        !           241:     return(DefWindowProc(hwnd, msg, wParam, lParam));
        !           242:         break;
        !           243:     }
        !           244:     return 0;
        !           245: }
        !           246: 
        !           247: 
        !           248: 

unix.superglobalmegacorp.com

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