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

简介:
源代码下载

      多边形也就是由一些连续的直线组成的,所以绘图的代码还是前面的画直线的那两种算法,只不过在鼠标移动的过程中要特别注意记录终点的位置而已,代码中还是存在着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,如需转载请自行联系原作者
目录
相关文章
【Qt 学习笔记】Qt常用控件 | 布局管理器 | 水平布局Horizontal Layout
【Qt 学习笔记】Qt常用控件 | 布局管理器 | 水平布局Horizontal Layout
842 2
|
Ubuntu 网络协议
Ubuntu 系统中网络总是断掉重新连接
Ubuntu 系统中网络总是断掉重新连接
636 5
QT圆形进度条(QT桌面项目光照强度检测)
QT圆形进度条(QT桌面项目光照强度检测)
599 0
|
6天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
17天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1320 7
|
5天前
|
存储 人工智能 Java
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
本文讲解 Prompt 基本概念与 10 个优化技巧,结合学术分析 AI 应用的需求分析、设计方案,介绍 Spring AI 中 ChatClient 及 Advisors 的使用。
297 129
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
|
4天前
|
监控 JavaScript Java
基于大模型技术的反欺诈知识问答系统
随着互联网与金融科技发展,网络欺诈频发,构建高效反欺诈平台成为迫切需求。本文基于Java、Vue.js、Spring Boot与MySQL技术,设计实现集欺诈识别、宣传教育、用户互动于一体的反欺诈系统,提升公众防范意识,助力企业合规与用户权益保护。