home *** CD-ROM | disk | FTP | other *** search
- /****************************************************************************
-
- PROGRAM: Select.c
-
- PURPOSE: Contains library routines for selecting a region
-
- FUNCTIONS:
-
- StartSelection(HWND, POINT, LPRECT, int) - begin selection area
- UpdateSelection(HWND, POINT, LPRECT, int) - update selection area
- EndSelection(POINT, LPRECT) - end selection area
- ClearSelection(HWND, LPRECT, int) - clear selection area
-
- *******************************************************************************/
-
- #include "windows.h"
- #include "select.h"
-
- extern BOOL bTrack, bMove, bMoving;
-
- /****************************************************************************
-
- FUNCTION: StartSelection(HWND, POINT, LPRECT, int)
-
- PURPOSE: Begin selection of region
-
- ****************************************************************************/
-
-
- POINT Center, DragPoint, ZoomDim;
-
- void FAR PASCAL StartSelection(hWnd, ptCurrent, lpSelectRect, fFlags)
- HWND hWnd;
- POINT ptCurrent;
- LPRECT lpSelectRect;
- int fFlags;
- {
- if (lpSelectRect->left != lpSelectRect->right ||
- lpSelectRect->top != lpSelectRect->bottom)
- ClearSelection(hWnd, lpSelectRect, fFlags);
-
- lpSelectRect->right = ptCurrent.x;
- lpSelectRect->bottom = ptCurrent.y;
-
- /* If you are extending the box, then invert the current rectangle */
-
- if ((fFlags & SL_SPECIAL) == SL_EXTEND)
- ClearSelection(hWnd, lpSelectRect, fFlags);
-
- /* Otherwise, set origin to current location */
-
- else {
- lpSelectRect->left = ptCurrent.x;
- lpSelectRect->top = ptCurrent.y;
- Center = ptCurrent;
- }
- SetCapture(hWnd);
- }
-
- extern int xdots, ydots;
-
- /****************************************************************************
-
- FUNCTION: UpdateSelection(HWND, POINT, LPRECT, int) - update selection area
-
- PURPOSE: Update selection
-
- ****************************************************************************/
-
- void FAR PASCAL UpdateSelection(hWnd, ptCurrent, lpSelectRect, fFlags)
- HWND hWnd;
- POINT ptCurrent;
- LPRECT lpSelectRect;
- int fFlags;
- {
- HDC hDC;
- short OldROP;
- POINT NewDim, NewPoint;
- unsigned ScaledY;
-
- hDC = GetDC(hWnd);
-
- switch (fFlags & SL_TYPE) {
-
- case SL_BOX:
- OldROP = SetROP2(hDC, R2_NOTXORPEN);
- MoveTo(hDC, lpSelectRect->left, lpSelectRect->top);
- LineTo(hDC, lpSelectRect->right, lpSelectRect->top);
- LineTo(hDC, lpSelectRect->right, lpSelectRect->bottom);
- LineTo(hDC, lpSelectRect->left, lpSelectRect->bottom);
- LineTo(hDC, lpSelectRect->left, lpSelectRect->top);
-
- LineTo(hDC, ptCurrent.x, lpSelectRect->top);
- LineTo(hDC, ptCurrent.x, ptCurrent.y);
- LineTo(hDC, lpSelectRect->left, ptCurrent.y);
- LineTo(hDC, lpSelectRect->left, lpSelectRect->top);
- SetROP2(hDC, OldROP);
- break;
-
- case SL_BLOCK:
- PatBlt(hDC,
- lpSelectRect->left,
- lpSelectRect->bottom,
- lpSelectRect->right - lpSelectRect->left,
- ptCurrent.y - lpSelectRect->bottom,
- DSTINVERT);
- PatBlt(hDC,
- lpSelectRect->right,
- lpSelectRect->top,
- ptCurrent.x - lpSelectRect->right,
- ptCurrent.y - lpSelectRect->top,
- DSTINVERT);
- break;
-
- /* MCP 6-3-92 */
- case (SL_ZOOM):
- OldROP = SetROP2(hDC, R2_NOTXORPEN);
- MoveTo(hDC, lpSelectRect->left, lpSelectRect->top);
- LineTo(hDC, lpSelectRect->right, lpSelectRect->top);
- LineTo(hDC, lpSelectRect->right, lpSelectRect->bottom);
- LineTo(hDC, lpSelectRect->left, lpSelectRect->bottom);
- LineTo(hDC, lpSelectRect->left, lpSelectRect->top);
-
- if(bTrack)
- {
- NewPoint = ptCurrent;
-
- NewDim.x = Center.x - NewPoint.x;
- if(NewDim.x < 0)
- NewDim.x = -NewDim.x;
-
- NewDim.y = Center.y - NewPoint.y;
- if(NewDim.y < 0)
- NewDim.y = -NewDim.y;
-
- ScaledY = (unsigned)(((long)NewDim.y) * xdots / ydots);
- if(NewDim.x < ScaledY)
- NewDim.x = ScaledY;
- else
- NewDim.y = (unsigned)(((long)NewDim.x) * ydots / xdots);
-
- if(NewDim.x < 2)
- NewDim.x = 2;
- if(NewDim.y < 2)
- NewDim.y = 2;
-
- ZoomDim = NewDim;
- }
- else if(bMoving)
- {
- Center.x += ptCurrent.x - DragPoint.x;
- Center.y += ptCurrent.y - DragPoint.y;
- DragPoint = ptCurrent;
- }
-
- lpSelectRect->left = Center.x - ZoomDim.x;
- lpSelectRect->right = Center.x + ZoomDim.x;
- lpSelectRect->bottom = Center.y + ZoomDim.y;
- lpSelectRect->top = Center.y - ZoomDim.y;
-
- MoveTo(hDC, lpSelectRect->left, lpSelectRect->top);
- LineTo(hDC, lpSelectRect->right, lpSelectRect->top);
- LineTo(hDC, lpSelectRect->right, lpSelectRect->bottom);
- LineTo(hDC, lpSelectRect->left, lpSelectRect->bottom);
- LineTo(hDC, lpSelectRect->left, lpSelectRect->top);
- SetROP2(hDC, OldROP);
- ReleaseDC(hWnd, hDC);
- return;
- }
- lpSelectRect->right = ptCurrent.x;
- lpSelectRect->bottom = ptCurrent.y;
- ReleaseDC(hWnd, hDC);
- }
-
- /****************************************************************************
-
- FUNCTION: EndSelection(POINT, LPRECT)
-
- PURPOSE: End selection of region, release capture of mouse movement
-
- ****************************************************************************/
-
- void FAR PASCAL EndSelection(ptCurrent, lpSelectRect)
- POINT ptCurrent;
- LPRECT lpSelectRect;
- {
- if(!bMove)
- {
- lpSelectRect->right = ptCurrent.x;
- lpSelectRect->bottom = ptCurrent.y;
- }
- ReleaseCapture();
- }
-
- /****************************************************************************
-
- FUNCTION: ClearSelection(HWND, LPRECT, int) - clear selection area
-
- PURPOSE: Clear the current selection
-
- ****************************************************************************/
-
- void FAR PASCAL ClearSelection(hWnd, lpSelectRect, fFlags)
- HWND hWnd;
- LPRECT lpSelectRect;
- int fFlags;
- {
- HDC hDC;
- short OldROP;
-
- hDC = GetDC(hWnd);
- switch (fFlags & SL_TYPE) {
-
- /* MCP 6-3-92 */
- case (SL_ZOOM):
- case SL_BOX:
- OldROP = SetROP2(hDC, R2_NOTXORPEN);
- MoveTo(hDC, lpSelectRect->left, lpSelectRect->top);
- LineTo(hDC, lpSelectRect->right, lpSelectRect->top);
- LineTo(hDC, lpSelectRect->right, lpSelectRect->bottom);
- LineTo(hDC, lpSelectRect->left, lpSelectRect->bottom);
- LineTo(hDC, lpSelectRect->left, lpSelectRect->top);
- SetROP2(hDC, OldROP);
- break;
-
- case SL_BLOCK:
- PatBlt(hDC,
- lpSelectRect->left,
- lpSelectRect->top,
- lpSelectRect->right - lpSelectRect->left,
- lpSelectRect->bottom - lpSelectRect->top,
- DSTINVERT);
- break;
-
- }
- ReleaseDC(hWnd, hDC);
- }
-