windows-nt/Source/XPSP1/NT/shell/ext/shimgvw/seltrack.h
2020-09-26 16:20:57 +08:00

77 lines
2.4 KiB
C++

#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