zxd
2023-09-14 d34256830982fb9ea822c1e9b874c3b7fa0a614d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
 
// MultiTerminal2View.h: CMTerm1View 类的接口
//
 
#pragma once
 
#include <memory>
#include <vector>
 
#include "MTerm1Doc.h"
class CMTerm1View : public CScrollView
{
protected: // 仅从序列化创建
    CMTerm1View() noexcept;
    DECLARE_DYNCREATE(CMTerm1View)
 
// 特性
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();
 
    /// <summary>
    /// Flag::是否需要重绘视图,默认为1=>true
    /// </summary>
    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);
 
// 实现
public:
    virtual ~CMTerm1View();
#ifdef _DEBUG
    virtual void AssertValid() const;
    virtual void Dump(CDumpContext& dc) const;
 
#endif
 
protected:
 
// 生成的消息映射函数
protected:
    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  // MultiTerminal2View.cpp 中的调试版本
inline CMTerm1Doc* CMTerm1View::GetDocument() const
   { return reinterpret_cast<CMTerm1Doc*>(m_pDocument); }
#endif