【MapGIS二次开发】丁字线(T字线)的绘制

  在做MapGIS二次开发的过程中经常遇到一些问题,在网上搜的过程中发现关于MapGIS二次开发的文章非常少,因此打算慢慢将自己做二次开发的一些经验分享在博客里,供有需要的朋友参考,用不着的童鞋可以绕道了~~

  利用MapGIS作图过程中经常要用到丁字线或十字线来描述一些特定的地理标识,MapGIS中要作上述的线型需要手工拖拽两根或者数根直线连接,并且精确度不高,因此可以在二次开发过程中加入快速添加类似丁字线等线型的功能,对于作图人员来说这是很方便的。

  就拿简单的丁字线来做示范,实现思路其实很简单,就是先取得鼠标左键按下时点的坐标,然后取得左键松开时点的坐标,将这两个点坐标进行简单的加减运算得出丁字线的四个点坐标,再调用_AppendLin函数将线加入到工作区中即可。具体代码示例如下:

  鼠标左键按下的响应事件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void CMyPrjEditView::OnLButtonDown(UINT nFlags, CPoint point)
{
    StartX  = point.x;    //获得起点横坐标
    StartY  = point.y;    //获得起点纵坐标
    EndX    = point.x;
    EndY    = point.y;
    FlgSetCapture = 1;
    if(m_bLinToArea)
    {
        if(m_dat==NULL)
            m_dat = new D_DOT[2];
        if(m_dat1==NULL)
            m_dat1 = new D_DOT[2];
        _WpToLp(&point, &m_dat[0]);    //屏幕坐标转化为工作区坐标
    }
    CPrjEditView::OnLButtonDown(nFlags, point);
}

  鼠标移动的响应事件:

1
2
3
4
5
6
7
8
void CMyPrjEditView::OnMouseMove(UINT nFlags, CPoint point)
{
    _DrawXORRect(StartX, StartY, EndX, EndY);
    EndX = point.x;
    EndY = point.y;
    _DrawXORRect(StartX, StartY, EndX, EndY);   //画一个矩形范围表示丁字线的范围
    CPrjEditView::OnMouseMove(nFlags, point);
}

  鼠标左键松开时的响应事件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
void CMyPrjEditView::OnLButtonUp(UINT nFlags, CPoint point)
{
    LIN_INFO        inf;        //横线
    LIN_INFO        inf1;       //竖线
    Ai=GetCurrentLinArea();
    FlgSetCapture = 0;
    if(m_bLinToArea)
    {
        _WpToLp(&point, &m_dat[1]);     //屏幕坐标转化为工作区坐标
        _WpToLp(&point, &m_dat1[1]);
        m_dat[1].y=m_dat[0].y;
        memset(&inf, 0, sizeof(LIN_INFO));
        inf.lclr    = 0;
        inf.lw  = 0.5;
        inf.ltp = 1;
        inf.lclass=1;                       //初始线结构体
        _AppendLin(Ai, m_dat, 2, &inf, 2);  //向工作区中添加横线
        m_dat1[0].x=(m_dat[0].x+m_dat[1].x)/2;
        m_dat1[0].y=m_dat[0].y;
        m_dat1[1].x=m_dat1[0].x;
        memset(&inf1, 0, sizeof(LIN_INFO));
        inf1.lclr   = 0;
        inf1.lw = 0.5;
        inf1.ltp    = 1;
        inf1.lclass=1;
        _AppendLin(Ai, m_dat1, 2, &inf1, 2);    //向工作区中添加竖线
        if(m_dat!=NULL)
        {
            delete [2] m_dat;
            m_dat = NULL;
        }
        if(m_dat1!=NULL)
        {
            delete [2] m_dat1;
            m_dat1 = NULL;
        }
        _UpdateWindow();                    //更新工作区窗口显示线
    }
    CPrjEditView::OnLButtonUp(nFlags, point);
}

  由这个功能的实现你可以延伸出更多的功能实现,比如十字线、贝塞尔曲线等等,加上这些简单实用的小工具,你的二次开发软件肯定会比原MapGIS更容易得到编图人员的青睐~~~