zoukankan      html  css  js  c++  java
  • mfc数轴实现

      1 #pragma once
      2 #include <afxwin.h>
      3 #include <memory>
      4 #include "project_scjd/YwEmpDataControl.h"
      5 #include "cg/fyq_interpreter.h"
      6 #include "cg/File_TbCatalog2017.h"
      7 class CFyqEntity;
      8 class CRuleNodeEntity;
      9 class CPositionNodeEntity;
     10 class CArrowEntity;
     11 class CNodeEntity;
     12 typedef shared_ptr<CFyqEntity>      EntityPtr;
     13 typedef shared_ptr<CRuleNodeEntity>     RuleNodePtr;
     14 typedef shared_ptr<CPositionNodeEntity>  PointNodePtr;
     15 typedef shared_ptr<CArrowEntity>    ArrowPtr;
     16 typedef shared_ptr<CNodeEntity>        BaseNodeEntity;
     17 
     18 typedef std::vector<EntityPtr>        VecEntity;
     19 typedef std::vector<RuleNodePtr> VecRule;
     20 typedef std::vector<PointNodePtr> VecPointNode;
     21 #define radius 7
     22 #define SelectedColor RGB(111, 111, 0)
     23 #define NoSelectedColor RGB(118, 238, 0)
     24 enum EntityGrade {
     25     EG_Arrow, EG_Axis, EG_RuleNode, EG_PositionNode
     26 };
     27 enum MenuID { MI_Edit = 1, MI_Delete, MI_AddPositionNode };
     28 
     29 #define MI_Edit_Tip  "编辑"  
     30 #define MI_Delete_Tip  "删除"  
     31 #define MI_AddPositionNode_Tip  "添加坐标"  
     32 
     33 class CFyqEntity
     34 {
     35 
     36 public:
     37     CFyqEntity();
     38     ~CFyqEntity();
     39     virtual int GetGrade() 
     40     {
     41         return -1;
     42     }
     43     virtual CRect GetBoundingBox()
     44     {
     45         return m_rect;
     46     }
     47     virtual void  OnDraw(CDC* pDC);
     48     virtual    void  DrawBoundingBox(CDC* pDC);
     49     virtual bool UpdateInfo(CWnd* pWnd); 
     50     virtual vecInt GetMenuIDvec()
     51     {
     52         vecInt vec;
     53         return vec;
     54     }
     55 public:
     56     void    SetSelected(bool val);
     57     bool    bSelected();
     58     bool    m_bSelected;
     59     CPoint        m_Origin;//原点
     60     CRect        m_rect;//轮廓
     61     CString        m_sContent;//显示内容
     62 };
     63 
     64 
     65 class CArrowEntity : public CFyqEntity
     66 {
     67 public:
     68     CArrowEntity(CPoint& origin, CPoint& uppoint, CPoint& downpoint)
     69     {
     70         m_originPoint = origin;
     71         m_upPoint = uppoint;
     72         m_downPoint = downpoint;
     73     }
     74     void SetPoint(CPoint& origin, CPoint& uppoint, CPoint& downpoint)
     75     {
     76         m_originPoint = origin;
     77         m_upPoint = uppoint;
     78         m_downPoint = downpoint;
     79         m_rect.SetRect(m_upPoint.x, m_upPoint.y, m_originPoint.x, m_downPoint.y);
     80     }
     81 public:
     82     virtual int GetGrade() { return EG_Arrow; }
     83     virtual CRect GetBoundingBox();
     84     virtual void  OnDraw(CDC* pDC);
     85 public:
     86     CPoint   m_upPoint;
     87     CPoint   m_downPoint;
     88     CPoint     m_originPoint;
     89 
     90 };
     91 
     92 class CAxisEntity : public CFyqEntity
     93 {
     94 public:
     95     CAxisEntity(CPoint& start, CPoint& end);
     96     virtual int GetGrade() { return EG_Axis; }
     97     virtual CRect GetBoundingBox();
     98     virtual void  OnDraw(CDC* pDC);
     99     virtual vecInt GetMenuIDvec();
    100     
    101 public:
    102     void SetStartPoint(CPoint &pt);
    103     void SetEndPoint(CPoint &pt);
    104     void SetArrow(ArrowPtr arrow);
    105 private:
    106     CPoint   m_start;
    107     CPoint   m_end;
    108     ArrowPtr m_Arrow;
    109 };
    110 
    111 class CNodeEntity : public CFyqEntity
    112 {
    113 public:
    114     CNodeEntity();
    115 public:
    116     virtual int GetGrade() = 0;
    117     virtual CRect GetBoundingBox();
    118     virtual void  OnDraw(CDC* pDC);
    119 public:
    120     void SetRect(CPoint pt1, CPoint pt2);
    121     void SetContent(CString val);
    122     CString GetContent();
    123     CRect GetRect();
    124     bool GetUpdate()
    125     {
    126         return m_bupdate;
    127     }
    128     void SetUpdate(int flag)
    129     {
    130         m_bupdate = flag;
    131     }
    132 protected:
    133     bool m_bupdate;
    134 };
    135 
    136 class CRuleNodeEntity : public CNodeEntity
    137 {
    138 public:
    139     CRuleNodeEntity();
    140     CRuleNodeEntity(PointNodePtr leftnode,PointNodePtr rightnode,CString& str,int high, int low,int SheetMaxH);
    141     ~CRuleNodeEntity();
    142     virtual int GetGrade() { return EG_RuleNode; }
    143     virtual void OnDraw(CDC* pDC);
    144     virtual bool UpdateInfo(CWnd* pWnd); 
    145     virtual vecInt GetMenuIDvec();
    146     PointNodePtr GetleftNode() {
    147         return m_pleftNode;
    148     }
    149     PointNodePtr GetRightNode() {
    150         return m_pRightNode;
    151     }
    152     void Sethigh(int x)
    153     {
    154         m_nhigh = x;
    155         m_sContent.Format("%d高,%d低", m_nhigh, m_nlow);
    156     }
    157     void Setlow(int x)
    158     {
    159         m_nlow = x;
    160         m_sContent.Format("%d高,%d低", m_nhigh, m_nlow);
    161     }
    162     int Gethigh()
    163     {
    164         return m_nhigh;
    165     }
    166     int Getlow()
    167     {
    168         return m_nlow;
    169     }
    170     void SetSheetHigh(int high)
    171     {
    172         m_nsheetHigh = high;
    173     }
    174 public:
    175     PointNodePtr m_pleftNode;
    176     PointNodePtr m_pRightNode;
    177 private:
    178     int m_nhigh;
    179     int m_nlow;
    180     int m_nsheetHigh;
    181 };
    182 
    183 class CPositionNodeEntity : public CNodeEntity
    184 {
    185 public:
    186     CPositionNodeEntity(CPoint& point,int number,int flag);
    187     CPositionNodeEntity(int number, int flag);
    188     virtual int GetGrade() { return EG_PositionNode; }
    189     virtual void OnDraw(CDC* pDC);
    190     virtual bool UpdateInfo(CWnd* pWnd); 
    191     virtual vecInt GetMenuIDvec();
    192 
    193     void SetPointx(int x)
    194     {
    195         m_nx = x;
    196     }
    197     void SetRealX(int x)
    198     {
    199         m_Origin.x = x;
    200         m_rect.TopLeft().x = m_Origin.x - radius;
    201         m_rect.BottomRight().x = m_Origin.x + radius;
    202     }
    203     void SetRealY(int y)
    204     {
    205         m_Origin.y = y;
    206         m_rect.TopLeft().y = m_Origin.y - radius;
    207         m_rect.BottomRight().y = m_Origin.y + radius;
    208     }
    209     int GetPointx()
    210     {
    211         return m_nx;
    212     }
    213     void SetNextNode(PointNodePtr node)
    214     {
    215         m_pNextNode = node;
    216     }
    217     void SetLastNode(PointNodePtr node)
    218     {
    219         m_pLastNode = node;
    220     }
    221 
    222     PointNodePtr GetNextNode()
    223     {
    224         return m_pNextNode;
    225     }
    226     PointNodePtr GetLastNode()
    227     {
    228         return m_pLastNode;
    229     }
    230 
    231     void SetLastRule(RuleNodePtr node)
    232     {
    233         m_pLastRule = node;
    234     }
    235     void SetRule(RuleNodePtr node)
    236     {
    237         m_pRule = node;
    238     }
    239     int GetX()
    240     {
    241         return m_nx;
    242     }
    243 private:
    244     int m_nx;
    245     PointNodePtr m_pNextNode;
    246     PointNodePtr m_pLastNode;
    247     RuleNodePtr m_pLastRule;
    248     RuleNodePtr m_pRule;
    249     int m_flag;
    250 
    251 };
    252 
    253 
    254 class CFyqEnityMgr
    255 {
    256 public:
    257     CFyqEnityMgr();
    258 
    259     bool CreateEntities(Cfyq_expression* exp,CRect& rect);
    260     void OnDraw(CDC* pDC, CRect& rect);
    261     CRect GetBoundingBox();
    262     EntityPtr SelectEntity(CPoint pt);
    263     void SetSelected(bool val);
    264     bool IsEmpty();
    265     void SetScopeToExpression(Cfyq_expression* exp);
    266 public://编辑
    267     bool EditEntity(CPoint pt, CWnd* pWnd);
    268     bool EditNodeBackGround(CPoint pt, CWnd* pWnd);
    269     bool DeleteEntity(EntityPtr pEnt);
    270     bool AddPositionNode(CPoint &point);
    271     void AddPositionNode(int numx);
    272     void DeleteRule(PointNodePtr start, PointNodePtr end);
    273     PointNodePtr ExistPointNode(int nNum);
    274     RuleNodePtr ExistRule(int nNum);
    275 public:
    276     void findRule();
    277     void findPosition();
    278 protected:
    279     VecEntity        m_Entities;
    280     VecRule            m_VecRule;
    281     VecPointNode    m_VecPoint;
    282     PointNodePtr    m_lastNode;
    283 
    284     BaseNodeEntity    m_LastSelected;
    285 
    286     int                m_nPointCount;
    287     int                m_nNowHigh;
    288     //CFile_TbCatalogTreeCtrl *m_pCtrl;
    289 };
    290 
    291 
    292 
    293 
    294 /////////////////////////////////////////////////////////////////////////////
    295 //去高去低编辑框
    296 class FLY_DBASE_API CD_EditHighLowDlg : public CXTPResizeDialog
    297 {
    298 public:
    299     CD_EditHighLowDlg(CWnd* pParent = NULL);
    300     ~CD_EditHighLowDlg();
    301 
    302     void SetValue(CString str, int nHighNum, int nLowNum,int max,CPoint& point);
    303 public:
    304     virtual BOOL OnInitDialog();
    305     virtual void DoDataExchange(CDataExchange* pDX);
    306     virtual void OnOK();
    307     DECLARE_MESSAGE_MAP()
    308 public:
    309     CString m_sHighNum;
    310     CString m_sLowNum;
    311     CString m_sShowAdd;
    312     int        m_nHighNum;
    313     int        m_nLowNum;
    314     int        m_Max;
    315     CPoint  m_point;
    316 };
    317 //修改已存在的点
    318 class FLY_DBASE_API CD_EditPointDlg : public CXTPResizeDialog
    319 {
    320 public:
    321     CD_EditPointDlg(CWnd* pParent = NULL);
    322     ~CD_EditPointDlg();
    323 
    324     void SetValue(CString str, int max, int min,CPoint &point);
    325 public:
    326     virtual BOOL OnInitDialog();
    327     virtual void DoDataExchange(CDataExchange* pDX);
    328     virtual void OnOK();
    329     DECLARE_MESSAGE_MAP()
    330 public:
    331     CString m_sShowPoint;
    332     CString m_sEditPoint;
    333     int m_nMax;
    334     int m_nMin;
    335     int m_nNum;
    336     CPoint m_point;
    337 };
    338 
    339 
    340 
    341 class FLY_DBASE_API CD_AddPointDlg : public CXTPResizeDialog
    342 {
    343 public:
    344     CD_AddPointDlg(CWnd* pParent = NULL);
    345     ~CD_AddPointDlg();
    346 
    347 public:
    348     virtual BOOL OnInitDialog();
    349     virtual void DoDataExchange(CDataExchange* pDX);
    350     void SetValue(CPoint& point);
    351     virtual void OnOK();
    352     DECLARE_MESSAGE_MAP()
    353 public:
    354     CString m_sAddPoint;
    355     int        m_nNum;
    356     CPoint  m_point;
    357 };
    #include "stdafx.h"
    #include <afxwin.h>
    #include <memory>
    
    #include "ZbFile_Add_MaxMin.h"
    #include "Resource.h"
    CString GetMenuStringByID(int nID)
    {
        switch (nID)
        {
        case MI_Edit:
            return MI_Edit_Tip;
        case MI_Delete:
            return MI_Delete_Tip;
        case MI_AddPositionNode:
            return MI_AddPositionNode_Tip;
        default:
            break;
        }
        return _T("");
    }
    
    CFyqEntity::CFyqEntity()
    {
        m_bSelected = false;
    }
    
    CFyqEntity::~CFyqEntity()
    {
    
    }
    void CFyqEntity::OnDraw(CDC* pDC)
    {
        if (m_bSelected)
        {
            DrawBoundingBox(pDC);
        }
    }
    void CFyqEntity::DrawBoundingBox(CDC* pDC)
    {
        CRect rt = GetBoundingBox();
        if (this->GetGrade() == EG_PositionNode)
        {
            pDC->Ellipse(m_Origin.x - radius, m_Origin.y - radius, m_Origin.x + radius, m_Origin.y + radius);
        }
        else
        {
            if (this->GetGrade() == EG_RuleNode)
            {
                pDC->SelectStockObject(NULL_BRUSH);
                pDC->SelectStockObject(NULL_PEN);
            }
            pDC->Rectangle(rt);
        }
    }
    bool CFyqEntity::UpdateInfo(CWnd* pWnd)
    {
        return true;
    }
    
    void CFyqEntity::SetSelected(bool val)
    {
        m_bSelected = val;
    }
    
    bool CFyqEntity::bSelected()
    {
        return m_bSelected;
    }
    
    
    
    ////////////////////////////////////////////////////////////////////
    
    CRect CArrowEntity::GetBoundingBox()
    {
        return m_rect;
    }
    
    void CArrowEntity::OnDraw(CDC* pDC)
    {
        CFyqEntity::OnDraw(pDC);
            //绘制箭头  
        pDC->MoveTo(m_originPoint);
        pDC->LineTo(m_upPoint);
        pDC->MoveTo(m_originPoint);
        pDC->LineTo(m_downPoint);
    }
    
    CAxisEntity::CAxisEntity(CPoint& start, CPoint& end)
    {
        m_start = start;
        m_end = end;
    }
    
    //////////////////////////////////////////////////////////////////////////////
    
    CRect CAxisEntity::GetBoundingBox()
    {
        CRect rtArrow = m_Arrow->GetBoundingBox();
        CRect Allrt;
        m_rect;
        Allrt.UnionRect(m_rect, rtArrow);
        return Allrt;
    }
    
    void CAxisEntity::OnDraw(CDC* pDC)
    {
        CFyqEntity::OnDraw(pDC);
        pDC->MoveTo(m_start);
        pDC->LineTo(m_end);
    }
    
    vecInt CAxisEntity::GetMenuIDvec()
    {
        vecInt  temMenu;
        temMenu.push_back(MI_AddPositionNode);
        return temMenu;
    }
    
    
    void CAxisEntity::SetStartPoint(CPoint &pt)
    {
        m_start = pt;
    }
    
    void CAxisEntity::SetEndPoint(CPoint &pt)
    {
        m_end = pt;
        m_rect.SetRect(m_start.x, m_start.y - 5, m_end.x, m_end.y + 5);
    }
    
    void CAxisEntity::SetArrow(ArrowPtr arrow)
    {
        m_Arrow = arrow;
    }
    
    //////////////////////////////////////////////////////////////////////////////
    CNodeEntity::CNodeEntity()
    {
        m_bupdate = false;
    }
    
    CRect CNodeEntity::GetBoundingBox()
    {
        return m_rect;
    }
    
    void CNodeEntity::OnDraw(CDC* pDC)
    {
        CFyqEntity::OnDraw(pDC);
        pDC->MoveTo(m_rect.TopLeft());
        pDC->LineTo(m_rect.BottomRight());
    }
    
    void CNodeEntity::SetRect(CPoint pt1, CPoint pt2)
    {
        m_rect.SetRect(pt1, pt2);
    }
    
    void CNodeEntity::SetContent(CString val)
    {
        m_sContent = val;
    }
    
    CRect CNodeEntity::GetRect()
    {
        return m_rect;
    }
    
    CString CNodeEntity::GetContent()
    {
        return m_sContent;
    }
    
    
    ///////////////////////////////////////////////////////////////////////
    CRuleNodeEntity::CRuleNodeEntity()
    {
        m_pleftNode = NULL;
        m_pRightNode = NULL;
        m_nhigh = -1;
        m_nlow = -1;
    }
    
    CRuleNodeEntity::CRuleNodeEntity(PointNodePtr leftnode, PointNodePtr rightnode, CString& str, int high, int low,int SheetMaxH)
    {
        m_pleftNode = leftnode;
        m_pRightNode = rightnode;
        
        m_rect.SetRect(leftnode->m_Origin.x, SheetMaxH, rightnode->m_Origin.x, rightnode->m_Origin.y);
    
        m_sContent = str;
        m_nhigh = high;
        m_nlow = low;
        m_nsheetHigh = SheetMaxH;
    }    
    
    CRuleNodeEntity::~CRuleNodeEntity()
    {
    
    }
    
    void CRuleNodeEntity::OnDraw(CDC* pDC)
    {
        CFyqEntity::OnDraw(pDC);
        CBrush brush;
        if (m_bupdate)
            brush.CreateSolidBrush(SelectedColor);
        else
            pDC->SelectStockObject(NULL_BRUSH);
        m_bupdate = 0;
    
        pDC->SelectStockObject(NULL_PEN);
    
        CBrush* pOldbrush = pDC->SelectObject(&brush);
        pDC->Rectangle(((m_pleftNode->m_Origin.x + m_pRightNode->m_Origin.x) / 2) - 25, m_nsheetHigh,
            ((m_pleftNode->m_Origin.x + m_pRightNode->m_Origin.x) / 2) + 25, m_pRightNode->m_Origin.y);
        if (pOldbrush)
            pDC->SelectObject(pOldbrush);
    
        pDC->SetTextColor(RGB(25, 155, 12));
        m_rect.SetRect(((m_pleftNode->m_Origin.x+ m_pRightNode->m_Origin.x)/2) - 30,m_nsheetHigh,
            ((m_pleftNode->m_Origin.x + m_pRightNode->m_Origin.x) / 2) + 30, m_pRightNode->m_Origin.y);
        pDC->DrawText(m_sContent, m_rect, DT_CENTER | DT_SINGLELINE | DT_VCENTER);
        pDC->SetTextColor(RGB(0, 0, 0));
    }
    
    bool CRuleNodeEntity::UpdateInfo(CWnd* pWnd)
    {
        CString str;
        str.Format("当大于等于%d家,小于%d家时", m_pleftNode->GetPointx(), m_pRightNode->GetPointx());
    
        int x1 = m_rect.TopLeft().x;
        int y2 = m_rect.BottomRight().y;
        CPoint point(x1, y2);
        ClientToScreen(pWnd->GetSafeHwnd(), &point);
    
    
    
        CD_EditHighLowDlg dlg;
         dlg.SetValue(str, m_nhigh, m_nlow, m_pRightNode->GetPointx(),point);
        if (IDOK == dlg.DoModal())
        {
            Sethigh(dlg.m_nHighNum);
            Setlow(dlg.m_nHighNum);
        }
        return true;
    }
    
    vecInt CRuleNodeEntity::GetMenuIDvec()
    {
        vecInt  temMenu;
        temMenu.push_back(MI_Edit);
        return temMenu;
    }
    
    ////////////////////////////////////////////////////////////////////////////////////////
    
    CPositionNodeEntity::CPositionNodeEntity(CPoint& point, int number,int flag)
    {
        m_bupdate = false;
        m_Origin = point;
        m_flag = flag;
        if (!flag)
        {
    
        }
        else
        {
            m_rect.TopLeft().x = m_Origin.x - radius;
            m_rect.TopLeft().y = m_Origin.y - radius;
    
            m_rect.BottomRight().x = m_Origin.x + radius;
            m_rect.BottomRight().y = m_Origin.y + radius;
        }
    
        m_nx = number;
        CString str;
        str.Format("%d", number);
        m_sContent = str;
    }
    
    CPositionNodeEntity::CPositionNodeEntity(int number, int flag)
    {
        m_flag = flag;
        m_nx = number;
        CString str;
        str.Format("%d", number);
        m_sContent = str;
    }
    
    void CPositionNodeEntity::OnDraw(CDC* pDC)
    {
        if (!m_flag)
        {
            return;
        }
    
        CFyqEntity::OnDraw(pDC);
        //设半径为8
        CBrush brush;
         if(m_bupdate)
             brush.CreateSolidBrush(SelectedColor);
        else
            brush.CreateSolidBrush(NoSelectedColor);
        m_bupdate = 0;
        
        CBrush * pOldbrush = pDC->SelectObject(&brush);
        HPEN hPen = CreatePen(PS_SOLID,1, RGB(0, 0, 0));
        pDC->SelectObject(hPen);
        pDC->Ellipse(m_Origin.x - radius, m_Origin.y - radius, m_Origin.x + radius, m_Origin.y + radius);
        if (pOldbrush)
            pDC->SelectObject(pOldbrush);
        
        CRect rect(m_Origin.x - radius, m_Origin.y - radius, m_Origin.x + radius, m_Origin.y + radius);
        CString str;
        str.Format("%d", m_nx);
        m_sContent = str;
        pDC->DrawText(str, &rect, DT_CENTER | DT_SINGLELINE | DT_VCENTER);
        DeleteObject(hPen);
    }
    
    bool CPositionNodeEntity::UpdateInfo(CWnd* pWnd)
    {
        CString str;
        str.Format("当前为%d,修改为:", m_nx);
        CD_EditPointDlg dlg;
        int min, max;
        if (m_pLastNode)
        {
            min = m_pLastNode->GetPointx();
        }
        else
        {
            min = 3;
        }
        if (m_pNextNode)
        {
            max = m_pNextNode->GetPointx();
        }
        else
        {
            max = 10000;
        }
        int x1 = m_rect.TopLeft().x;
        int y2 = m_rect.BottomRight().y;
        CPoint point(x1, y2);
        ClientToScreen(pWnd->GetSafeHwnd(), &point);
        dlg.SetValue(str,max,min, point);
        if (IDOK == dlg.DoModal())
        {
            SetPointx(dlg.m_nNum);
        }
        return true;
    }
    
    vecInt CPositionNodeEntity::GetMenuIDvec()
    {
        vecInt  temMenu;
        temMenu.push_back(MI_Edit);
        temMenu.push_back(MI_Delete);
        return temMenu;
    }
    
    ////////////////////////////////////////////////////////////////////////////////////////
    CFyqEnityMgr::CFyqEnityMgr()
    {
        m_nPointCount = 0;
    
    }
    
    
    bool CFyqEnityMgr::CreateEntities(Cfyq_expression* exp, CRect& rect)
    {
        //该函数里面所有的坐标限于第一次初始化 修改到ondraw里面修改
    
    
    /*    m_pCtrl = pCtrl;*/
        m_Entities.clear();
        std::vector<std::vector<int>> vecScope;
        vecScope = exp->GetScopeMinMax();
        CPoint leftupPoint = rect.TopLeft();
        CPoint rightdownPoint = rect.BottomRight();
        int SheetMaxH = rightdownPoint.y - 10;            //一开始起始y
        int TextAreaWidth = leftupPoint.x; //一开始起始x 因为是横着画的
        int MaxX = rightdownPoint.x;        // 最远x
        //坐标轴
        CPoint pstart(rect.TopLeft().x, SheetMaxH);
        CPoint pend(MaxX, SheetMaxH);
        auto ptrAxis = make_shared<CAxisEntity>(pstart, pend);
        m_Entities.push_back(ptrAxis);
        //箭头
        CPoint puppoint(pend.x - 10, pend.y - 5);
        CPoint pdownpoint(pend.x - 10, pend.y + 5);
        auto ptrArrow = make_shared<CArrowEntity>(pend, puppoint, pdownpoint);
        m_Entities.push_back(ptrArrow);
        ptrAxis->SetArrow(ptrArrow);
        int xMaxGrad = 5; //步进为5,目前动态计算还未完成
        //坐标点
    
        for (int i = 0; i < vecScope.size(); ++i)
        {
            int nBegin = vecScope[i][0];
            int nEnd = vecScope[i][1];
            int nhigh = vecScope[i][2];
            int nlow = vecScope[i][3];
            if (nBegin == 0)
            {
                continue;
            }
            CPoint pointend;
            CPoint pointstart(rect.TopLeft().x + nBegin * xMaxGrad * 10 - xMaxGrad * 25, SheetMaxH);
            pointend.x = rect.TopLeft().x + nEnd * xMaxGrad * 10 - xMaxGrad * 25;
            if (pointend.x > MaxX)
            {
                pointend.x = MaxX;
            }
            pointend.y = SheetMaxH;
            
            CString str;
            str.Format("%d高,%d低", nhigh, nlow);
    
            RuleNodePtr ptrLastRule = ExistRule(nBegin);
            PointNodePtr ptrPositionstart = ExistPointNode(nBegin);
            
            if (ptrPositionstart == NULL)
            {
                ptrPositionstart = make_shared<CPositionNodeEntity>(pointstart, nBegin,1);
                m_Entities.push_back(ptrPositionstart);
            }
            PointNodePtr ptrPositionend;
            if(pointend.x == MaxX)
                    ptrPositionend = make_shared<CPositionNodeEntity>(pointend, nEnd,0);
            else
                    ptrPositionend = make_shared<CPositionNodeEntity>(pointend, nEnd, 1);
    
            auto ptrCRuleNodeEnitiy = make_shared<CRuleNodeEntity>(ptrPositionstart, ptrPositionend,str, nhigh, nlow, leftupPoint.y);
            
            ptrPositionstart->SetRule(ptrCRuleNodeEnitiy);
            if (ptrLastRule != NULL)
            {
                ptrPositionstart->SetLastRule(ptrLastRule);
            }
            
            
            m_Entities.push_back(ptrPositionend);
            m_Entities.push_back(ptrCRuleNodeEnitiy);
            ptrPositionstart->SetNextNode(ptrPositionend);
            ptrPositionend->SetLastNode(ptrPositionstart);
            if (i == vecScope.size() - 1)
            {
                m_lastNode = ptrPositionend;
            }
        }
        return true;
    }
    void CFyqEnityMgr::OnDraw(CDC* pDC, CRect& rect)
    {
        CPoint leftupPoint = rect.TopLeft();
        m_nNowHigh = leftupPoint.y;
        
        int TextAreaWidth = leftupPoint.x; //一开始起始x 因为是横着画的
        m_nPointCount = 0;
        CPoint rightdownPoint = rect.BottomRight();
        int SheetMaxH = rightdownPoint.y - 10;            //一开始起始y
        int MaxX = rightdownPoint.x;        // 最远x
        CPoint pStart(leftupPoint.x, SheetMaxH);
        CPoint pend(MaxX, SheetMaxH);
        CPoint puppoint(pend.x - 10, pend.y - 5);
        CPoint pdownpoint(pend.x - 10, pend.y + 5);
        m_lastNode->m_Origin = pend;
        for (auto it = m_Entities.begin(); it != m_Entities.end(); it++)
        {
            if ((*it)->GetGrade() == EG_Arrow)
            {
                std::dynamic_pointer_cast<CArrowEntity>(*it)->SetPoint(pend, puppoint, pdownpoint);
            }
            if ((*it)->GetGrade() == EG_Axis)
            {
                std::dynamic_pointer_cast<CAxisEntity>(*it)->SetStartPoint(pStart);
                std::dynamic_pointer_cast<CAxisEntity>(*it)->SetEndPoint(pend);
            }
            if ((*it)->GetGrade() == EG_PositionNode)
            {
                ++m_nPointCount;
            }
        }
        //根据点的个数动态计算步进
        findPosition();
        sort(m_VecPoint.begin(), m_VecPoint.end(), [](PointNodePtr node1, PointNodePtr node2)
        {
            return node1->GetX() < node2->GetX();
        });
        int xMaxGrad = -1;
        if(m_VecPoint.size() > 1)
            xMaxGrad = (MaxX - 100 - TextAreaWidth) / (10 * m_VecPoint[m_VecPoint.size() - 2]->GetX());
    
        for (auto it = m_Entities.begin(); it != m_Entities.end(); it++)
        {
            if ((*it)->GetGrade() == EG_PositionNode && (*it) != m_lastNode)
            {
                CPoint point;
                int number = std::dynamic_pointer_cast<CPositionNodeEntity>(*it)->GetX();
                point.x = TextAreaWidth + xMaxGrad * number * 10 - xMaxGrad * 20;
                point.y = SheetMaxH;
                std::dynamic_pointer_cast<CPositionNodeEntity>(*it)->SetRealX(point.x);
                std::dynamic_pointer_cast<CPositionNodeEntity>(*it)->SetRealY(point.y);
            }
            if ((*it)->GetGrade() == EG_RuleNode)
            {
                std::dynamic_pointer_cast<CRuleNodeEntity>(*it)->SetSheetHigh(m_nNowHigh);
            }
        }
        for (auto it = m_Entities.begin(); it != m_Entities.end(); it++)
        {
            (*it)->OnDraw(pDC);
        }
    }
    
    EntityPtr CFyqEnityMgr::SelectEntity(CPoint pt)
    {
        vecInt  SelOrder;
        SelOrder.push_back(EG_RuleNode);
        SelOrder.push_back(EG_PositionNode);
        SelOrder.push_back(EG_Axis);
    
        for (int i = 0; i < SelOrder.size(); i++)
        {
            int order = SelOrder[i];
            auto it = find_if(m_Entities.begin(), m_Entities.end(), [=](EntityPtr ptr)
            {
                if (order == ptr->GetGrade())
                {
                    CRect rt = ptr->GetBoundingBox();
                    if (rt.PtInRect(pt))
                        return true;
                }
                return false;
            });
            if (it != m_Entities.end())
            {
                return (*it);
            }
        }
        return nullptr;
    }
    
    void CFyqEnityMgr::SetSelected(bool val)
    {
        for (auto it = m_Entities.begin(); it != m_Entities.end(); it++)
        {
            (*it)->SetSelected(val);
        }
    }
    
    bool CFyqEnityMgr::IsEmpty()
    {
        return m_Entities.empty();
    }
    
    void CFyqEnityMgr::SetScopeToExpression(Cfyq_expression* exp)
    {
        m_VecRule.clear();
        for (int i = 0; i < m_Entities.size(); ++i)
        {
            if (m_Entities[i]->GetGrade() == EG_RuleNode)
            {
                auto ptr = std::dynamic_pointer_cast<CRuleNodeEntity>(m_Entities[i]);
                m_VecRule.push_back(ptr);
            }
        }
        sort(m_VecRule.begin(), m_VecRule.end(), [&](RuleNodePtr node1, RuleNodePtr node2)
        {
            return node1->GetleftNode()->GetPointx() < node2->GetleftNode()->GetPointx();
        });
    
        int dMinCount;
        int dMaxCount;
        int dMaxNumber;
        int dMinNumber;
        CString str;
        if (m_VecRule.size() == 1)
        {
            dMinCount = m_VecRule[0]->GetleftNode()->GetPointx();
            dMaxCount = m_VecRule[0]->GetRightNode()->GetPointx();
            dMaxNumber = m_VecRule[0]->Gethigh();
            dMinNumber = m_VecRule[0]->Getlow();
            str.Format("%d,%d,%d,%d", dMinCount, dMaxCount, dMaxNumber, dMinNumber);
            exp->GetScopeFromTree();
            exp->m_vecScope[0]->ReplaceScope(str);
        }
        else if (m_VecRule.size() > 1)
        {
            CString ans;
            for (int i = 0; i < m_VecRule.size(); ++i)
            {
                dMinCount = m_VecRule[i]->GetleftNode()->GetPointx();
                dMaxCount = m_VecRule[i]->GetRightNode()->GetPointx();
                dMaxNumber = m_VecRule[i]->Gethigh();
                dMinNumber = m_VecRule[i]->Getlow();
                if (i == m_VecRule.size() - 1)
                {
                    str.Format("%d,%d,%d,%d", dMinCount, dMaxCount, dMaxNumber, dMinNumber);
                }
                else
                {
                    str.Format("%d,%d,%d,%d;", dMinCount, dMaxCount, dMaxNumber, dMinNumber);
                }
                ans += str;
            }
            exp->GetScopeFromTree();
            exp->m_vecScope[0]->ReplaceScope(ans);
        }
    }
    
    CRect CFyqEnityMgr::GetBoundingBox()
    {
        CRect rt;
        for (auto it = m_Entities.begin(); it != m_Entities.end(); it++)
        {
            CRect temrt = (*it)->GetBoundingBox();
            rt.UnionRect(rt, temrt);
        }
        return rt;
    }
    // bool CFyqEnityMgr::LButtonDraw(CPoint pt, CWnd* pWnd)
    // {
    //     pWnd->InvalidateRect(GetBoundingBox());
    //     return true;
    // }
    bool CFyqEnityMgr::EditEntity(CPoint pt, CWnd* pWnd)
    {
        EntityPtr pEnt = SelectEntity(pt);
        SetSelected(false);
    
        if (nullptr != pEnt)
        {
            pEnt->SetSelected(true);
            pWnd->InvalidateRect(GetBoundingBox());
            vecInt menuid = pEnt->GetMenuIDvec();
            CMenu menu;
            VERIFY(menu.CreatePopupMenu());
            for (int i = 0; i < menuid.size(); i++)
            {
                menu.AppendMenu(MF_STRING, menuid[i], GetMenuStringByID(menuid[i]));
            }
            //除了增加点在数轴上 其他都是在矩形的正下方
            int nCmd;
            CPoint point;
            point.y = pEnt->m_rect.BottomRight().y;
            if (pEnt->GetGrade() == EG_Axis || pEnt->GetGrade() == EG_Arrow)
            {
                point.x = pt.x;
            }
            else
            {
                point.x = pEnt->m_rect.TopLeft().x;
            }
            ClientToScreen(pWnd->GetSafeHwnd(), &point);
            nCmd = TrackPopupMenu(menu.GetSafeHmenu(), TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL | TPM_RETURNCMD,
                point.x, point.y, 0, pWnd->GetSafeHwnd(), 0);
            switch (nCmd)
            {
            case MI_Edit:
            {
                pEnt->UpdateInfo(pWnd);
            }
            break;
            case MI_Delete:
            {
                DeleteEntity(pEnt);
            }
            break;
            case MI_AddPositionNode:
            {
                AddPositionNode(point);
            }
            break;
            default:
                break;
            }
            return true;
        }
        return false;
    }
    bool CFyqEnityMgr::EditNodeBackGround(CPoint pt, CWnd* pWnd)
    {
        auto it = find_if(m_Entities.begin(), m_Entities.end(), [=](EntityPtr ptr)
        {
            if (EG_PositionNode == ptr->GetGrade() || EG_RuleNode == ptr->GetGrade())
            {
                CRect rt = ptr->GetBoundingBox();
                if (rt.PtInRect(pt))
                    return true;
            }
            return false;
        });
        if (it == m_Entities.end())
        {
            for (auto it = m_Entities.begin(); it != m_Entities.end(); ++it)
            {
                if ((*it)->GetGrade() == EG_PositionNode || (*it)->GetGrade() == EG_RuleNode)
                {
                    std::dynamic_pointer_cast<CNodeEntity>(*it)->SetUpdate(false);
                }
            }
            if (m_LastSelected)
            {
                pWnd->InvalidateRect(&m_LastSelected->GetBoundingBox());
                m_LastSelected = nullptr;
            }
                
            return false;
        }
        else
        {
            std::dynamic_pointer_cast<CNodeEntity>(*it)->SetUpdate(true);
            if ((*it) != m_LastSelected)
            {
                if (m_LastSelected)
                {
                    std::dynamic_pointer_cast<CNodeEntity>(m_LastSelected)->SetUpdate(false);
                    pWnd->InvalidateRect(&(m_LastSelected)->GetBoundingBox());
                }
                m_LastSelected = std::dynamic_pointer_cast<CNodeEntity>(*it);
                pWnd->InvalidateRect(&(*it)->GetBoundingBox());
            }
            return true;
        }
    
    }
    bool CFyqEnityMgr::DeleteEntity(EntityPtr pEnt)
    {
        //数据中的
        //不能存在已有的点
        PointNodePtr nowNode = std::dynamic_pointer_cast<CPositionNodeEntity>(pEnt);
        if (nowNode == NULL)
        {
            return false;
        }
        PointNodePtr leftnode = nowNode->GetLastNode();
        PointNodePtr rightnode = nowNode->GetNextNode();
        if (leftnode)
            leftnode->SetNextNode(rightnode);
        rightnode->SetLastNode(leftnode);
        for (auto it = m_Entities.begin(); it != m_Entities.end();)
        {
            if ((*it)->GetGrade() == EG_RuleNode)
            {
                if (std::dynamic_pointer_cast<CRuleNodeEntity>((*it))->GetleftNode() == nowNode ||
                    std::dynamic_pointer_cast<CRuleNodeEntity>((*it))->GetRightNode() == nowNode)
                {
                    it = m_Entities.erase(it);
                }
                else
                {
                    ++it;
                }
            }
            else
            {
                ++it;
            }
        }
        for (auto it = m_Entities.begin(); it != m_Entities.end();)
        {
            if ((*it) == pEnt)
            {
                it = m_Entities.erase(it);
            }
            else
            {
                ++it;
            }
        }
        CString str;
        str.Format("0高,0低");
        if (leftnode)
        {
            auto PtrRule = make_shared<CRuleNodeEntity>(leftnode, rightnode, str, 0, 0, m_nNowHigh);
            m_Entities.push_back(PtrRule);
        }
        return true;
    }
    //&& -> & 
    bool CFyqEnityMgr::AddPositionNode(CPoint &point)
    {
        CD_AddPointDlg dlg;
        dlg.SetValue(point);
        if (IDOK == dlg.DoModal())
        {
            AddPositionNode(dlg.m_nNum);
        }
        return true;
    }
    void CFyqEnityMgr::DeleteRule(PointNodePtr start, PointNodePtr end)
    {
        findRule();
        for (auto it = m_Entities.begin(); it != m_Entities.end();)
        {
            if ((*it)->GetGrade() == EG_RuleNode)
            {
                if (std::dynamic_pointer_cast<CRuleNodeEntity>(*it)->GetleftNode() == start
                    && std::dynamic_pointer_cast<CRuleNodeEntity>(*it)->GetRightNode() == end)
                {
                    it = m_Entities.erase(it);
                }
                else
                {
                    ++it;
                }
            }
            else
            {
                ++it;
            }
        }
    }
    void CFyqEnityMgr::AddPositionNode(int numx)
    {
        findPosition();
        //不能存在已有的点
        PointNodePtr ptr;
        CString str;
        str.Format("%d高,%d低", 0, 0);
        sort(m_VecPoint.begin(), m_VecPoint.end(), [](PointNodePtr node1, PointNodePtr node2)
        {
            return node1->GetX() < node2->GetX();
        });
        for (int i = 0; i < m_VecPoint.size() - 1; ++i)
        {
            if (numx > m_VecPoint[i]->GetX() && numx < m_VecPoint[i + 1]->GetX())
            {
                ptr = make_shared<CPositionNodeEntity>(numx,1);
                ptr->SetLastNode(m_VecPoint[i]);
                ptr->SetNextNode(m_VecPoint[i + 1]);
                //删除已有的矩形
                DeleteRule(m_VecPoint[i], m_VecPoint[i + 1]);
                //创建已有矩形
                
                auto PtrFirstRule = make_shared<CRuleNodeEntity>(m_VecPoint[i], ptr, str, 0, 0, m_nNowHigh);
                auto PtrSecondRule = make_shared<CRuleNodeEntity>(ptr, m_VecPoint[i+1], str, 0, 0, m_nNowHigh);
                m_Entities.push_back(ptr);
                m_Entities.push_back(PtrFirstRule);
                m_Entities.push_back(PtrSecondRule);
                return;
            }
        }
        ptr = make_shared<CPositionNodeEntity>(numx, 1);
        ptr->SetNextNode(m_VecPoint[0]);
        auto PtrFirstRule = make_shared<CRuleNodeEntity>(ptr, m_VecPoint[0], str, 0, 0, m_nNowHigh);
        m_Entities.push_back(ptr);
        m_Entities.push_back(PtrFirstRule);
        
    }
    
    
    
    PointNodePtr CFyqEnityMgr::ExistPointNode(int nNum)
    {
        findPosition();
        auto it = find_if(m_VecPoint.begin(), m_VecPoint.end(), [nNum](PointNodePtr node)
        {
            return node->GetX() == nNum;
        });
        if (it != m_VecPoint.end())
        {
            return *it;
        }
        else
        {
            return NULL;
        }
    }
    
    RuleNodePtr CFyqEnityMgr::ExistRule(int nNum)
    {
        findRule();
        auto it = find_if(m_VecRule.begin(), m_VecRule.end(), [&](RuleNodePtr node)
        {
            return node->GetRightNode()->GetX() == nNum;
        });
        if (it != m_VecRule.end())
        {
            return *it;
        }
        else
        {
            return NULL;
        }
    }
    
    void CFyqEnityMgr::findRule()
    {
        m_VecRule.clear();
        for (int i = 0; i < m_Entities.size(); ++i)
        {
            if (m_Entities[i]->GetGrade() == EG_RuleNode)
            {
                auto ptr = std::dynamic_pointer_cast<CRuleNodeEntity>(m_Entities[i]);
                m_VecRule.push_back(ptr);
            }
        }
    }
    
    void CFyqEnityMgr::findPosition()
    {
        m_VecPoint.clear();
        for (int i = 0; i < m_Entities.size(); ++i)
        {
            if (m_Entities[i]->GetGrade() == EG_PositionNode)
            {
                auto ptr = std::dynamic_pointer_cast<CPositionNodeEntity>(m_Entities[i]);
                m_VecPoint.push_back(ptr);
            }
        }
    }
    
    ///////////////////////////////////////////////////////////////////
    CD_EditHighLowDlg::CD_EditHighLowDlg(CWnd* pParent /*= NULL*/)
        :CXTPResizeDialog(IDD_DLG_HighLow, pParent)
    {
    
    }
    
    CD_EditHighLowDlg::~CD_EditHighLowDlg()
    {
    
    }
    
    BEGIN_MESSAGE_MAP(CD_EditHighLowDlg, CXTPResizeDialog)
    END_MESSAGE_MAP()
    
    void CD_EditHighLowDlg::SetValue(CString str, int nHighNum, int nLowNum,int max,CPoint& point)
    {
        m_sShowAdd = str;
        m_sHighNum.Format(_T("%d"), nHighNum);
        m_sLowNum.Format(_T("%d"), nLowNum);
        m_Max = max;
        m_point = point;
    }
    
    BOOL CD_EditHighLowDlg::OnInitDialog()
    {
        __super::OnInitDialog();
        CRect rect(m_point.x, m_point.y+5, m_point.x + 225, m_point.y + 120);
        MoveWindow(&rect);
        UpdateData(FALSE);
        return TRUE;
    }
    
    void CD_EditHighLowDlg::DoDataExchange(CDataExchange* pDX)
    {
        __super::DoDataExchange(pDX);
        DDX_Text(pDX, IDC_STATIC_ShowAdd, m_sShowAdd);
        DDX_Text(pDX, IDC_EDIT_High, m_sHighNum);
        DDX_Text(pDX, IDC_EDIT_Low, m_sLowNum);
    }
    
    void CD_EditHighLowDlg::OnOK()
    {
        UpdateData(TRUE);
        m_nHighNum = atoi(m_sHighNum);
        m_nLowNum = atoi(m_sLowNum);
        if (m_nHighNum + m_nLowNum >= m_Max)
        {
            AfxMessageBox("去高去低的企业数不能大于等于最大企业数!");
            return;
        }
        EndDialog(IDOK);
    }
    
    ////////////////////////////////////////////////////////
    CD_EditPointDlg::CD_EditPointDlg(CWnd* pParent /*= NULL*/)
        :CXTPResizeDialog(IDD_Edit_Point, pParent)
    {
    
    }
    
    CD_EditPointDlg::~CD_EditPointDlg()
    {
    
    }
    
    BEGIN_MESSAGE_MAP(CD_EditPointDlg, CXTPResizeDialog)
    END_MESSAGE_MAP()
    
    void CD_EditPointDlg::SetValue(CString str, int max,int min,CPoint& point)
    {
        m_sShowPoint = str;
        m_nMax = max;
        m_nMin = min;
        m_point = point;
    }
    BOOL CD_EditPointDlg::OnInitDialog()
    {
        __super::OnInitDialog();
        CRect rect(m_point.x, m_point.y, m_point.x + 180, m_point.y + 80);
        MoveWindow(&rect);
        UpdateData(FALSE);
        return TRUE;
    }
    
    void CD_EditPointDlg::DoDataExchange(CDataExchange* pDX)
    {
        __super::DoDataExchange(pDX);
        DDX_Text(pDX, IDC_EDIT_Point, m_sEditPoint);
        DDX_Text(pDX, IDC_STATIC_Point, m_sShowPoint);
    }
    
    void CD_EditPointDlg::OnOK()
    {
        UpdateData(TRUE);
        m_nNum = atoi(m_sEditPoint);
        CString str;
        
        str.Format("输入范围需要大于%d,小于%d!", m_nMin, m_nMax);
        if (!(m_nNum < m_nMax && m_nNum >= m_nMin))
        {
            AfxMessageBox(str);
            return;
        }
        EndDialog(IDOK);
    }
    ///////////////////////////////////////////
    CD_AddPointDlg::CD_AddPointDlg(CWnd* pParent /*= NULL*/)
        :CXTPResizeDialog(IDD_ADD_Point, pParent)
    {
    
    }
    
    CD_AddPointDlg::~CD_AddPointDlg()
    {
    
    }
    
    BEGIN_MESSAGE_MAP(CD_AddPointDlg, CXTPResizeDialog)
    END_MESSAGE_MAP()
    
    
    BOOL CD_AddPointDlg::OnInitDialog()
    {
        __super::OnInitDialog();
        CRect rect(m_point.x, m_point.y,m_point.x + 200,m_point.y+70);
        MoveWindow(&rect);
        UpdateData(FALSE);
        return TRUE;
    }
    
    void CD_AddPointDlg::DoDataExchange(CDataExchange* pDX)
    {
        __super::DoDataExchange(pDX);
        DDX_Text(pDX, IDC_EDIT_AddPoint, m_sAddPoint);
        
    }
    
    void CD_AddPointDlg::SetValue(CPoint& point)
    {
        m_point = point;
    }
    
    void CD_AddPointDlg::OnOK()
    {
        UpdateData(TRUE);
        m_nNum = atoi(m_sAddPoint);
        if (m_nNum < 3 || m_nNum >= 10000)
        {
            AfxMessageBox("坐标应大于3,小于10000!");
            return;
        }
        EndDialog(IDOK);
    }
  • 相关阅读:
    Html禁止粘贴 复制 剪切
    表单标签
    自构BeanHandler(用BeansUtils)
    spring配置中引入properties
    How Subcontracting Cockpit ME2ON creates SD delivery?
    cascadia code一款很好看的微软字体
    How condition value calculated in sap
    Code in SAP query
    SO Pricing not updated for partial billing items
    Javascript learning
  • 原文地址:https://www.cnblogs.com/Jawen/p/12079751.html
Copyright © 2011-2022 走看看