QuakeGod
2023-09-05 df03213660361b1c771f0a3f21b6ddaeaef7763a
MTerm1/MTerm1View.h
@@ -1,11 +1,14 @@

// MTerm1View.h: CMTerm1View 类的接口
// MultiTerminal2View.h: CMTerm1View 类的接口
//
#pragma once
#include <memory>
#include <vector>
class CMTerm1View : public CView
#include "MTerm1Doc.h"
class CMTerm1View : public CScrollView
{
protected: // 仅从序列化创建
   CMTerm1View() noexcept;
@@ -13,16 +16,204 @@
// 特性
public:
   CMFCStatusBar * m_pStatusBar;
   CMTerm1Doc* GetDocument() const;
   //从文档获取程序
   //文档变动通知
   enum enCellType{
      typeNone=0,
      typeLine1=1, //横线
      typeLine2,    //竖线
      typeLine3,
      typeLine4,
      typeLine5,
      typeLine6,
      typeLine7,
      typeLine8,
      typeLine9,
      typeLine10,
      typeLine11,
      typeNO=12,
      typeNC=13,
      typePP=14,  //上升沿
      typePN=15,  //下降沿
      typeNOT=16,
      typeDF = 17,
      typeDF_ = 18,
      typeOUT=19,
      typeSET=20,
      typeRESET=21,
      typeCMP,
      typeExt1,   //23 0x17   //被前面的指令占用的空间
      typeExt2,
      typeExt3,
      typeTM=30,      //定时器
      typeFN1=40,      //1个参数的函数
      typeFN2=50,      //2个参数的函数
      typeFN3=60,      //3个参数的函数
      typeCoil=99,
   };
   struct stCell
   {
      int nType;            //单元类型。
      int nProgStep;         //对应程序的步数
      int bFocused = 0;      //热点选中
      int bSelected = 0;      //选中
      int bEditing = 0;      //编辑中
      int bModified = 0;      //被修改了
      int bErrFocus = 0;      //错误热点
      int bLeftLineUp = 0;   //左侧向上竖线
      int bLeftLineDn = 0;   //左侧向下竖线
      int nStat = 0;         //当前状态//   监控时根据状态,显示数值或色块
      int nTrace = 0;         //当前跟踪状态
//      int nDataWidth = 0;
      int nDataType=0;      //参数数据类型
      int nDataAddr=0;      //参数数据地址/值
      CString sParam;         //参数名
      CString sCoilName;      //线圈名
      void clear() {
         nType = 0; bFocused = 0; bSelected = 0; bEditing = 0; bModified = 0;
         bLeftLineUp = 0; bLeftLineDn = 0; nStat = 0;
         nDataType = 0; nDataAddr = 0;
         sParam.Empty(); sCoilName.Empty();
      }
   };
   stCell Cells[2000][16] = { 0 };
   struct stProgSection
   {
      std::vector <CMTerm1Doc::stProg> Progs;
      int Append(CMTerm1Doc::stProg prog)   {
         Progs.push_back(prog);
         return 0;
      };
      int Append(struct stProgSection progsec){
         int n=(int)progsec.Progs.size();
         for (int i = 0; i < n; i++) {
            Progs.push_back(progsec.Progs[i]);
         }
         return 0;
      };
      int operator+=(const struct stProgSection progsec) {
         Append(progsec);
         return 0;
      };
      int Insert(CMTerm1Doc::stProg prog)   {
         Progs.insert(Progs.begin(), prog);
         return 0;
      }
   };
   int m_nTotalRow=0;
   bool m_bMonitoring = false;      //监控中
   bool m_bShowComments = true;   //显示注释
   bool m_bEditing = false;
   int m_TopMargin = 0;
   int m_LeftMargin = 54;      //左侧边距
   int m_CellPerLine = 16;      //每行单元数
   int m_CellWidth = 64;      //单元宽度
   int m_CellHeight = 28;      //单元高度
   int m_CommentHeight = 32;   //注释高度
   int m_LinePosY = 20;      //元件显示位置
   int m_FocusRow = 0;          //焦点行列位置
   int m_FocusCol = 0;
   int m_oldFocusRow = 0;
   int m_oldFocusCol = 0;
   int m_nCurProgStep = 0;
   int m_TextFontSize=13;
   int m_nAnnoFontSize=12;
   int m_bModified = 1;
   COLORREF BkColor = RGB(255,255,255);      //Cell背景颜色
   COLORREF BkEditColor = RGB(192, 192, 192);   //Editing Cell 背景颜色
   COLORREF TextColor =RGB(0,0,0);
   COLORREF FocusColor = RGB(128,255,128);
   COLORREF SelectedColor;
   COLORREF EditColor;
   COLORREF AnnoColor = RGB(0,0,255);
   COLORREF BlockAnnoColor;
   COLORREF MonCoilColor= RGB(0,255,255);
   COLORREF MonTextColor = RGB(0, 128, 255);
   COLORREF TraceBkColor = RGB(204,204,204);
   COLORREF TraceColor = RGB(0,255,255);
   COLORREF ForceIOColor;
   COLORREF OnlineColor = RGB(0, 255, 255);
   COLORREF ProgColor = RGB(0, 255, 0);
   COLORREF RunningColor = RGB(0, 255, 0);
   COLORREF MonitorColor = RGB(0, 255, 255);
   COLORREF AddressColor = RGB(0, 255, 255);
   CFont TextFont;
//   CFont * pOldFont;
   CFont MonTextFont;
   CFont AnnoFont;
   enum StatusBarIndicators {
      idxMachineType = 0,
      idxProgPos = 1,
      idxOnline = 2,
      idxRunning = 3,
      idxMonitor = 4,
      idxAddress = 5,
      idxInfoDisp = 6,
   };
//   CBrush brBkColor(BkColor);
// 操作
public:
   void DrawFocusRect(CDC* pDC);
   int DrawLeftRightLine(CDC* pDC, int x0, int y0, int size1=16, int size2=12);
   void DrawRelay(CDC* pDC, int x0, int y0);
   int DrawBracket(CDC* pDC, int x0, int y0, int sizex, int sty=0, int sizey = 24);
   int DrawAngleBracket(CDC* pDC, int x0, int y0, int sizex, int size2);
   void DrawOT(CDC* pDC, int x0, int y0);
   int DrawCellStat1(CDC * pDC, int x1, int y1, int sizex, int sizey, int nStat);
   int DrawCellStat2(CDC* pDC, int x1, int y1, int sizex, int sizey, int nStat);
   int DrawCellText1(CDC* pDC, CString sText, int x1, int y1, int sizex, int sizey, int nFormat=0);
   int DrawCellText2(CDC* pDC, CString sText, int x1, int y1, int sizex, int sizey, int nFormat, int nTextColor);
   int DrawCellAnno(CDC * pDC, int nRow, int nCol, CString sAnno);
   void DrawCell(CDC* pDC, int nRow, int nCol);
   int TransProgToLDS();
   int needReDraw = 1;
   int DoReDraw();
   int DrawLDSGraph(CDC* pDC);
   int ScrollToCell(int nRow, int nCol);
   int ScrollCellIntoView(int nRow, int nCol);
   int isCellInView(int nRow, int nCol);
   int CellFocusChg(int nRow, int nCol);
// 重写
public:
   virtual void OnDraw(CDC* pDC);  // 重写以绘制该视图
   virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
   virtual void OnInitialUpdate(); // 构造后第一次调用
   virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
   virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
   virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
@@ -33,19 +224,69 @@
#ifdef _DEBUG
   virtual void AssertValid() const;
   virtual void Dump(CDumpContext& dc) const;
#endif
protected:
// 生成的消息映射函数
protected:
   afx_msg void OnFilePrintPreview();
   afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
   afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
   DECLARE_MESSAGE_MAP()
public:
   afx_msg void OnMonitor();
   afx_msg void OnUpdateMonitor(CCmdUI *pCmdUI);
   afx_msg void OnProgConvert();
   afx_msg void OnUpdateProgConvert(CCmdUI *pCmdUI);
   afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
   afx_msg void OnRectSelect();
   afx_msg void OnUpdateRectSelect(CCmdUI *pCmdUI);
   afx_msg void OnTextFirst();
   afx_msg void OnUpdateTextFirst(CCmdUI *pCmdUI);
   afx_msg void OnInsertBlankLine();
   afx_msg void OnUpdateInsertBlankLine(CCmdUI *pCmdUI);
   afx_msg void OnDeleteBlankLine();
   afx_msg void OnUpdateDeleteBlankLine(CCmdUI *pCmdUI);
   afx_msg void OnDisplayComments();
   afx_msg void OnUpdateDisplayComments(CCmdUI *pCmdUI);
   afx_msg void OnUpdateMachineType(CCmdUI *pCmdUI);
   afx_msg void OnUpdateProgramPos(CCmdUI *pCmdUI);
   afx_msg void OnUpdateConnectivity(CCmdUI *pCmdUI);
   afx_msg void OnUpdateRunStatus(CCmdUI *pCmdUI);
   afx_msg void OnUpdateMonitorStatus(CCmdUI *pCmdUI);
   afx_msg void OnUpdateTargetAddress(CCmdUI *pCmdUI);
   int UpdateStatusBar(int nIndex=-1);
   virtual void OnUpdate(CView* /*pSender*/, LPARAM /*lHint*/, CObject* /*pHint*/);
   afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
   afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
   afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
   afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
   afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
   afx_msg void OnIndicatorMonitorStatus();
   afx_msg void OnUpdateIndicators(CCmdUI *pCmdUI);
   afx_msg void OnUpdateIndicatorMonitorStatus(CCmdUI *pCmdUI);
   afx_msg void OnTimer(UINT_PTR nIDEvent);
   afx_msg BOOL OnEraseBkgnd(CDC* pDC);
   afx_msg void OnSize(UINT nType, int cx, int cy);
   virtual BOOL OnScrollBy(CSize sizeScroll, BOOL bDoScroll = TRUE);
   afx_msg void OnContextMenu(CWnd* /*pWnd*/, CPoint /*point*/);
   afx_msg void OnProgCancelEdit();
   afx_msg void OnUpdateProgCancelEdit(CCmdUI *pCmdUI);
   afx_msg void OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu);
   int TransLDSToProg();
   afx_msg void OnInputIoComment();
   afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
   int ScanLDSCells(int nStartLine, int nEndLine, int nPosY, int nPosX, int nLevel, stProgSection & progsec, CString & sProgSec, int &nSteps);
   void SetCellToView(stCell cell1);
};
#ifndef _DEBUG  // MTerm1View.cpp 中的调试版本
#ifndef _DEBUG  // MultiTerminal2View.cpp 中的调试版本
inline CMTerm1Doc* CMTerm1View::GetDocument() const
   { return reinterpret_cast<CMTerm1Doc*>(m_pDocument); }
#endif