画图板---画多边形代码

源代码下载

      多边形也就是由一些连续的直线组成的,所以绘图的代码还是前面的画直线的那两种算法,只不过在鼠标移动的过程中要特别注意记录终点的位置而已,代码中还是存在着bug,画多边形的时候出现了黄色的阴影线,真是奇怪的问题。为了判别是否是多边形的第一条边,加入了一个新变量:bool m_bIsFirstDone;//是否第一条边

void CMyDrawView::OnMouseMove(UINT nFlags, CPoint point) 
{
    // TODO: Add your message handler code here and/or call default
    
    CString str;
    CDC *pDC=GetDC();

    //状态栏显示坐标值
    str.Format("X:%d,Y:%d",point.x,point.y);
    if(!m_pwndStatusBar)
        m_pwndStatusBar=((CMainFrame*)AfxGetMainWnd())->GetStatusBar();
    m_pwndStatusBar->SetPaneText(2,str,1);

    if(m_dsDrawSort==dsNULL)
        return;
    switch(m_dsDrawSort)
    {
    case dsLine:
        SetCursor(m_hDLCursor);
        break;
    case dsCircle:
        SetCursor(m_hDCCursor);
        break;
    }

    //鼠标放开了
    if(!m_bIsMoseDown)
        return;
    
    pDC->SetROP2(R2_NOTXORPEN);

    switch(m_dsDrawSort)
    {
    case dsLine:
        {//直线
            Line *l1 = new Line(m_startPoint,m_endPoint);
            l1->SetDrawLineSort(m_dlsDrawLineSort);
            l1->SetPenColor(m_lPenColor);
            Line *l2 = new Line(m_startPoint,point);
            l2->SetDrawLineSort(m_dlsDrawLineSort);
            l2->SetPenColor(m_lPenColor);
            l1->Draw(pDC);
            l2->Draw(pDC);
            break;
        }
    case dsCircle:
        {//圆
            Line *l1 = new Line(m_startPoint,m_endPoint);
            l1->SetDrawLineSort(m_dlsDrawLineSort);
            l1->SetPenColor(m_lPenColor);
            Line *l2 = new Line(m_startPoint,point);
            l2->SetDrawLineSort(m_dlsDrawLineSort);
            l2->SetPenColor(m_lPenColor);
            l1->Draw(pDC);
            l2->Draw(pDC);

            Circle *c1 = new Circle(m_startPoint,Distance(m_startPoint,m_endPoint));
            c1->SetPenColor(m_lPenColor);
            c1->Draw(pDC);
            Circle *c2 = new Circle(m_startPoint,Distance(m_startPoint,point));
            c2->SetPenColor(m_lPenColor);
            c2->Draw(pDC);
            
            break;
        }
    case dsPolyGon:
        {//折线
            Line *l1 = new Line(m_startPoint,m_endPoint);
            l1->SetDrawLineSort(m_dlsDrawLineSort);
            l1->SetPenColor(m_lPenColor);
            Line *l2 = new Line(m_startPoint,point);
            l2->SetDrawLineSort(m_dlsDrawLineSort);
            l2->SetPenColor(m_lPenColor);
            l1->Draw(pDC);
            l2->Draw(pDC);
            break;
        }

    }

    m_endPoint=point;//记录下终点,时刻刷新最后的点
    ReleaseDC(pDC);
    CView::OnMouseMove(nFlags, point);
}

void CMyDrawView::OnLButtonUp(UINT nFlags, CPoint point) 
{
    // TODO: Add your message handler code here and/or call default

    m_bIsMoseDown=FALSE;//鼠标未按下
    if(m_dsDrawSort==dsNULL)
        return;

    CDC *pDC=GetDC();
    Line lTemp;
    switch(m_dsDrawSort)
    {
    case dsLine:
    case dsPolyGon:
        {//画直线或折线
            Line *pL1 = new Line(m_startPoint,point);
            pL1->SetDrawLineSort(m_dlsDrawLineSort);
            pL1->SetPenColor(m_lPenColor);
            pL1->Draw(pDC);
    
            lTemp.SetStartPoint(m_startPoint);//设置起点
            lTemp.SetEndPoint(point);//设置终点
            lTemp.SetDrawLineSort(m_dlsDrawLineSort);//设置画直线方式
            lTemp.SetPenColor(m_lPenColor);//设置画笔颜色
            m_listAllLines.push_back(lTemp);//保存此直线
            if(m_dsDrawSort==dsPolyGon)
            {
                m_startPoint = point;//把鼠标up的那一点作为新的起点
                if(!m_bIsFirstDone)
                {//第一条边完成
                    m_bIsFirstDone=TRUE;
                }
            }
            SetCursor(m_hDLCursor);
            break;
        }
    case dsCircle:
        {//画圆
            Circle cTemp;
            double radius = Distance(m_startPoint,point);//计算半径大小
            Circle *pC1 = new Circle(m_startPoint,radius);
            pC1->SetPenColor(m_lPenColor);
            pC1->Draw(pDC);

            cTemp.SetRadis(radius);//设置半径
            cTemp.SetMidPoint(m_startPoint);//设置圆心
            cTemp.SetPenColor(m_lPenColor);//设置画笔颜色
            m_listAllCircles.push_back(cTemp);//保存此圆

            pDC->SetROP2(R2_NOTXORPEN);//Pixel is the inverse of the R2_XORPEN color (final pixel = NOT(pen XOR screen pixel)). 
            Line *pL1 = new Line(m_startPoint,point);
            pL1->SetPenColor(m_lPenColor);
            pL1->Draw(pDC);
            SetCursor(m_hDCCursor);
            break;
        }
    }
    ReleaseDC(pDC);
    CView::OnLButtonUp(nFlags, point);
}

void CMyDrawView::OnLButtonDown(UINT nFlags, CPoint point) 
{
    // TODO: Add your message handler code here and/or call default
    m_bIsMoseDown=TRUE;//鼠标按下了
    if(m_dsDrawSort==dsNULL)//画图类型未选择
        return;
    CDC *pDC=GetDC();
    pDC->SetROP2(R2_NOTXORPEN);
    
    Line lTemp;

    if(m_dsDrawSort==dsPolyGon && m_bIsFirstDone)
    {
        Line *pL1 = new Line(m_startPoint,point);
        pL1->Draw(pDC);

        lTemp.SetStartPoint(m_startPoint);
        lTemp.SetEndPoint(point);
        m_listAllLines.push_back(lTemp);
    }

200772902.jpg


本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2007/07/29/835394.html,如需转载请自行联系原作者