#pragma once #include class CDropArrows : public CWindowImpl { public: CDropArrows() { m_bVertical = FALSE; m_nSpanLength = 0; } ~CDropArrows() { } DECLARE_WND_CLASS(_T( "DropArrows" )) protected: CBrush m_bshArrowBrush; CRgn m_rgnArrowRegion; BOOL m_bVertical; int m_nSpanLength; public: BOOL Create(HWND hWndParent, int nSpanLength, BOOL bVertical) { if (!m_bshArrowBrush.CreateSolidBrush(RGB(255, 0, 0))) return FALSE; m_bVertical = bVertical; m_nSpanLength = nSpanLength + 20; CRect area(0, 0, m_bVertical ? 12 : m_nSpanLength, m_bVertical ? m_nSpanLength : 12); if (CWindowImpl::Create(hWndParent, area, nullptr, WS_POPUP | WS_DISABLED, WS_EX_TOOLWINDOW) == nullptr) return FALSE; POINT ptArrow[7]; ptArrow[0].x = bVertical ? 8 : 0; ptArrow[0].y = bVertical ? 0 : 9; ptArrow[1].x = bVertical ? 8 : 4; ptArrow[1].y = bVertical ? 4 : 9; ptArrow[2].x = bVertical ? 11 : 4; ptArrow[2].y = bVertical ? 4 : 12; ptArrow[3].x = bVertical ? 6 : 10; ptArrow[3].y = bVertical ? 9 : 6; ptArrow[4].x = bVertical ? 1 : 4; ptArrow[4].y = bVertical ? 4 : 0; ptArrow[5].x = bVertical ? 4 : 4; ptArrow[5].y = bVertical ? 4 : 4; ptArrow[6].x = bVertical ? 4 : 0; ptArrow[6].y = bVertical ? 0 : 4; CRgn rgnFirstArrow; if (!rgnFirstArrow.CreatePolygonRgn(ptArrow, 7, ALTERNATE)) return FALSE; ptArrow[0].x = bVertical ? 4 : m_nSpanLength; ptArrow[0].y = bVertical ? m_nSpanLength : 4; ptArrow[1].x = bVertical ? 4 : m_nSpanLength - 4; ptArrow[1].y = bVertical ? m_nSpanLength - 4 : 4; ptArrow[2].x = bVertical ? 0 : m_nSpanLength - 4; ptArrow[2].y = bVertical ? m_nSpanLength - 4 : 0; ptArrow[3].x = bVertical ? 6 : m_nSpanLength - 10; ptArrow[3].y = bVertical ? m_nSpanLength - 10 : 6; ptArrow[4].x = bVertical ? 12 : m_nSpanLength - 4; ptArrow[4].y = bVertical ? m_nSpanLength - 4 : 12; ptArrow[5].x = bVertical ? 8 : m_nSpanLength - 4; ptArrow[5].y = bVertical ? m_nSpanLength - 4 : 9; ptArrow[6].x = bVertical ? 8 : m_nSpanLength; ptArrow[6].y = bVertical ? m_nSpanLength : 9; CRgn rgnSecondArrow; if (!rgnSecondArrow.CreatePolygonRgn(ptArrow, 7, ALTERNATE)) return FALSE; if (!m_rgnArrowRegion.CreateRectRgn(0, 0, bVertical ? 12 : nSpanLength, bVertical ? nSpanLength : 12)) return FALSE; m_rgnArrowRegion.CombineRgn(rgnFirstArrow, rgnSecondArrow, RGN_OR); SetWindowRgn(m_rgnArrowRegion, FALSE); return TRUE; } BOOL Show(CPoint point) { return IsWindow() ? SetWindowPos(nullptr, m_bVertical ? point.x - 7 : point.x - (m_nSpanLength / 2), m_bVertical ? point.y - (m_nSpanLength / 2) : point.y - 5, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_SHOWWINDOW | SWP_NOACTIVATE) : FALSE; } BOOL Hide() { return IsWindow() ? ShowWindow(SW_HIDE) : FALSE; } BEGIN_MSG_MAP_EX(CDropArrows) MSG_WM_DESTROY(OnDestroy) MSG_WM_ERASEBKGND(OnEraseBkgnd) END_MSG_MAP() void OnDestroy() { m_bshArrowBrush.DeleteObject(); m_rgnArrowRegion.DeleteObject(); } BOOL OnEraseBkgnd(HDC dc) { CDCHandle dcErase(dc); dcErase.FillRect(CRect(0, 0, m_bVertical ? 12 : m_nSpanLength, m_bVertical ? m_nSpanLength : 12), m_bshArrowBrush); return TRUE; } };