BOOL CRectTracker::SetCursor(CWnd* pWnd, UINT nHitTest) const { // trackers should only be in client area if (nHitTest != HTCLIENT) return FALSE; // convert cursor position to client co-ordinates CPoint point; GetCursorPos(&point); pWnd->ScreenToClient(&point); // do hittest and normalize hit int nHandle = HitTestHandles(point); if (nHandle < 0) return FALSE; // need to normalize the hittest such that we get proper cursors nHandle = NormalizeHit(nHandle); // handle special case of hitting area between handles // (logically the same -- handled as a move -- but different cursor) if (nHandle == hitMiddle && !m_rect.PtInRect(point)) { // only for trackers with hatchedBorder (ie. in-place resizing) if (m_nStyle & hatchedBorder) nHandle = (TrackerHit)9; } ASSERT(nHandle < _countof(rghCursors)); ::SetCursor(rghCursors[nHandle]); return TRUE; }
BOOL CAxRectTracker::Track(CWnd* pWnd, CPoint point, BOOL bAllowInvert, CWnd* pWndClipTo) { // perform hit testing on the handles int nHandle = HitTestHandles(point); if (nHandle < 0) { // didn't hit a handle, so just return FALSE return FALSE; } // otherwise, call helper function to do the tracking m_bAllowInvert = bAllowInvert; return TrackHandle(nHandle, pWnd, point, pWndClipTo); }
int CAxRectTracker::HitTest(CPoint point) const { TrackerHit hitResult = hitNothing; CRect rectTrue; GetTrueRect(&rectTrue); ASSERT(rectTrue.left <= rectTrue.right); ASSERT(rectTrue.top <= rectTrue.bottom); if (rectTrue.PtInRect(point)) { if ((m_nStyle & (resizeInside|resizeOutside)) != 0) hitResult = (TrackerHit)HitTestHandles(point); else hitResult = hitMiddle; } return hitResult; }