QuakeGod
2023-10-23 4dfb88353b3671a71bc397d5f210d71f67f8fb04
提交 | 用户 | age
0ed438 1 
418cb3 2 // MultiTerminal2View.h: CMTerm1View 类的接口
0ed438 3 //
Q 4
5 #pragma once
6
418cb3 7 #include <memory>
Q 8 #include <vector>
4ed7fc 9 #include <stack>
0ed438 10
418cb3 11 #include "MTerm1Doc.h"
Q 12 class CMTerm1View : public CScrollView
0ed438 13 {
Q 14 protected: // 仅从序列化创建
15     CMTerm1View() noexcept;
16     DECLARE_DYNCREATE(CMTerm1View)
17
18 // 特性
19 public:
418cb3 20     CMFCStatusBar * m_pStatusBar;
0ed438 21     CMTerm1Doc* GetDocument() const;
418cb3 22
Q 23     //从文档获取程序
24
25     //文档变动通知
26     enum enCellType{
27         typeNone=0,
28         typeLine1=1, //横线
29         typeLine2,     //竖线
30         typeLine3,
31         typeLine4,
32         typeLine5,
33         typeLine6,
34         typeLine7,
35         typeLine8,
36         typeLine9,
37         typeLine10,
38         typeLine11,
39
40         typeNO=12,
41         typeNC=13,
42         typePP=14,  //上升沿
43         typePN=15,  //下降沿
44         typeNOT=16,
45         typeDF = 17,
ad1b4b 46
418cb3 47         typeDF_ = 18, 
Q 48         typeOUT=19,
49         typeSET=20,
50         typeRESET=21,
51
52         typeCMP,
df0321 53         typeExt1,    //23 0x17    //被前面的指令占用的空间
418cb3 54         typeExt2,
Q 55         typeExt3,
56
57         typeTM=30,        //定时器
58         typeFN1=40,        //1个参数的函数
59         typeFN2=50,        //2个参数的函数
60         typeFN3=60,        //3个参数的函数
61
62         typeCoil=99,
63
64     };
65     struct stCell
66     {
df0321 67         int nType;                //单元类型。
Q 68         int nProgStep;            //对应程序的步数
69         int bFocused = 0;        //热点选中
70         int bSelected = 0;        //选中
71         int bEditing = 0;        //编辑中
72         int bModified = 0;        //被修改了
418cb3 73
df0321 74         int bErrFocus = 0;        //错误热点
418cb3 75
df0321 76         int bLeftLineUp = 0;    //左侧向上竖线
Q 77         int bLeftLineDn = 0;    //左侧向下竖线
78         int nStat = 0;            //当前状态//   监控时根据状态,显示数值或色块
79         int nTrace = 0;            //当前跟踪状态
80 //        int nDataWidth = 0;
81         int nDataType=0;        //参数数据类型
82         int nDataAddr=0;        //参数数据地址/值
83         CString sParam;            //参数名
84         CString sCoilName;        //线圈名
418cb3 85         void clear() { 
Q 86             nType = 0; bFocused = 0; bSelected = 0; bEditing = 0; bModified = 0;
87             bLeftLineUp = 0; bLeftLineDn = 0; nStat = 0;
df0321 88             nDataType = 0; nDataAddr = 0;
418cb3 89             sParam.Empty(); sCoilName.Empty();
Q 90         }
91     };
92     stCell Cells[2000][16] = { 0 };
93
94     struct stProgSection
95     {
96         std::vector <CMTerm1Doc::stProg> Progs;
97         int Append(CMTerm1Doc::stProg prog)    {
98             Progs.push_back(prog);
99             return 0;
100         };
101         int Append(struct stProgSection progsec){
102             int n=(int)progsec.Progs.size();
103             for (int i = 0; i < n; i++) {
104                 Progs.push_back(progsec.Progs[i]);
105             }
106             return 0;
107         };
108         int operator+=(const struct stProgSection progsec) { 
109             Append(progsec);
110             return 0; 
111         };
112
113         int Insert(CMTerm1Doc::stProg prog)    {
114             Progs.insert(Progs.begin(), prog);
115             return 0;
116         }
117     };
4dfb88 118     std::pair<int, int> popsPoint[100];
Q 119     
120     int nPSHS = -1;
121     bool firstCoil = true;//本段第一个单元格
418cb3 122
4dfb88 123     bool isPops = false;
418cb3 124     int m_nTotalRow=0;
Q 125     bool m_bMonitoring = false;        //监控中
126     bool m_bShowComments = true;    //显示注释
127
128     bool m_bEditing = false;
129
130     int m_TopMargin = 0;        
131     int m_LeftMargin = 54;        //左侧边距
132     int m_CellPerLine = 16;        //每行单元数
d34256 133      int m_CellWidth = 64;        //单元宽度
418cb3 134     int m_CellHeight = 28;        //单元高度
Q 135     int m_CommentHeight = 32;    //注释高度
136
137     int m_LinePosY = 20;        //元件显示位置
138
d34256 139      int m_FocusRow = 0;             //焦点行列位置
418cb3 140     int m_FocusCol = 0;
d34256 141
418cb3 142     int m_oldFocusRow = 0;
Q 143     int m_oldFocusCol = 0;
144     int m_nCurProgStep = 0;
145     int m_TextFontSize=13;
146     int m_nAnnoFontSize=12;
147
148     int m_bModified = 1;
149
150     COLORREF BkColor = RGB(255,255,255);        //Cell背景颜色
151     COLORREF BkEditColor = RGB(192, 192, 192);    //Editing Cell 背景颜色
152
153     COLORREF TextColor =RGB(0,0,0);
154     COLORREF FocusColor = RGB(128,255,128);
155     COLORREF SelectedColor;
156     COLORREF EditColor;
157     COLORREF AnnoColor = RGB(0,0,255);
158     COLORREF BlockAnnoColor;
159     COLORREF MonCoilColor= RGB(0,255,255);
160     COLORREF MonTextColor = RGB(0, 128, 255);
161
162     COLORREF TraceBkColor = RGB(204,204,204);
163     COLORREF TraceColor = RGB(0,255,255);
164     COLORREF ForceIOColor;
165
166     COLORREF OnlineColor = RGB(0, 255, 255);
167     COLORREF ProgColor = RGB(0, 255, 0);
168     COLORREF RunningColor = RGB(0, 255, 0);
169     COLORREF MonitorColor = RGB(0, 255, 255);
170     COLORREF AddressColor = RGB(0, 255, 255);
171
172     CFont TextFont;
173 //    CFont * pOldFont;
174     CFont MonTextFont;
175     CFont AnnoFont;
176
177
178     enum StatusBarIndicators {
179         idxMachineType = 0,
180         idxProgPos = 1,
181         idxOnline = 2,
182         idxRunning = 3,
183         idxMonitor = 4,
184         idxAddress = 5,
185         idxInfoDisp = 6,
186     };
187
188 //    CBrush brBkColor(BkColor);
189
0ed438 190
Q 191 // 操作
192 public:
418cb3 193     void DrawFocusRect(CDC* pDC);
Q 194     int DrawLeftRightLine(CDC* pDC, int x0, int y0, int size1=16, int size2=12);
195     void DrawRelay(CDC* pDC, int x0, int y0);
196     int DrawBracket(CDC* pDC, int x0, int y0, int sizex, int sty=0, int sizey = 24);
197     int DrawAngleBracket(CDC* pDC, int x0, int y0, int sizex, int size2);
198     void DrawOT(CDC* pDC, int x0, int y0);
199
200     int DrawCellStat1(CDC * pDC, int x1, int y1, int sizex, int sizey, int nStat);
201     int DrawCellStat2(CDC* pDC, int x1, int y1, int sizex, int sizey, int nStat);
202     int DrawCellText1(CDC* pDC, CString sText, int x1, int y1, int sizex, int sizey, int nFormat=0);
203     int DrawCellText2(CDC* pDC, CString sText, int x1, int y1, int sizex, int sizey, int nFormat, int nTextColor);
204     int DrawCellAnno(CDC * pDC, int nRow, int nCol, CString sAnno);
205
206     void DrawCell(CDC* pDC, int nRow, int nCol);
207     int TransProgToLDS();
d34256 208
Z 209     /// <summary>
210     /// Flag::是否需要重绘视图,默认为1=>true
211     /// </summary>
418cb3 212     int needReDraw = 1;
Q 213
214     int DoReDraw();
215     int DrawLDSGraph(CDC* pDC);
216
217     int ScrollToCell(int nRow, int nCol);
218
219     int ScrollCellIntoView(int nRow, int nCol);
220     int isCellInView(int nRow, int nCol);
df0321 221     int CellFocusChg(int nRow, int nCol);
0ed438 222
ad1b4b 223     std::pair<int, CString> CMTerm1View::LDSCheckRule();
Z 224
0ed438 225 // 重写
Q 226 public:
227     virtual void OnDraw(CDC* pDC);  // 重写以绘制该视图
228     virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
229 protected:
418cb3 230     virtual void OnInitialUpdate(); // 构造后第一次调用
0ed438 231     virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
Q 232     virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
233     virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
234
235 // 实现
236 public:
237     virtual ~CMTerm1View();
238 #ifdef _DEBUG
239     virtual void AssertValid() const;
240     virtual void Dump(CDumpContext& dc) const;
418cb3 241
0ed438 242 #endif
Q 243
244 protected:
245
246 // 生成的消息映射函数
247 protected:
248     DECLARE_MESSAGE_MAP()
418cb3 249 public:
Q 250     afx_msg void OnMonitor();
251     afx_msg void OnUpdateMonitor(CCmdUI *pCmdUI);
252     afx_msg void OnProgConvert();
253     afx_msg void OnUpdateProgConvert(CCmdUI *pCmdUI);
254     afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
255     afx_msg void OnRectSelect();
256     afx_msg void OnUpdateRectSelect(CCmdUI *pCmdUI);
257     afx_msg void OnTextFirst();
258     afx_msg void OnUpdateTextFirst(CCmdUI *pCmdUI);
259     afx_msg void OnInsertBlankLine();
260     afx_msg void OnUpdateInsertBlankLine(CCmdUI *pCmdUI);
261     afx_msg void OnDeleteBlankLine();
262     afx_msg void OnUpdateDeleteBlankLine(CCmdUI *pCmdUI);
263     afx_msg void OnDisplayComments();
264     afx_msg void OnUpdateDisplayComments(CCmdUI *pCmdUI);
265
266     afx_msg void OnUpdateMachineType(CCmdUI *pCmdUI);
267     afx_msg void OnUpdateProgramPos(CCmdUI *pCmdUI);
268     afx_msg void OnUpdateConnectivity(CCmdUI *pCmdUI);
269     afx_msg void OnUpdateRunStatus(CCmdUI *pCmdUI);
270     afx_msg void OnUpdateMonitorStatus(CCmdUI *pCmdUI);
271     afx_msg void OnUpdateTargetAddress(CCmdUI *pCmdUI);
272
273     int UpdateStatusBar(int nIndex=-1);
274
275     virtual void OnUpdate(CView* /*pSender*/, LPARAM /*lHint*/, CObject* /*pHint*/);
276     afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
277     afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
278     afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
279     afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
280     afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
281
282     afx_msg void OnIndicatorMonitorStatus();
283     afx_msg void OnUpdateIndicators(CCmdUI *pCmdUI);
284
285     afx_msg void OnUpdateIndicatorMonitorStatus(CCmdUI *pCmdUI);
286     afx_msg void OnTimer(UINT_PTR nIDEvent);
287     afx_msg BOOL OnEraseBkgnd(CDC* pDC);
288     afx_msg void OnSize(UINT nType, int cx, int cy);
289     virtual BOOL OnScrollBy(CSize sizeScroll, BOOL bDoScroll = TRUE);
290
291     afx_msg void OnContextMenu(CWnd* /*pWnd*/, CPoint /*point*/);
292     afx_msg void OnProgCancelEdit();
293     afx_msg void OnUpdateProgCancelEdit(CCmdUI *pCmdUI);
294     afx_msg void OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu);
295     int TransLDSToProg();
296     afx_msg void OnInputIoComment();
297     afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
298     int ScanLDSCells(int nStartLine, int nEndLine, int nPosY, int nPosX, int nLevel, stProgSection & progsec, CString & sProgSec, int &nSteps);
4ed7fc 299     int ScanLDSCells2(int nStartLine, int nEndLine, int nPosY, int nPosX, int nSizeX, int nLevel, stProgSection& progsec, CString& sProgSec, int& nSteps);
Z 300     int CMTerm1View::Translate2Prog(
301         int nType, int nCurPosY, int nCurPosX, CString sCellName,
302         stProgSection& progsec, CString& sProgSec, int& nSteps);
ad1b4b 303     void SetCellToView(stCell cell1, int flag = 0);//modify0919zxd
d34256 304     
0ed438 305 };
Q 306
418cb3 307 #ifndef _DEBUG  // MultiTerminal2View.cpp 中的调试版本
0ed438 308 inline CMTerm1Doc* CMTerm1View::GetDocument() const
Q 309    { return reinterpret_cast<CMTerm1Doc*>(m_pDocument); }
310 #endif
311