#ifndef _SELTRACK_H_ #define _SELTRACK_H_ // This file defines the class used to handle the selection rectangle // complete with resize handles BOOL InitSelectionTracking(); void CleanupSelectionTracking(); ///////////////////////////////////////////////////////////////////////////// // CSelectionTracker - simple rectangular tracking rectangle w/resize handles class CSelectionTracker { public: // Constructor / Destructor CSelectionTracker(); virtual ~CSelectionTracker(); BOOL Init(); // You must call Init after construction // Style Flags enum StyleFlags { solidLine = 1, dottedLine = 2, hatchedBorder = 4, resizeInside = 8, resizeOutside = 16, hatchInside = 32, lineSelection = 64 }; // Hit-Test codes enum TrackerHit { hitNothing = -1, hitTopLeft = 0, hitTopRight = 1, hitBottomRight = 2, hitBottomLeft = 3, hitTop = 4, hitRight = 5, hitBottom = 6, hitLeft = 7, hitMiddle = 8 }; // Attributes UINT m_uStyle; // current state CRect m_rect; // current position (always in pixels) CSize m_sizeMin; // minimum X and Y size during track operation int m_nHandleSize; // size of resize handles (default from WIN.INI) // Operations void Draw(HDC hdc) const; void GetTrueRect(LPRECT lpTrueRect) const; BOOL SetCursor(HWND hwnd, LPARAM lParam) const; BOOL Track(HWND hwnd, CPoint point, BOOL bAllowInvert = FALSE, HWND hwndClipTo = NULL); BOOL TrackRubberBand(HWND hwnd, CPoint point, BOOL bAllowInvert = TRUE); int HitTest(CPoint point) const; int NormalizeHit(int nHandle) const; private: BOOL _bAllowInvert; // flag passed to Track or TrackRubberBand CRect _rectLast; CSize _sizeLast; CSize _sizeMin; BOOL _bErase; // TRUE if _DrawTrackerRect is called for erasing BOOL _bFinalErase; // TRUE if _DragTrackerRect called for final erase // implementation helpers void _DrawTrackerRect(LPCRECT lpRect, HWND hwndClipTo, HDC hdc, HWND hwnd); void _AdjustRect(int nHandle, LPRECT lpRect); void _OnChangedRect(const CRect& rectOld); UINT _GetHandleMask() const; int _HitTestHandles(CPoint point) const; void _GetHandleRect(int nHandle, CRect* pHandleRect) const; void _GetModifyPointers(int nHandle, int** ppx, int** ppy, int* px, int*py); int _GetHandleSize(LPCRECT lpRect = NULL) const; BOOL _TrackHandle(int nHandle, HWND hwnd, CPoint point, HWND hwndClipTo); void _DrawDragRect(HDC hdc, LPCRECT lpRect, SIZE size, LPCRECT lpRectLast, SIZE sizeLast); }; #endif