VC++开发GIS系统(186)线上加点之类的设计及实现

本文目录
  • 正文

前文 《VC++开发GIS系统(185)线上加点之核心函数实现》介绍了线上加点的核心实现函数,本文记录一下线上加点类的设计及实现。

类的定义

在_malaLines.h中定义线上加点的类,代码如下:

/*
*线上加点
*/
class malalinesdll CmalaLinesAddPoint :public CmalaMouseAction
{
public:
    CmalaLinesAddPoint(CView* mView, malaScreen *pScreen, CString &fileFullPath);
    virtual ~CmalaLinesAddPoint();
    void LButtonDown(UINT nFlags, malaPoint point);
    void LButtonUp(UINT nFlags, malaPoint point);
    void MouseMove(UINT nFlags, malaPoint point);
private:

    bool m_Selected;
    vector<malaPoint> mSLine;//选择的线
    malaLinePro mSLinePro;//选择的点的属性
    CmalaLinesSelect m_SelectLine;
    bool callSel;//控制是否触发选择线

    malaScreen *m_Screen;
    CString mPath;//文件路径
};
  • m_Selected 用来定义线是否被选中
  • mSLine 记录选择的线
  • mSLinePro 记录选择线的属性
  • m_SelectLine 一个选择线对象,用来选择线
  • callSel 控制是否触发选择线
  • *m_Screen 屏幕坐标变换变量
  • mPath 文件路径

类的实现

在_malaLines.cpp中实现上述类,代码如下:

/*
* 线上加点实现
*/
CmalaLinesAddPoint::CmalaLinesAddPoint(CView* mView, malaScreen *pScreen, CString &fileFullPath)
{
    mBaseView = mView;
    mPath = fileFullPath;
    m_Screen = pScreen;
    CmalaLinesSelect obj(mView, pScreen, fileFullPath);
    m_SelectLine = obj;
    m_Selected = FALSE;
    callSel = false;
}

CmalaLinesAddPoint::~CmalaLinesAddPoint()
{
    if (mSLine.size())
        mSLine.clear();
}

void CmalaLinesAddPoint::LButtonDown(UINT nFlags, malaPoint point)
{
    if (!m_Selected&&!callSel)
        m_SelectLine.LButtonDown(nFlags, point);
    if (m_Selected&&!callSel)
    {
        malaLogic cutlog;
        if (cutlog.addPointInLine(point, mSLine))
        {
            CLineIO lio;
            lio.lineUpdate(mSLine, mSLinePro, mPath);

            //绘制选中标志
            malaCDC cutcdc(mBaseView, *m_Screen);
            for (size_t k = 0; k < mSLine.size(); k++)
            {
                malaPointPro tpPointPro;
                tpPointPro.pointRadio = mSLinePro.lineWidth + 2;
                tpPointPro.pointColor = mSLinePro.lineColor;

                cutcdc.drawSelectRectPoint(mSLine[k], tpPointPro);
            }

            mSLine.clear();
            m_Selected = FALSE;
            m_SelectLine.m_Selected = FALSE;
            callSel = true;
        }

    }
}

void CmalaLinesAddPoint::LButtonUp(UINT nFlags, malaPoint point)
{
    if (!m_Selected&&!callSel)
        m_SelectLine.LButtonUp(nFlags, point);

    m_Selected = m_SelectLine.m_Selected;

    if (m_Selected)
    {
        this->mSLine = m_SelectLine.mLine;
        this->mSLinePro = m_SelectLine.mLinePro;
    }

}

void CmalaLinesAddPoint::MouseMove(UINT nFlags, malaPoint point)
{
    if (!m_Selected)
        m_SelectLine.MouseMove(nFlags, point);
}

文中调用的 addPointInLine 函数可以参考文章《VC++开发GIS系统(185)线上加点之核心函数实现

详细代码可以参考:GitHub

如您有疑问,可在文末留言,或到QQ群提问。

本站QQ群:291616564 麻辣GIS

微信公众号:malagis,扫描右边二维码直接关注。

微信捐助麻辣GIS 支付宝捐助麻辣GIS

如果本文对您有所帮助,欢迎对我们团队进行打赏捐助,让我们在传播3S的路上可以走得更远。


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

发表评论