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