VC++开发GIS系统(29)关于鼠标左键的联想1

从写这个教程至今已经有了一段时间了,今天在这里说一点闲话,以及之后的想法。首先你看到的这个教程的整个过程就是当年我们组的人(团队的成员有:张铁映 陈锐 黄婷婷 李岂伍 陆川伟 缪玲珑 姚瑶 尹全超)参加@万波老师的地理信息系统工程的时候的所做的东西,教程的思路也就是我们当年所进行的思路,如果你从教程1一直看到现在,可能我要对你说一声sorry,因为这个过程并不是我们的系统所设计的全部,而是我们的一个尝试。当然这也不是毫无意义的,正是这些尝试,使我们掌握了关于VC++开发的基础知识,所以前面这些教程(1-28)算是一个基础,也希望看到此的你能有所收获。

为什么今天会有这么一个教程29呢?

这也是当时我们开发到此的时候遇到的一个问题,大家可以看到在之前的文章中,我一直在画点,并且用到的是鼠标左键。这个左键有什么问题呢?

不知道大学之前有没用过ArcGIS或者MapGIS,甚至其他任何图形类的软件,你会发现,这个左键用的太TM频繁了!画点要用,选择点要用,移动点要用,复制点要用;画线要用,选择线要用,移动线要用,复制线要用,删除线也要用...如果没了鼠标左键,世界会怎样?软件会怎样?几乎不能用啊!!!

可为什么要担心呢?

相信看到这篇文章,大家应该都写过VC++或者MFC的程序吧,一定应该大约知道一点关于docment和view吧。像我这样写代码的水平(当然不高),我喜欢把所有有关图形显示的东西view里,与鼠标左键的东西也都是写在view里的OnLButtonDown函数。下面是我之前画点的示例代码:

void CMalaGISView::OnLButtonDown(UINT nFlags, CPoint point)
{
    // TODO:  在此添加消息处理程序代码和/或调用默认值
    if (curMod == "drawpoint")
    {
        CClientDC dc(this);
        
        //画方形的点
        LOGBRUSH log;
        log.lbColor = 0;
        log.lbStyle = BS_SOLID;
        
        CPen pen(PS_GEOMETRIC | PS_DASH, 5, &log);
        CPen *oldPen = dc.SelectObject(&pen);
        dc.Rectangle(CRect(CPoint(point.x - 60, point.y - 60), CPoint(point.x + 60, point.y + 60)));
        dc.SelectObject(oldPen);
        pen.DeleteObject();
    }
    CView::OnLButtonDown(nFlags, point);
}

这里为了标记是画点,我使用的方法是这样的:

if (curMod == "drawpoint")
{
  //画点
}

可是如果多了怎么处理呢?如果按照之前的方法应该是这样的:

if (curMod == "drawpoint")
{
  //画点
}
if (curMod == "drawline")
{
  //画线
}
if (curMod == "drawarea")
{
  //画面
}
if (curMod == "drawtext")
{
  //画注释
}
if (curMod == "drawselectpoint")
{
  //选择点
}
......

理论是可行的,但是这种方式会对后期的程序维护开发工作造成灾难,说大一点,也就是软件危机,那怎样解决这个问题呢?

针对这种级别的程序,可以用面向对象的方法,具体参考下篇文章,本文暂时就到这里。

VC++开发GIS系统(28)关于VC++的CBrush类 VC++开发GIS系统(30)关于鼠标左键的联想2(C++中的类和对象)

作者:,GIS爱好者。
分享本文,请您带上本文链接
分享到:

发表评论