/**************************************************************************** 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 int xco, yco, xco_sto, yco_sto; extern int dHeight, dWidth; extern unsigned char rvenster_xrb, rvenster_ylo; /**************************************************************************** FUNCTION: StartSelection(HWND, POINT, LPRECT, int) PURPOSE: Begin selection of region ****************************************************************************/ void StartSelection(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; xco = ptCurrent.x / dWidth + 1; yco = ptCurrent.y / dHeight + 1; if (xco > rvenster_xrb) xco = rvenster_xrb; if (yco > rvenster_ylo) yco = rvenster_ylo; if (xco <1) xco = 1; if (yco <1) yco = 1; /* 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; } SetCapture(hWnd); } /**************************************************************************** FUNCTION: UpdateSelection(HWND, POINT, LPRECT, int) - update selection area PURPOSE: Update selection ****************************************************************************/ void UpdateSelection(HWND hWnd, POINT ptCurrent, LPRECT lpSelectRect, int fFlags) { HDC hDC; short OldROP; 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; } lpSelectRect->right = ptCurrent.x; lpSelectRect->bottom = ptCurrent.y; xco_sto = ptCurrent.x / dWidth + 1; yco_sto = ptCurrent.y / dHeight + 1; if (xco_sto >rvenster_xrb) xco_sto = rvenster_xrb; if (yco_sto >rvenster_ylo) yco_sto = rvenster_ylo; if (xco_sto <1) xco_sto = 1; if (yco_sto <1) yco_sto = 1; ReleaseDC(hWnd, hDC); } /**************************************************************************** FUNCTION: EndSelection(POINT, LPRECT) PURPOSE: End selection of region, release capture of mouse movement ***************************************************************************/ void EndSelection(POINT ptCurrent, LPRECT lpSelectRect) { lpSelectRect->right = ptCurrent.x; lpSelectRect->bottom = ptCurrent.y; ReleaseCapture(); } /**************************************************************************** FUNCTION: ClearSelection(HWND, LPRECT, int) - clear selection area PURPOSE: Clear the current selection ****************************************************************************/ void ClearSelection(HWND hWnd, LPRECT lpSelectRect, int fFlags) { HDC hDC; short OldROP; 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); 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); }