// Finds the index of the tab, which contains the given point. int IndexFromPoint(int x, int y, bool *inXbutton=nullptr) { Point point(x, y); Graphics graphics(hwnd); GraphicsPath shapes(data->Points, data->Types, data->Count); GraphicsPath shape; GraphicsPathIterator iterator(&shapes); iterator.NextMarker(&shape); ClientRect rClient(hwnd); REAL yPosTab = inTitlebar ? 0.0f : REAL(rClient.dy - height - 1); graphics.TranslateTransform(1.0f, yPosTab); for (int i = 0; i < Count(); i++) { Point pt(point); graphics.TransformPoints( CoordinateSpaceWorld, CoordinateSpaceDevice, &pt, 1); if (shape.IsVisible(pt, &graphics)) { iterator.NextMarker(&shape); if (inXbutton) *inXbutton = shape.IsVisible(pt, &graphics) ? true : false; return i; } graphics.TranslateTransform(REAL(width + 1), 0.0f); } if (inXbutton) *inXbutton = false; return -1; }
/** \brief Test to see if we hit this object with a mouse click * \param pos Click position * \returns true it hit */ bool CPolyDrawable::HitTest(Gdiplus::Point pos) { // Transform the points vector<Point> points; for (auto point : mPoints) { points.push_back(RotatePoint(point, mPlacedR) + mPlacedPosition); } GraphicsPath path; path.AddPolygon(&points[0], (int)points.size()); return path.IsVisible(pos) ? true : false; }