int CRectTracker::HitTestHandles(CPoint point) const { CRect rect; UINT mask = GetHandleMask(); // see if hit anywhere inside the tracker GetTrueRect(&rect); if (!rect.PtInRect(point)) return hitNothing; // totally missed // see if we hit a handle for (int i = 0; i < 8; ++i) { if (mask & (1<<i)) { GetHandleRect((TrackerHit)i, &rect); if (rect.PtInRect(point)) return (TrackerHit)i; } } // last of all, check for non-hit outside of object, between resize handles if ((m_nStyle & hatchedBorder) == 0) { CRect rect = m_rect; rect.NormalizeRect(); if ((m_nStyle & dottedLine|solidLine) != 0) rect.InflateRect(+1, +1); if (!rect.PtInRect(point)) return hitNothing; // must have been between resize handles } return hitMiddle; // no handle hit, but hit object (or object border) }
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; }
void CRectTracker::Draw(CDC* pDC) const { // set initial DC state VERIFY(pDC->SaveDC() != 0); pDC->SetMapMode(MM_TEXT); pDC->SetViewportOrg(0, 0); pDC->SetWindowOrg(0, 0); // get normalized rectangle CRect rect = m_rect; rect.NormalizeRect(); CPen* pOldPen = NULL; CBrush* pOldBrush = NULL; CGdiObject* pTemp; int nOldROP; // draw lines if ((m_nStyle & (dottedLine|solidLine)) != 0) { if (m_nStyle & dottedLine) pOldPen = pDC->SelectObject(CPen::FromHandle(blackDottedPen)); else pOldPen = (CPen*)pDC->SelectStockObject(BLACK_PEN); pOldBrush = (CBrush*)pDC->SelectStockObject(NULL_BRUSH); nOldROP = pDC->SetROP2(R2_COPYPEN); rect.InflateRect(+1, +1); // borders are one pixel outside pDC->Rectangle(rect.left, rect.top, rect.right, rect.bottom); pDC->SetROP2(nOldROP); } // if hatchBrush is going to be used, need to unrealize it if ((m_nStyle & (hatchInside|hatchedBorder)) != 0) UnrealizeObject(hatchBrush); // hatch inside if ((m_nStyle & hatchInside) != 0) { pTemp = pDC->SelectStockObject(NULL_PEN); if (pOldPen == NULL) pOldPen = (CPen*)pTemp; pTemp = pDC->SelectObject(CBrush::FromHandle(hatchBrush)); if (pOldBrush == NULL) pOldBrush = (CBrush*)pTemp; pDC->SetBkMode(TRANSPARENT); #ifndef _MAC nOldROP = pDC->SetROP2(R2_MASKNOTPEN); #else _MAC nOldROP = pDC->SetROP2(R2_MERGENOTPEN); #endif // _MAC pDC->Rectangle(rect.left+1, rect.top+1, rect.right, rect.bottom); pDC->SetROP2(nOldROP); } // draw hatched border if ((m_nStyle & hatchedBorder) != 0) { pTemp = pDC->SelectObject(CBrush::FromHandle(hatchBrush)); if (pOldBrush == NULL) pOldBrush = (CBrush*)pTemp; pDC->SetBkMode(OPAQUE); CRect rectTrue; GetTrueRect(&rectTrue); pDC->PatBlt(rectTrue.left, rectTrue.top, rectTrue.Width(), rect.top-rectTrue.top, 0x000F0001 /* Pn */); pDC->PatBlt(rectTrue.left, rect.bottom, rectTrue.Width(), rectTrue.bottom-rect.bottom, 0x000F0001 /* Pn */); pDC->PatBlt(rectTrue.left, rect.top, rect.left-rectTrue.left, rect.Height(), 0x000F0001 /* Pn */); pDC->PatBlt(rect.right, rect.top, rectTrue.right-rect.right, rect.Height(), 0x000F0001 /* Pn */); } // draw resize handles if ((m_nStyle & (resizeInside|resizeOutside)) != 0) { UINT mask = GetHandleMask(); for (int i = 0; i < 8; ++i) { if (mask & (1<<i)) { GetHandleRect((TrackerHit)i, &rect); pDC->FillSolidRect(rect, RGB(0, 0, 0)); } } } // cleanup pDC state if (pOldPen != NULL) pDC->SelectObject(pOldPen); if (pOldBrush != NULL) pDC->SelectObject(pOldBrush); VERIFY(pDC->RestoreDC(-1)); }
void CColorRectTracker::Draw(CDC* pDC) { // set initial DC state VERIFY(pDC->SaveDC() != 0); pDC->SetMapMode(MM_TEXT); pDC->SetViewportOrg(0, 0); pDC->SetWindowOrg(0, 0); // get normalized rectangle CRect rect = m_rect; rect.NormalizeRect(); CPen* pOldPen = NULL; CBrush* pOldBrush = NULL; CGdiObject* pTemp; int nOldROP; CPoint ptCenter = rect.CenterPoint(); int nCrossHairWH = rect.Width() < rect.Height() ? rect.Width()/4 : rect.Height()/4; if (nCrossHairWH > 20) nCrossHairWH = 20; if (nCrossHairWH < 4) nCrossHairWH = 0; // draw lines if ((m_nStyle & (dottedLine|solidLine)) != 0) { rect.InflateRect(+1, +1); // borders are one pixel outside pOldBrush = (CBrush*)pDC->SelectStockObject(NULL_BRUSH); nOldROP = pDC->SetROP2(R2_COPYPEN); pOldPen = pDC->SelectObject( &m_WhiteBoldPen ); pDC->Rectangle(rect.left, rect.top, rect.right, rect.bottom); if (nCrossHairWH > 0) { pDC->MoveTo(ptCenter.x-nCrossHairWH/2, ptCenter.y); pDC->LineTo(ptCenter.x+nCrossHairWH/2, ptCenter.y); pDC->MoveTo(ptCenter.x, ptCenter.y-nCrossHairWH/2); pDC->LineTo(ptCenter.x, ptCenter.y+nCrossHairWH/2); } if (m_nStyle & dottedLine) pDC->SelectObject(CPen::FromHandle(_afxBlackDottedPen)); else pDC->SelectStockObject(BLACK_PEN); pDC->Rectangle(rect.left, rect.top, rect.right, rect.bottom); if (nCrossHairWH > 0) { pDC->MoveTo(ptCenter.x-nCrossHairWH/2, ptCenter.y); pDC->LineTo(ptCenter.x+nCrossHairWH/2, ptCenter.y); pDC->MoveTo(ptCenter.x, ptCenter.y-nCrossHairWH/2); pDC->LineTo(ptCenter.x, ptCenter.y+nCrossHairWH/2); } pDC->SetROP2(nOldROP); } // if hatchBrush is going to be used, need to unrealize it if ((m_nStyle & (hatchInside|hatchedBorder)) != 0) UnrealizeObject(_afxHatchBrush); // hatch inside if ((m_nStyle & hatchInside) != 0) { pTemp = pDC->SelectStockObject(NULL_PEN); if (pOldPen == NULL) pOldPen = (CPen*)pTemp; pTemp = pDC->SelectObject(CBrush::FromHandle(_afxHatchBrush)); if (pOldBrush == NULL) pOldBrush = (CBrush*)pTemp; pDC->SetBkMode(TRANSPARENT); nOldROP = pDC->SetROP2(R2_MASKNOTPEN); pDC->Rectangle(rect.left+1, rect.top+1, rect.right, rect.bottom); pDC->SetROP2(nOldROP); } // draw hatched border if ((m_nStyle & hatchedBorder) != 0) { pTemp = pDC->SelectObject(CBrush::FromHandle(_afxHatchBrush)); if (pOldBrush == NULL) pOldBrush = (CBrush*)pTemp; pDC->SetBkMode(OPAQUE); CRect rectTrue; GetTrueRect(&rectTrue); pDC->PatBlt(rectTrue.left, rectTrue.top, rectTrue.Width(), rect.top-rectTrue.top, 0x000F0001 /* Pn */); pDC->PatBlt(rectTrue.left, rect.bottom, rectTrue.Width(), rectTrue.bottom-rect.bottom, 0x000F0001 /* Pn */); pDC->PatBlt(rectTrue.left, rect.top, rect.left-rectTrue.left, rect.Height(), 0x000F0001 /* Pn */); pDC->PatBlt(rect.right, rect.top, rectTrue.right-rect.right, rect.Height(), 0x000F0001 /* Pn */); } // draw resize handles if ((m_nStyle & (resizeInside|resizeOutside)) != 0) { UINT mask = GetHandleMask(); for (int i = 0; i < 8; ++i) { if (mask & (1<<i)) { GetHandleRect((TrackerHit)i, &rect); rect.InflateRect( +1, +1, +1, +1 ); pDC->FillSolidRect(rect, RGB(0xff, 0xff, 0xff)); rect.DeflateRect( +1, +1, +1, +1 ); pDC->FillSolidRect(rect, RGB(0, 0, 0)); } } } // cleanup pDC state if (pOldPen != NULL) pDC->SelectObject(pOldPen); if (pOldBrush != NULL) pDC->SelectObject(pOldBrush); VERIFY(pDC->RestoreDC(-1)); }