一种通过鼠标操作实现多边形的绘制的实现方法

前面的《MFC基本图形的绘制()SDI中实现绘图操作》对多边形的绘制做了一个简单的介绍。尽管也实现了多边形的绘制,但那种方法有很大的局限性,最主要的就是表现在多边形的顶点(个数和位置)必须固定。通常在实际的项目中,多边形的顶点个数和位置并不固定。例如在进行道路计算时,可能会避开某些区域(规避区域),这样就需要在道路计算之前在地图中设置一个规避区域,该区域通常会是一个不规则的多边形,顶点个数和位置都不会固定不变。下面就介绍在MFC中这种多边行绘制的实现过程。(注:在实际的项目中可能会有单独的绘制引擎来实现多边形的绘制,那就另当别论,这里暂不理会) 

设计思路:

在菜单项中点击绘制多边形的命令后,在窗口中点击鼠标左键,每次点击的位置即为多边形的某个顶点,

第一次点击时,显示该点(可通过代码控制将点扩大并用颜色填充便于显示);

第二次点击时,界面上出现两个点,且第一个点为红色,第二个点(终点,当前点为蓝色),没有连线;

第三次点击时,第一个和第二个顶点连接,第一个(起点)和第三个(终点,当前点为蓝色)连接,组成一个多边形(三角形);

第四次点击时,第二个和第三个顶点连接(第一个和第二个顶点已连接),第一个(起点)和第四个(终点,当前点为蓝色)连接,组成一个多边形(四边形);

。。。 。。。

n次点击时,第n-2个和第n-1个顶点连接(第n-2个之前的顶点已连接),第一个(起点)和第n个(终点,当前点为蓝色)连接,组成一个多边形(n边形); 

点击鼠标右键时,将多边形的点数清零,便于后续绘制(否则多边形会累计增加边长) 

说明:上面就是归纳的用鼠标操作绘制多边形的方法。这里只能保证当前界面有效,绘制后隐藏界面绘制的内容可能会消失,这涉及到重绘和保存,这个会单独讨论。这里只关注绘制多变形的实现。

 

实现过程:

1.新建一个SDI APP,命名为 DrawPolygon

2.在View类的头文件中添加两个变量(含义见注释)

private:

int m_iPolyDotNumbers;//多边形顶点个数(边的个数)

CPoint m_ptPolyDotArrays[50];//存储多边形的顶点

 

涉及到鼠标左键和右键的消息处理。

3.根据类导向在View类中添加鼠标左键按下和鼠标右键按下的消息响应函数处理。

鼠标左键按下中添加代码: 

void CDrawPolygonView::OnLButtonDown(UINT nFlags, CPoint point)
{
ASSERT(m_iPolyDotNumbers<50);
CClientDC dc(this);
m_ptPolyDotArrays[m_iPolyDotNumbers]=point;
//下面的代码控制当前点击的点用蓝色填充
dc.Ellipse(m_ptPolyDotArrays[m_iPolyDotNumbers].x-2,m_ptPolyDotArrays[m_iPolyDotNumbers].y-2,m_ptPolyDotArrays[m_iPolyDotNumbers].x+2,m_ptPolyDotArrays[m_iPolyDotNumbers].y+2);
CRect rect(m_ptPolyDotArrays[m_iPolyDotNumbers].x-3,m_ptPolyDotArrays[m_iPolyDotNumbers].y-3,m_ptPolyDotArrays[m_iPolyDotNumbers].x+3,m_ptPolyDotArrays[m_iPolyDotNumbers].y+3);
CBrush brush(RGB(0,0,255));
dc.FillRect(rect,&brush);
 
++m_iPolyDotNumbers;
 
//下面的代码控制除当前点(最后一个点)以外的点用红色填充
for (int i=0;i<m_iPolyDotNumbers-1;i++)
{
dc.Ellipse(m_ptPolyDotArrays[i].x-2,m_ptPolyDotArrays[i].y-2,m_ptPolyDotArrays[i].x+2,m_ptPolyDotArrays[i].y+2);
CRect rect(m_ptPolyDotArrays[i].x-3,m_ptPolyDotArrays[i].y-3,m_ptPolyDotArrays[i].x+3,m_ptPolyDotArrays[i].y+3);
CBrush brush(RGB(255,0,0));
dc.FillRect(rect,&brush);
}
if (m_iPolyDotNumbers>2)
{
dc.Polygon(m_ptPolyDotArrays,m_iPolyDotNumbers);
}
 
CView::OnLButtonDown(nFlags, point);
}

鼠标右键按下添加代码(这个可以根据自己的设计,只是完成将多边形顶点个数清零便于重绘):

m_iPolyDotNumbers=0;

说明:这里只是完成了鼠标绘制的功能,当窗口被隐藏后,再次显示窗口绘制的多边形会消失,这涉及到图形的保存和重绘,后续再做总结。


  • 7
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

法哥2012

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值