VC++如何实现类似CAD、PS等软件多边形拖拉拽绘制功能

发布于:2025-03-01 ⋅ 阅读:(126) ⋅ 点赞:(0)

void GjyPolygon::Initial()
{
    CUnit::Initial();
    m_PointList = new CArray < CPoint, CPoint > ;
}

void GjyPolygon::DrawStatic(CDC *pDC)
{
    CPen m_pen;
    CBrush m_brush;
    int oldDrawingMode = pDC->SetROP2(this->m_DrawingMode);
    m_pen.CreatePen(m_PenStyle, m_PenWidth, m_PenColor);
    CPen* pen = (CPen*)pDC->SelectObject(&m_pen);
    LOGBRUSH brushlog;
    brushlog.lbColor = m_BrushColor;
    brushlog.lbHatch = m_BrushHatch;
    brushlog.lbStyle = m_BrushStyle;

    m_brush.CreateBrushIndirect(&brushlog);

    CBrush*brush = (CBrush*)pDC->SelectObject(&m_brush);

    int OldBkMode = pDC->SetBkMode(m_BkMode);
    COLORREF OldColor = pDC->SetBkColor(m_BackgroundColor);
    m_FirstPoint = m_PointList->GetAt(0);
    pDC->MoveTo(m_FirstPoint);
    for (int i = 0; i < m_PointList->GetSize(); i++)
    {
        pDC->LineTo(m_PointList->GetAt(i));
    }
    pDC->LineTo(m_PointList->GetAt(0));
    pDC->SelectObject(brush);
    pDC->SelectObject(pen);
    pDC->SetBkMode(OldBkMode);
    pDC->SetBkColor(OldColor);
    pDC->SetROP2(oldDrawingMode);
}

void GjyPolygon::DrawMask(CDC *pDC, CPoint point)
{
    CPen m_pen;
    CBrush m_brush;
    //int oldDrawingMode=pDC->SetROP2(this->m_DrawingMode);
    m_pen.CreatePen(m_PenStyle, m_PenWidth, m_PenColor);
    CPen* pen = (CPen*)pDC->SelectObject(&m_pen);
    LOGBRUSH brushlog;
    brushlog.lbColor = m_BrushColor;
    brushlog.lbHatch = m_BrushHatch;
    brushlog.lbStyle = m_BrushStyle;

    m_brush.CreateBrushIndirect(&brushlog);

    CBrush*brush = (CBrush*)pDC->SelectObject(&m_brush);

    int OldBkMode = pDC->SetBkMode(m_BkMode);
    COLORREF OldColor = pDC->SetBkColor(m_BackgroundColor);
    pDC->MoveTo(m_PointList->GetAt(m_PointList->GetSize() - 1));
    pDC->LineTo(point);
    pDC->SelectObject(brush);
    pDC->SelectObject(pen);
    pDC->SetBkMode(OldBkMode);
    pDC->SetBkColor(OldColor);
    //pDC->SetROP2(oldDrawingMode);

}

GjyPolygon::GjyPolygon()
{
    Initial();
}

void GjyPolygon::DrawEnd(CDC*pDC, CPoint point)
{
    CPen m_pen;
    CBrush m_brush;
    int oldDrawingMode = pDC->SetROP2(this->m_DrawingMode);
    m_pen.CreatePen(m_PenStyle, m_PenWidth, m_PenColor);
    CPen* pen = (CPen*)pDC->SelectObject(&m_pen);
    LOGBRUSH brushlog;
    brushlog.lbColor = m_BrushColor;
    brushlog.lbHatch = m_BrushHatch;
    brushlog.lbStyle = m_BrushStyle;

    m_brush.CreateBrushIndirect(&brushlog);

    CBrush*brush = (CBrush*)pDC->SelectObject(&m_brush);

    int OldBkMode = pDC->SetBkMode(m_BkMode);
    COLORREF OldColor = pDC->SetBkColor(m_BackgroundColor);
    pDC->MoveTo(point);
    pDC->LineTo(m_PointList->GetAt(0));
    pDC->SelectObject(brush);
    pDC->S