Yao Chunli
2022-05-28 eea0893be9d4ef175ab26e8fea51d41fa33477ce
提交 | 用户 | age
0ed438 1 
Q 2 // MultiTerminal2View.cpp: CMTerm2View 类的实现
3 //
4
5 #include "pch.h"
6 #include "framework.h"
7 // SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的
8 // ATL 项目中进行定义,并允许与该项目共享文档代码。
9 #ifndef SHARED_HANDLERS
10 #include "MTerm2.h"
11 #endif
12
13 #include "MTerm2Doc.h"
14 #include "MTerm2View.h"
15 #include "ChildFrm.h"
16 #include "DialogSetCoil.h"
17 #include "DialogSetData.h"
18 #include "DialogIoComment.h"
0a20f7 19 #include "KDefine.h"
0ed438 20
Q 21 #ifdef _DEBUG
22 #define new DEBUG_NEW
23 #endif
24
25
26 // CMTerm2View
27
28 IMPLEMENT_DYNCREATE(CMTerm2View, CScrollView)
29
30 BEGIN_MESSAGE_MAP(CMTerm2View, CScrollView)
31     // 标准打印命令
32     ON_COMMAND(ID_FILE_PRINT, &CScrollView::OnFilePrint)
33     ON_COMMAND(ID_FILE_PRINT_DIRECT, &CScrollView::OnFilePrint)
34     ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CScrollView::OnFilePrintPreview)
35
36     ON_WM_CREATE()
37     ON_WM_TIMER()
38     ON_WM_ERASEBKGND()
39     ON_WM_SIZE()
40
41     ON_WM_LBUTTONDOWN()
42     ON_WM_LBUTTONUP()
43     ON_WM_LBUTTONDBLCLK()
44     ON_WM_RBUTTONDOWN()
45     ON_WM_RBUTTONUP()
46     ON_WM_CONTEXTMENU()
47     ON_WM_INITMENUPOPUP()
48
49     ON_COMMAND(ID_RECT_SELECT, &CMTerm2View::OnRectSelect)
50     ON_UPDATE_COMMAND_UI(ID_RECT_SELECT, &CMTerm2View::OnUpdateRectSelect)
51     ON_COMMAND(ID_TEXT_FIRST, &CMTerm2View::OnTextFirst)
52     ON_UPDATE_COMMAND_UI(ID_TEXT_FIRST, &CMTerm2View::OnUpdateTextFirst)
53     ON_COMMAND(ID_INSERT_BLANK_LINE, &CMTerm2View::OnInsertBlankLine)
54     ON_UPDATE_COMMAND_UI(ID_INSERT_BLANK_LINE, &CMTerm2View::OnUpdateInsertBlankLine)
55     ON_COMMAND(ID_DELETE_BLANK_LINE, &CMTerm2View::OnDeleteBlankLine)
56     ON_UPDATE_COMMAND_UI(ID_DELETE_BLANK_LINE, &CMTerm2View::OnUpdateDeleteBlankLine)
57     ON_COMMAND(ID_DISPLAY_COMMENTS, &CMTerm2View::OnDisplayComments)
58     ON_UPDATE_COMMAND_UI(ID_DISPLAY_COMMENTS, &CMTerm2View::OnUpdateDisplayComments)
59     ON_COMMAND(ID_MONITOR, &CMTerm2View::OnMonitor)
60     ON_UPDATE_COMMAND_UI(ID_MONITOR, &CMTerm2View::OnUpdateMonitor)
61     ON_COMMAND(ID_PROG_CONVERT, &CMTerm2View::OnProgConvert)
62     ON_UPDATE_COMMAND_UI(ID_PROG_CONVERT, &CMTerm2View::OnUpdateProgConvert)
63     ON_COMMAND(ID_PROG_CANCEL_EDIT, &CMTerm2View::OnProgCancelEdit)
64     ON_UPDATE_COMMAND_UI(ID_PROG_CANCEL_EDIT, &CMTerm2View::OnUpdateProgCancelEdit)
65     ON_COMMAND(ID_INPUT_IO_COMMENT, &CMTerm2View::OnInputIoComment)
66
67
68     //    ON_UPDATE_COMMAND_UI_RANGE(ID_INDICATOR_MACHINE_TYPE, ID_INDICATOR_INFO_DISPLAY, OnUpdateIndicators)
69     ON_COMMAND_RANGE(ID_INDICATOR_MACHINE_TYPE, ID_INDICATOR_INFO_DISPLAY, NULL)
70 //    ON_UPDATE_COMMAND_UI(ID_INDICATOR_MACHINE_TYPE, &CMTerm2View::OnUpdateMachineType)
71 //    ON_UPDATE_COMMAND_UI(ID_INDICATOR_PROGRAM_POS, &CMTerm2View::OnUpdateProgramPos)
72 //    ON_UPDATE_COMMAND_UI(ID_INDICATOR_CONNECTIVITY, &CMTerm2View::OnUpdateConnectivity)
73 //    ON_UPDATE_COMMAND_UI(ID_INDICATOR_RUN_STATUS, &CMTerm2View::OnUpdateRunStatus)
74 //    ON_UPDATE_COMMAND_UI(ID_INDICATOR_MONITOR_STATUS, &CMTerm2View::OnUpdateMonitorStatus)
75 //    ON_UPDATE_COMMAND_UI(ID_INDICATOR_TARGET_ADDRESS, &CMTerm2View::OnUpdateTargetAddress)
76 //    ON_UPDATE_COMMAND_UI(ID_INDICATOR_INFO_DISPLAY, &CMTerm2View::OnUpdateDisplayComments)
77
78 //    ON_COMMAND(ID_INDICATOR_MONITOR_STATUS, &CMTerm2View::OnIndicatorMonitorStatus)
79 //    ON_UPDATE_COMMAND_UI(ID_INDICATOR_MONITOR_STATUS, &CMTerm2View::OnUpdateIndicatorMonitorStatus)
80 ON_WM_KEYDOWN()
81 END_MESSAGE_MAP()
82
83
84 // CMTerm2View 构造/析构
85
86 CMTerm2View::CMTerm2View() noexcept
87 {
88     // TODO: 在此处添加构造代码
89
90 }
91
92 CMTerm2View::~CMTerm2View()
93 {
94 }
95
96 BOOL CMTerm2View::PreCreateWindow(CREATESTRUCT& cs)
97 {
98     // TODO: 在此处通过修改
99     //  CREATESTRUCT cs 来修改窗口类或样式
100
101     return CScrollView::PreCreateWindow(cs);
102 }
103
104 void CMTerm2View::OnInitialUpdate()
105 {
106     CScrollView::OnInitialUpdate();
107     TextFont.CreateFont(13, 0, 0, 0, FW_NORMAL, FALSE, FALSE, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_ROMAN, _T("宋体"));
108     MonTextFont.CreateFont(12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_ROMAN, _T("宋体"));
109     AnnoFont.CreateFont(12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_ROMAN, _T("宋体"));
110     m_pStatusBar = ((CChildFrame *)GetParentFrame())->GetStatusBar();
111     CSize sizeTotal;
112     // TODO: 计算此视图的合计大小
113     sizeTotal.cx = m_LeftMargin + m_CellWidth* m_CellPerLine + m_CellWidth *2;
114     sizeTotal.cy = 2000;
115     SetScrollSizes(MM_TEXT, sizeTotal);
116     CString s1;
117     SetTimer(1, 50,NULL);
118     SetTimer(2, 10, NULL);
119
120 }
121
122 // CMTerm2View 绘图
123
124 void CMTerm2View::OnDraw(CDC* pDC)
125 {
126     CMTerm2Doc* pDoc = GetDocument();
127     ASSERT_VALID(pDoc);
128     if (!pDoc)
129         return;
130
131     // TODO: 在此处为本机数据添加绘制代码
132     CString s1;
133     needReDraw = 1;
134     DrawLDSGraph(pDC);
135     needReDraw = 0;
136 }
137
138 // CMTerm2View 打印
139
140 BOOL CMTerm2View::OnPreparePrinting(CPrintInfo* pInfo)
141 {
142     // 默认准备
143     return DoPreparePrinting(pInfo);
144 }
145
146 void CMTerm2View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
147 {
148     // TODO: 添加额外的打印前进行的初始化过程
149 }
150
151 void CMTerm2View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
152 {
153     // TODO: 添加打印后进行的清理过程
154 }
155
156
157 // CMTerm2View 诊断
158
159 #ifdef _DEBUG
160 void CMTerm2View::AssertValid() const
161 {
162     CScrollView::AssertValid();
163 }
164
165 void CMTerm2View::Dump(CDumpContext& dc) const
166 {
167     CScrollView::Dump(dc);
168 }
169
170 CMTerm2Doc* CMTerm2View::GetDocument() const // 非调试版本是内联的
171 {
172     ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMTerm2Doc)));
173     return (CMTerm2Doc*)m_pDocument;
174 }
175 #endif //_DEBUG
176
177 int CMTerm2View::OnCreate(LPCREATESTRUCT lpCreateStruct)
178 {
179     if (CScrollView::OnCreate(lpCreateStruct) == -1)
180         return -1;
181
182     // TODO:  在此添加您专用的创建代码
183
184     return 0;
185 }
186
187 int CMTerm2View::DoReDraw()
188 {
189     // TODO: 在此处添加实现代码.
190     CPoint scroll1;
191     scroll1 = this->GetScrollPosition();
192
193     CClientDC dc1(this);
194     XFORM xform1;
195     xform1.eM11 = 1;
196     xform1.eM12 = 0;
197     xform1.eM21 = 0;
198     xform1.eM22 = 1;
65f713 199     xform1.eDx = float(-scroll1.x);
Q 200     xform1.eDy = float(-scroll1.y);
0ed438 201
Q 202     XFORM xform2 = { 1, 0, 0, 1, 0, 0 };
203
204     dc1.SetGraphicsMode(GM_ADVANCED);
205     dc1.SetWorldTransform(&xform1);
206
207     DrawLDSGraph(&dc1);
208     
209     return 0;
210 }
211
0a20f7 212 int CMTerm2View::ScrollToCell(int nRow, int nCol)
Q 213 {
214     int CellTotalHeight = m_CellHeight + (m_bShowComments ? m_CommentHeight : 0);
215
216     CSize sizeTotal;
217     // TODO: 计算此视图的合计大小
218     sizeTotal.cx = m_LeftMargin + m_CellWidth * m_CellPerLine + m_CellWidth * 2;
219     sizeTotal.cy = m_TopMargin + CellTotalHeight * (m_nTotalRow );
220     CSize sizeSb;
221     GetScrollBarSizes(sizeSb);
222     POINT pt1;
223     pt1.x = 0;
224     pt1.y = nRow * CellTotalHeight;
225     ScrollToPosition(pt1);
226     return 0;
227 }
228
229 int CMTerm2View::ScrollCellIntoView(int nRow, int nCol)
230 {
231     int CellTotalHeight = m_CellHeight + (m_bShowComments ? m_CommentHeight : 0);
232     return 0;
233 }
234
235 int CMTerm2View::isCellInView(int nRow, int nCol)
236 {
237     int CellTotalHeight = m_CellHeight + (m_bShowComments ? m_CommentHeight : 0);
238     return 0;
239 }
0ed438 240
Q 241 int CMTerm2View::DrawLDSGraph(CDC* pDC)
242 {
243     // TODO: 在此处添加实现代码.
244     CString s1;
245     CMTerm2Doc* pDoc = GetDocument();
246     ASSERT_VALID(pDoc);
247     if (!pDoc)    return false;
248     if (m_bMonitoring) {
249         pDoc->DoPLCMonitor();
250     }
251     int x1, y1, x2, y2;
252     //    RECT rect1;
253     int CellTotalHeight = m_CellHeight + (m_bShowComments ? m_CommentHeight : 0);
254
255     int nDataType, nDataAddr;
256     int nStat;
257     CBrush br0(BkColor);
258     CBrush br01(BkEditColor);
259     int nRow, nCol;
260     CRect rect0;
261     this->GetClientRect(&rect0);
262     int viewWidth = rect0.Width();
263     CPoint scroll1;
264     scroll1 = this->GetScrollPosition();
265
266     int nFirstVisibleLine;
267     int nLastVisibleLine;
268
269     nFirstVisibleLine = (scroll1.y - m_TopMargin) / CellTotalHeight;
270     nLastVisibleLine = (rect0.Height() + scroll1.y - m_TopMargin) / CellTotalHeight + 1;
271     if (nFirstVisibleLine < 0) { nFirstVisibleLine = 0; }
272     if (nLastVisibleLine < 0) { nLastVisibleLine = 0; }
273
274     CFont *pOldFont;
275     pOldFont = (CFont *)pDC->SelectObject(&TextFont);
276     
277
278     for (int i = nFirstVisibleLine; i < nLastVisibleLine && i < 1000; i++) {
279         // 画一行 单元
280         nRow = i;
281         int x0, y0;
282         x0 = m_LeftMargin;
283         y0 = m_TopMargin + CellTotalHeight * i;
284         y2 = y0 + CellTotalHeight;
285         //画背景
286         if (needReDraw) {
287             // 左半部分
288             if (scroll1.x < x0) {
289                 CRect rect1(scroll1.x, y0, x0, y2);
290                 pDC->FillRect(&rect1, &br0);
291             }
292             //中间部分
293             x1 = max(scroll1.x, x0);
294             x2 = min(scroll1.x + viewWidth, x0 + m_CellPerLine * m_CellWidth);
295             CRect rect2(x1, y0, x2, y2);
296             //背景颜色
297             if (!Cells[nRow][0].bEditing){
298                 pDC->FillRect(&rect2, &br0);
299             }    else {
300                 pDC->FillRect(&rect2, &br01);
301             }
302             // 右边部分
303             if (x2 < scroll1.x + viewWidth)    {
304                 CRect rect3(x2, y0, scroll1.x + viewWidth, y2);
305                 pDC->FillRect(&rect3, &br0);
306             }
307
308             if (m_FocusRow == i)     DrawFocusRect(pDC);
309
310         }
311         //*
312         // 画本行左侧母线
313         x1 = m_LeftMargin;
314         y1 = m_TopMargin + CellTotalHeight * i;
315         x2 = x1;
316         y2 = y1 + CellTotalHeight;
317
318         pDC->MoveTo(x1, y1);
319         pDC->LineTo(x2, y2);
320         //画左侧母线小短横线
321
322
323         x1 = m_LeftMargin;
324         y1 = m_TopMargin + CellTotalHeight * i + m_LinePosY;
325         x2 = x1 + 3;
326         y2 = y1;
327         pDC->MoveTo(x1, y1);
328         pDC->LineTo(x2, y2);
329
330         // 如果本行第一个ST是程序段的起始,输出程序步数
331         //*/
332         int nType = Cells[nRow][0].nType;
333         int nProgSetp = Cells[nRow][0].nProgStep;
334         if (nType == typeNO || nType == typeNC || nType == typeCMP) {
335             int nPairTo = pDoc->Progs[nProgSetp].PairTo;
336             int nPairOp = 0;
337             if (nPairTo) nPairOp = pDoc->Progs[nPairTo].nOpType1;
338             if (nPairOp == 0) { //程序段开始
339                 //在当前行的左侧输出 当前 程序步数
340                 s1.Format(_T("  %d"), nProgSetp);
341                 CRect rect2(0, m_TopMargin + CellTotalHeight * i + m_LinePosY - 8, m_LeftMargin - 4, m_TopMargin + CellTotalHeight * i + m_LinePosY + 14);
342                 pDC->DrawText(s1, &rect2, DT_RIGHT);
343
344             }
345         }
346         // 获取数据  并显示各单元
347         for (int j = 0; j < m_CellPerLine; j++) {
348             nCol = j;
349             nDataType = Cells[nRow][nCol].nDataType;
350             nDataAddr = Cells[nRow][nCol].nDataAddr;
351             if ((nDataType&TYPEDATA) == TYPEDATA) {
352                 nStat = pDoc->GetVarData(nDataType, nDataAddr);
353             }
354             else {
355                 nStat = pDoc->GetCoilValue(nDataType, nDataAddr);
356             }
357             Cells[nRow][nCol].nStat = nStat;
358             nType = Cells[nRow][nCol].nType;
359             if (nType == typeNO || nType == typeNC || nType == typeCMP || nType == typeTM)
360             {
361                 int nProgStep = Cells[nRow][nCol].nProgStep;
362                 int nBinProgStep = pDoc->Progs[nProgStep].nBinStep;
363                 Cells[nRow][nCol].nTrace = pDoc->ProgTrace[nBinProgStep];
364             }
365             DrawCell(pDC, i, j);
366         }
367
368
369         // 画本行右侧母线
370 //*
371         x1 = m_LeftMargin + m_CellWidth * m_CellPerLine;
372         y1 = m_TopMargin + CellTotalHeight * i;
373         x2 = x1;
374         y2 = y1 + CellTotalHeight;
375
376         pDC->MoveTo(x1, y1);
377         pDC->LineTo(x2, y2);
378         // 画本行右侧母线小短横线
379         x1 = m_LeftMargin + m_CellWidth * m_CellPerLine;
380         y1 = m_TopMargin + CellTotalHeight * i + m_LinePosY;
381         x2 = x1 - 3;
382         y2 = y1;
383         pDC->MoveTo(x1, y1);
384         pDC->LineTo(x2, y2);
385
386         //*/
387     }
388     pDC->SelectObject(pOldFont);
389     CRect rect2(0, 30, 240, 100);
390     //    pDC->DrawText(_T("这是测试字符串111,222,33,aa,bb,cc"), &rect2, 0);
391     s1.Format(_T("This is New Info.."));
392     needReDraw = 0;
393     return 0;
394 }
395
396
397 void  CMTerm2View::DrawFocusRect(CDC* pDC)
398 {
399 //    DrawCell(pDC, m_oldFocusRow, m_oldFocusCol);
400     CPen BluePen(PS_SOLID, 3, FocusColor);
401     CPen * pOldPen = pDC->SelectObject(&BluePen);
402     //CBrush * pOldBrush = ;
403     pDC->SelectStockObject(NULL_BRUSH);
404     int x0, y0;
405     //    int x1, y1, x2, y2;
406     RECT rect1;
407     int CellTotalHeight = m_CellHeight + (m_bShowComments ? m_CommentHeight : 0);
408
409     rect1.left = m_LeftMargin + 1 + m_CellWidth * m_FocusCol;
410     rect1.right = rect1.left + m_CellWidth - 4;
411     rect1.top = m_TopMargin + CellTotalHeight * m_FocusRow;
412     rect1.bottom = rect1.top + CellTotalHeight - 2;
413
414     x0 = rect1.left;
415     y0 = rect1.top;
416     //pDC->DrawFocusRect(&rect1);
417     pDC->Rectangle(&rect1);
418     m_oldFocusCol = m_FocusCol;
419     m_oldFocusRow = m_FocusRow;
420
421     pDC->SelectObject(pOldPen);
422 //    pDC->SelectObject(poldBrush);
423 }
424
425
426 int CMTerm2View::DrawLeftRightLine(CDC* pDC, int x0, int y0, int size1, int size2)
427 {
428     // TODO: 在此处添加实现代码.
429     int x1, y1, x2, y2;
430     //画左侧横线
431     x1 = x0;
432     y1 = y0 + m_LinePosY;
433     x2 = x1 + size1;
434     y2 = y1;
435     pDC->MoveTo(x1, y1);
436     pDC->LineTo(x2, y2);
437
438     //画右侧横线
439     x1 = x0 + size1 +size2;
440     y1 = y0 + m_LinePosY;
441     x2 = x0 + m_CellWidth;
442     y2 = y1;
443     pDC->MoveTo(x1, y1);
444     pDC->LineTo(x2, y2);
445     return 0;
446 }
447
448
449 void CMTerm2View::DrawOT(CDC* pDC, int x0, int y0)
450 {
451     int x1, y1;
452     //画左右侧横线
453     DrawLeftRightLine(pDC, x0, y0);
454
455     x1 = x0 +16;
456     y1 = y0 + m_LinePosY;
457
458     pDC->MoveTo(x1 + 6 + 6, y1);
459     pDC->AngleArc(x1 + 6, y1, 6, 0, 360);
460 }
461
462 void  CMTerm2View::DrawRelay(CDC* pDC, int x0, int y0)
463 {
464     int x1, y1, x2, y2;
465     //画左右侧横线
466     DrawLeftRightLine(pDC, x0, y0);
467     // 画左侧竖线
468     x1 = x0+16;
469     y1 = y0 + m_LinePosY - 6;
470     x2 = x1;
471     y2 = y1 + 12;
472     pDC->MoveTo(x1, y1);
473     pDC->LineTo(x2, y2);
474     // 画右侧竖线
475     x1 = x2 + 12;
476     y1 = y1;
477     x2 = x1;
478     y2 = y1 + 12;
479     pDC->MoveTo(x1, y1);
480     pDC->LineTo(x2, y2);
481 }
482
483 int CMTerm2View::DrawBracket(CDC* pDC, int x0, int y0, int sizex, int sty, int sizey)
484 {
485     // TODO: 在此处添加实现代码.
486     int x1, y1, x2, y2;
487     // 左边的短横线
488     x1 = x0 ;
489     y1 = y0 + m_LinePosY;
490     x2 = x0 + 3;
491     y2 = y1;
492     pDC->MoveTo(x1, y1);
493     pDC->LineTo(x2, y2);
494
495     // 左方括号
496     x1 = x0 + 9;
497     y1 = y0 + sty;
498     x2 = x0 + 3;
499     y2 = y1;
500     pDC->MoveTo(x1, y1);
501     pDC->LineTo(x2, y2);
502     x2 = x2;
503     y2 = y2 + sizey;
504     pDC->LineTo(x2, y2);
505     x2 = x2 + 6;
506     y2 = y2;
507     pDC->LineTo(x2, y2);
508     // 右方括号
509     x1 = x0 + sizex - 6 - 6;
510     y1 = y0 + sty;
511     x2 = x0 + sizex -6 ;
512     y2 = y1;
513     pDC->MoveTo(x1, y1);
514     pDC->LineTo(x2, y2);
515     x2 = x2;
516     y2 = y2 + sizey;
517     pDC->LineTo(x2, y2);
518     x2 = x2 - 6;
519     y2 = y2;
520     pDC->LineTo(x2, y2);
521     // 右边的短横线
522     x1 = x0 + sizex - 6;
523     y1 = y0 + m_LinePosY;
524     x2 = x0 + sizex ;
525     y2 = y1;
526     pDC->MoveTo(x1, y1);
527     pDC->LineTo(x2, y2);
528     return 0;
529 }
530 int CMTerm2View::DrawAngleBracket(CDC* pDC, int x0, int y0, int size1, int size2)
531 {
532     // TODO: 在此处添加实现代码.
533     int x1,y1,x2, y2;
534     DrawLeftRightLine(pDC, x0, y0, size1, size2);
535     // 左尖括号
536     x1 = x0 + size1 + 6;
537     y1 = y0 + m_LinePosY -6;
538     x2 = x1 -6;
539     y2 = y1 +6 ;
540     pDC->MoveTo(x1, y1);
541     pDC->LineTo(x2, y2);
542     x2 = x2 +6;
543     y2 = y2 + 6;
544     pDC->LineTo(x2, y2);
545     // 右尖括号
546     x1 = x0 + size1 + size2 - 6;
547     y1 = y0 + m_LinePosY - 6;
548     x2 = x1 + 6;
549     y2 = y1 + 6 ;
550     pDC->MoveTo(x1, y1);
551     pDC->LineTo(x2, y2);
552     x2 = x2 -6 ;
553     y2 = y2 + 6;
554     pDC->LineTo(x2, y2);
555     return 0;
556 }
557
558 int CMTerm2View::DrawCellStat1(CDC * pDC, int x1, int y1, int sizex, int sizey, int nStat)
559 {
560     // TODO: 在此处添加实现代码.
561     CRect rect1;
562     rect1.left = x1;
563     rect1.top = y1;
564     rect1.right = x1+sizex;
565     rect1.bottom = y1+sizey;
566
567     CBrush br0(BkColor);
568     CBrush br1(MonCoilColor);
569     if (m_bMonitoring) {
570         if (nStat) {
571             pDC->FillRect(&rect1, &br1);
572         }else{
573             pDC->FillRect(&rect1, &br0);
574         }
575     }
576     return 0;
577 }
578
579 int CMTerm2View::DrawCellStat2(CDC* pDC, int x1, int y1, int sizex, int sizey, int nStat)
580 {
581     // TODO: 在此处添加实现代码.
582     CRect rect1;
583     rect1.left = x1;
584     rect1.top = y1;
585     rect1.right = x1+sizex;
586     rect1.bottom = y1+sizey;
587     CBrush br2(TraceBkColor);
588     CBrush br3(TraceColor);
589     if (m_bMonitoring) {
590         if (nStat) {
591             pDC->FillRect(&rect1, &br3);
592         }else{
593             pDC->FillRect(&rect1, &br2);
594         }
595     }
596     return 0;
597 }
598
599 int CMTerm2View::DrawCellText1(CDC* pDC, CString sText, int x1, int y1, int sizex, int sizey, int nFormat)
600 {
601     // TODO: 在此处添加实现代码.
602     CRect rect1;
603     rect1.left = x1;
604     rect1.top = y1;
605     rect1.right = rect1.left + sizex;
606     rect1.bottom = rect1.top + sizey;
607     pDC->DrawText(sText, &rect1, nFormat);
608     return 0;
609 }
610
611 int CMTerm2View::DrawCellText2(CDC* pDC, CString sText, int x1, int y1, int sizex, int sizey, int nFormat, int nTextColor)
612 {
613     // TODO: 在此处添加实现代码.
614     COLORREF clrOld = pDC->SetTextColor(nTextColor);
615     CRect rect1;
616     rect1.left = x1;
617     rect1.top = y1;
618     rect1.right = rect1.left + sizex;
619     rect1.bottom = rect1.top + sizey;
620     pDC->DrawText(sText, &rect1, nFormat);
621     pDC->SetTextColor(clrOld);
622     return 0;
623 }
624
625 int CMTerm2View::DrawCellAnno(CDC * pDC, int nRow, int nCol, CString sAnno)
626 {
627     // TODO: 在此处添加实现代码.
628     if (!m_bShowComments) return 0;
629     if (!needReDraw) return 0;
630     CMTerm2Doc * pDoc = GetDocument();
631     int x0, y0;
632     int CellTotalHeight = m_CellHeight + (m_bShowComments ? m_CommentHeight : 0);
633     x0 = m_LeftMargin + 1 + m_CellWidth * nCol;
634     y0 = m_TopMargin + CellTotalHeight * nRow;
635
636     int nType, nAddr;
637     nType = Cells[nRow][nCol].nDataType;
638     nAddr = Cells[nRow][nCol].nDataAddr;
639     CString s1;
640     if (pDoc->GetAnno(nType, nAddr, s1)) {
641         CFont *pOldFont;
642         pOldFont = (CFont *)pDC->SelectObject(&AnnoFont);
643         DrawCellText2(pDC, s1, x0 + 2, y0 + m_LinePosY + 6, m_CellWidth-10, 32, DT_WORDBREAK, AnnoColor);
644         pDC->SelectObject(pOldFont);
645     }
646     return 0;
647 }
648
649 void CMTerm2View::DrawCell(CDC* pDC, int nRow, int nCol)
650 {
651
652     //CMTerm2Doc * pDoc= GetDocument();
653     int x0, y0;
654     int x1, y1, x2, y2;
655     RECT rect1;
656     int CellTotalHeight = m_CellHeight + (m_bShowComments ? m_CommentHeight : 0);
657
658     rect1.left = m_LeftMargin + 1 + m_CellWidth * nCol;
659     rect1.right = rect1.left + m_CellWidth;
660     rect1.top = m_TopMargin + CellTotalHeight * nRow;
661     rect1.bottom = rect1.top + CellTotalHeight;
662
663     x0 = rect1.left;
664     y0 = rect1.top;
665
666     CString s1;
667     //    pDC->DrawFocusRect(&rect1);
668     if (Cells[nRow][nCol].bLeftLineUp && nCol !=0)
669     {
670         if (needReDraw) {
671             pDC->MoveTo(x0, y0);
672             pDC->LineTo(x0, y0 + m_LinePosY);
673         }
674     }
675     if (Cells[nRow][nCol].bLeftLineDn && nCol != 0)
676     {
677         if (needReDraw) {
678             pDC->MoveTo(x0, y0 + m_LinePosY);
679             pDC->LineTo(x0, y0 + CellTotalHeight);
680         }
681     }
682     int nType = Cells[nRow][nCol].nType;
683     if (nType == typeNone)
684     {
685
686     }
687     else if (nType == typeLine1)
688     {    //Draw Line
689         //画直横线
690         if (needReDraw) {
691             pDC->MoveTo(x0, y0 + m_LinePosY);
692             pDC->LineTo(x0 + m_CellWidth, y0 + m_LinePosY);
693         }
694     }
695     else if (nType == typeLine2)
696     {    //Draw Line
697         //画直横线
698 //        pDC->MoveTo(x0, y0);
699 //        pDC->LineTo(x0, y0 + CellTotalHeight);
700     }
701     else if (nType == typeNO)
702     {
703         // Draw Coil
704         if (needReDraw) {
705             DrawRelay(pDC, x0, y0);
706             //显示文字
707             DrawCellText1(pDC, Cells[nRow][nCol].sCoilName, x0 + 2, y0, m_CellWidth, 14);
708             DrawCellAnno(pDC, nRow, nCol, _T(""));
709         }
710         if (m_bMonitoring){
711             //Draw Stat
712             DrawCellStat1(pDC, x0 + 16 + 2, y0 + m_LinePosY - 6, 8, 12, Cells[nRow][nCol].nStat);
713             // tracing
714             DrawCellStat2(pDC, x0 + 16 + 2 + 10 + 4, y0 + m_LinePosY - 4, 4, 4, Cells[nRow][nCol].nTrace);
715         }
716     }
717     else if (nType == typeNC)
718     {
719         if (needReDraw) {
720             DrawRelay(pDC, x0, y0);
721             //显示文字
722             DrawCellText1(pDC, Cells[nRow][nCol].sCoilName, x0 + 2, y0, m_CellWidth, 14);
723             DrawCellAnno(pDC, nRow, nCol, _T(""));
724             //画常闭斜线
725             x1 = x0 + 16 + 12 - 3;
726             y1 = y0 + m_LinePosY - 6;
727             x2 = x0 + 16 + 2;
728             y2 = y1 + 12;
729             pDC->MoveTo(x1, y1);
730             pDC->LineTo(x2, y2);
731         }
732         if (m_bMonitoring)
733         {
734             //Draw Stat
735             DrawCellStat1(pDC, x0 + 16 + 2, y0 + m_LinePosY - 6, 8, 12, ! Cells[nRow][nCol].nStat);
736             // tracing
737             DrawCellStat2(pDC, x0 + 16 + 2 + 10 + 4, y0 + m_LinePosY - 4, 4, 4, Cells[nRow][nCol].nTrace);
738             //画常闭斜线
739             x1 = x0 + 16 + 12 - 3;
740             y1 = y0 + m_LinePosY - 6;
741             x2 = x0 + 16 + 2;
742             y2 = y1 + 12;
743             pDC->MoveTo(x1, y1);
744             pDC->LineTo(x2, y2);
745         }
746     }
747     else if (nType == typePP)
748     {
749         if (needReDraw) {
750             DrawRelay(pDC, x0, y0);
751             //画上升沿箭头
752             x1 = x0 + 16 + 6;
753             y1 = y0 + m_LinePosY - 5;
754             x2 = x1;
755             y2 = y1 + 10;
756             pDC->MoveTo(x1, y1);
757             pDC->LineTo(x2, y2);
758             //*
759             x2 = x1 - 3;
760             y2 = y1 + 4;
761             pDC->MoveTo(x1, y1);
762             pDC->LineTo(x2, y2);
763             x2 = x1 + 3;
764             y2 = y1 + 4;
765             pDC->MoveTo(x1, y1);
766             pDC->LineTo(x2, y2);
767             //*/
768                     //显示文字
769             DrawCellText1(pDC, Cells[nRow][nCol].sCoilName, x0 + 2, y0, m_CellWidth, 14);
770             DrawCellAnno(pDC, nRow, nCol, _T(""));
771         }
772     }
773     else if (nType == typePN)
774     {
775         if (needReDraw) {
776             DrawRelay(pDC, x0, y0);
777             //画下降沿箭头
778             x1 = x0 + 16 + 6;
779             y1 = y0 + m_LinePosY + 5;
780             x2 = x1;
781             y2 = y1 - 10;
782             pDC->MoveTo(x1, y1);
783             pDC->LineTo(x2, y2);
784             //*
785             x2 = x1 - 3;
786             y2 = y1 - 3;
787             pDC->MoveTo(x1, y1);
788             pDC->LineTo(x2, y2);
789
790             x2 = x1 + 3;
791             y2 = y1 - 3;
792             pDC->MoveTo(x1, y1);
793             pDC->LineTo(x2, y2);
794             //*/
795             //显示文字
796             DrawCellText1(pDC, Cells[nRow][nCol].sCoilName, x0 + 2, y0, m_CellWidth, 14);
797             DrawCellAnno(pDC, nRow, nCol, _T(""));
798         }
799     }
800     else if (nType == typeNOT)    {
801         if (needReDraw) {
802             DrawLeftRightLine(pDC, x0, y0);
803             //画常闭斜线
804             x1 = x0 + 16 + 12 - 3;
805             y1 = y0 + m_LinePosY - 6;
806             x2 = x0 + 16 + 2;
807             y2 = y1 + 12;
808             pDC->MoveTo(x1, y1);
809             pDC->LineTo(x2, y2);
810             //显示文字
811     //        DrawCellText1(pDC, Cells[nRow][nCol].sCoilName, x0 + 2, y0, m_CellWidth, 14);
812         }
813     }
814     else if (nType == typeDF)    {
815         if (needReDraw) {
816             //    DrawLeftRightLine(pDC, x0, y0);
817             DrawAngleBracket(pDC, x0, y0, 8, 32);
818             //显示文字
819             DrawCellText1(pDC, Cells[nRow][nCol].sCoilName, x0 + 16, y0 + m_LinePosY - 8, 16, 14);
820         }
821     }
822     else if (nType == typeDF_)    {
823         if (needReDraw) {
824             //    DrawLeftRightLine(pDC, x0, y0);
825             DrawAngleBracket(pDC, x0, y0, 8, 40);
826             //显示文字
827             DrawCellText1(pDC, Cells[nRow][nCol].sCoilName, x0 + 16, y0 + m_LinePosY - 8, 24, 14);
828         }
829     }
830     else if (nType == typeOUT)    {
831         if (needReDraw) {
832             //显示外形
833             DrawOT(pDC, x0, y0);
834             //显示文字
835             DrawCellText1(pDC, Cells[nRow][nCol].sCoilName, x0 + 2, y0, m_CellWidth, 14);
836             DrawCellAnno(pDC, nRow, nCol, _T(""));
837         }
838         if (m_bMonitoring) {
839             //Draw Stat
840             DrawCellStat1(pDC, x0 + 16 + 2, y0 + m_LinePosY - 6, 8, 12, Cells[nRow][nCol].nStat);
841         }
842     }
843     else if (nType == typeSET)    {
844
845         if (needReDraw) {
846             //画左侧横线
847             //DrawLeftRightLine(pDC, x0, y0, 14, 18);
848             DrawAngleBracket(pDC, x0, y0, 8, 32);
849             DrawCellText1(pDC, _T("S"), x0 + 18, y0 + m_LinePosY - 8, 8, 14);
850             //显示文字
851             DrawCellText1(pDC, Cells[nRow][nCol].sCoilName, x0 + 2, y0, m_CellWidth, 14);
852             DrawCellAnno(pDC, nRow, nCol, _T(""));
853         }
854         if (m_bMonitoring) {
855             //Draw Stat
856             DrawCellStat1(pDC, x0 + 14, y0 + m_LinePosY - 8, 16, 16, Cells[nRow][nCol].nStat);
857             DrawCellText1(pDC, _T("S"), x0 + 18, y0 + m_LinePosY - 8, 8, 14);
858         }
859
860     }
861     else if (nType == typeRESET)    {
862         if (needReDraw) {
863             //画左右侧横线
864             //DrawLeftRightLine(pDC, x0, y0, 14, 18);
865             DrawAngleBracket(pDC, x0, y0, 8, 32);
866             DrawCellText1(pDC, _T("R"), x0 + 17, y0 + m_LinePosY - 8, 9, 14);
867             //显示文字
868             DrawCellText1(pDC, Cells[nRow][nCol].sCoilName, x0 + 2, y0, m_CellWidth, 14);
869             DrawCellAnno(pDC, nRow, nCol, _T(""));
870         }
871         if (m_bMonitoring) {
872             //Draw Stat
873             DrawCellStat1(pDC, x0 + 14, y0 + m_LinePosY - 8, 16, 16, Cells[nRow][nCol].nStat);
874             DrawCellText1(pDC, _T("R"), x0 + 17, y0 + m_LinePosY - 8, 9, 14);
875         }
876     }
877     else if (nType == typeCMP)    {
878         if (needReDraw) {
879             // 画中括号
880             DrawBracket(pDC, x0, y0, m_CellWidth * 3);
881             //显示文字
882             DrawCellText1(pDC, Cells[nRow][nCol].sCoilName, x0 + 12, y0, m_CellWidth, 14);
883             DrawCellText1(pDC, Cells[nRow][nCol + 1].sParam, x0 + m_CellWidth + 2, y0, m_CellWidth, 14);
884             DrawCellText1(pDC, Cells[nRow][nCol + 2].sParam, x0 + m_CellWidth * 2 + 2, y0, m_CellWidth, 14);
885             DrawCellAnno(pDC, nRow, nCol + 1, _T(""));
886             DrawCellAnno(pDC, nRow, nCol + 2, _T(""));
887         }
888         if (m_bMonitoring) {
889             s1.Format(_T("     %d"), Cells[nRow][nCol + 1].nStat);
890             DrawCellText2(pDC, s1,x0+m_CellWidth+2,y0+m_LinePosY-6,m_CellWidth-10,14,DT_RIGHT, MonTextColor);
891             s1.Format(_T("     %d"), Cells[nRow][nCol + 2].nStat);
892             DrawCellText2(pDC, s1, x0 + m_CellWidth*2 + 2, y0 + m_LinePosY - 6, m_CellWidth - 10, 14, DT_RIGHT, MonTextColor);
893             // tracing
894             DrawCellStat2(pDC, x0 + m_CellWidth * 3 - 4, y0 + m_LinePosY - 8, 4, 4, Cells[nRow][nCol].nTrace);
895         }
896     }
897     else if (nType == typeTM)    {
898         if (needReDraw) {
899             // 画中括号
900             DrawBracket(pDC, x0, y0, m_CellWidth * 3);
901             //显示文字
902             DrawCellText1(pDC, Cells[nRow][nCol].sCoilName, x0 + 12, y0, m_CellWidth, 14);
903             DrawCellText1(pDC, Cells[nRow][nCol + 1].sParam, x0 + m_CellWidth + 2, y0, m_CellWidth, 14);
904             DrawCellText1(pDC, Cells[nRow][nCol + 2].sParam, x0 + m_CellWidth * 2 + 2, y0, m_CellWidth, 14);
905             DrawCellAnno(pDC, nRow, nCol, _T(""));
906             DrawCellAnno(pDC, nRow, nCol + 1, _T(""));
907             DrawCellAnno(pDC, nRow, nCol + 2, _T(""));
908         }
909         if (m_bMonitoring) {
910             s1.Format(_T("     %d"), Cells[nRow][nCol + 1].nStat);
911             DrawCellText2(pDC, s1, x0 + m_CellWidth + 2, y0 + m_LinePosY - 6, m_CellWidth - 10, 14, DT_RIGHT, MonTextColor);
912             s1.Format(_T("     %d"), Cells[nRow][nCol + 2].nStat);
913             DrawCellText2(pDC, s1, x0 + m_CellWidth * 2 + 2, y0 + m_LinePosY - 6, m_CellWidth - 10, 14, DT_RIGHT, MonTextColor);
914             // tracing
915             DrawCellStat2(pDC, x0 + m_CellWidth * 3 - 4, y0 + m_LinePosY - 8, 4, 4, Cells[nRow][nCol].nTrace);
916         }
917     }
918     else if (nType == typeFN1)    {
919         if (needReDraw) {
920
921             // 画中括号
922             DrawBracket(pDC, x0, y0, m_CellWidth * 2, m_LinePosY - 8, 16);
923             //显示文字
924             DrawCellText1(pDC, Cells[nRow][nCol].sCoilName, x0 + 12, y0 + m_LinePosY - 6, m_CellWidth, 14);
925             DrawCellText1(pDC, Cells[nRow][nCol + 1].sParam, x0 + m_CellWidth + 2, y0 + m_LinePosY - 6, m_CellWidth, 14);
926             DrawCellAnno(pDC, nRow, nCol + 1, _T(""));
927         }
928         if (m_bMonitoring) {
929
930             s1.Format(_T("     %d"), Cells[nRow][nCol + 1].nStat);
931             DrawCellText2(pDC, s1, x0 + m_CellWidth + 2, y0 , m_CellWidth - 10, 14, DT_RIGHT, MonTextColor);
932             // tracing
933             DrawCellStat2(pDC, x0 + m_CellWidth * 2 - 4, y0 + m_LinePosY - 8, 4, 4, Cells[nRow][nCol].nTrace);
934         }
935     }
936     else if (nType == typeFN2)    {
937         if (needReDraw) {
938             // 画中括号
939             DrawBracket(pDC, x0, y0, m_CellWidth * 3, m_LinePosY - 8, 16);
940             //显示文字
941             DrawCellText1(pDC, Cells[nRow][nCol].sCoilName, x0 + 12, y0 + m_LinePosY - 6, m_CellWidth, 14);
942             DrawCellText1(pDC, Cells[nRow][nCol + 1].sParam, x0 + m_CellWidth + 2, y0 + m_LinePosY - 6, m_CellWidth, 14);
943             DrawCellText1(pDC, Cells[nRow][nCol + 2].sParam, x0 + m_CellWidth * 2 + 2, y0 + m_LinePosY - 6, m_CellWidth, 14);
944             DrawCellAnno(pDC, nRow, nCol + 1, _T(""));
945             DrawCellAnno(pDC, nRow, nCol + 2, _T(""));
946         }
947         if (m_bMonitoring) {
948             s1.Format(_T("     %d"), Cells[nRow][nCol + 1].nStat);
949             DrawCellText2(pDC, s1, x0 + m_CellWidth + 2, y0, m_CellWidth - 10, 14, DT_RIGHT, MonTextColor);
950             s1.Format(_T("     %d"), Cells[nRow][nCol + 2].nStat);
951             DrawCellText2(pDC, s1, x0 + m_CellWidth * 2 + 2, y0, m_CellWidth - 10, 14, DT_RIGHT, MonTextColor);
952             // tracing
953             DrawCellStat2(pDC, x0 + m_CellWidth * 3 - 4, y0 + m_LinePosY - 8, 4, 4, Cells[nRow][nCol].nTrace);
954         }
955     }
956     else if (nType == typeFN3)    {
957         if (needReDraw) {
958             // 画中括号
959             DrawBracket(pDC, x0, y0, m_CellWidth * 4, m_LinePosY - 8, 16);
960             //显示文字
961             DrawCellText1(pDC, Cells[nRow][nCol].sCoilName, x0 + 12, y0 + m_LinePosY - 6, m_CellWidth, 14);
962             DrawCellText1(pDC, Cells[nRow][nCol + 1].sParam, x0 + m_CellWidth + 2, y0 + m_LinePosY - 6, m_CellWidth, 14);
963             DrawCellText1(pDC, Cells[nRow][nCol + 2].sParam, x0 + m_CellWidth * 2 + 2, y0 + m_LinePosY - 6, m_CellWidth, 14);
964             DrawCellText1(pDC, Cells[nRow][nCol + 3].sParam, x0 + m_CellWidth * 3 + 2, y0 + m_LinePosY - 6, m_CellWidth, 14);
965             DrawCellAnno(pDC, nRow, nCol + 1, _T(""));
966             DrawCellAnno(pDC, nRow, nCol + 2, _T(""));
967             DrawCellAnno(pDC, nRow, nCol + 3, _T(""));
968         }
969         if (m_bMonitoring) {
970             s1.Format(_T("     %d"), Cells[nRow][nCol + 1].nStat);
971             DrawCellText2(pDC, s1, x0 + m_CellWidth + 2, y0, m_CellWidth - 10, 14, DT_RIGHT, MonTextColor);
972             s1.Format(_T("     %d"), Cells[nRow][nCol + 2].nStat);
973             DrawCellText2(pDC, s1, x0 + m_CellWidth * 2 + 2, y0, m_CellWidth - 10, 14, DT_RIGHT, MonTextColor);
974             s1.Format(_T("     %d"), Cells[nRow][nCol + 3].nStat);
975             DrawCellText2(pDC, s1, x0 + m_CellWidth * 3 + 2, y0, m_CellWidth - 10, 14, DT_RIGHT, MonTextColor);
976             // tracing
977             DrawCellStat2(pDC, x0 + m_CellWidth * 4 - 4, y0 + m_LinePosY - 8, 4, 4, Cells[nRow][nCol].nTrace);
978         }
979     }
980     else
981     {
982     }
983 }
984
985 // CMTerm2View 消息处理程序
986
987 void CMTerm2View::OnUpdate(CView* /*pSender*/, LPARAM lHint, CObject* /*pHint*/)
988 {
989     // TODO: 在此添加专用代码和/或调用基类
990     //初始化 cell 内容 
991     if (lHint == 0 || lHint == 1)
992     {
993         TransProgToLDS();
994         CRect rect0;
995         this->GetClientRect(&rect0);
996
997         int CellTotalHeight = m_CellHeight + (m_bShowComments ? m_CommentHeight : 0);
998
999         CSize sizeTotal;
1000         // TODO: 计算此视图的合计大小
1001         sizeTotal.cx = m_LeftMargin + m_CellWidth * m_CellPerLine + m_CellWidth * 2;
1002         sizeTotal.cy = m_TopMargin + CellTotalHeight * (m_nTotalRow - 1) + rect0.Height();
1003         SetScrollSizes(MM_TEXT, sizeTotal);
1004         needReDraw = 1;
1005         this->RedrawWindow();
1006     }
1007     else if (lHint == 2) {
1008         UpdateStatusBar();
1009     }
1010
1011 }
1012
1013 BOOL CMTerm2View::OnEraseBkgnd(CDC* pDC)
1014 {
1015     // TODO: 在此添加消息处理程序代码和/或调用默认值
1016     return true;
1017     return CScrollView::OnEraseBkgnd(pDC);
1018 }
1019
1020 void CMTerm2View::OnSize(UINT nType, int cx, int cy)
1021 {
1022     CScrollView::OnSize(nType, cx, cy);
1023 //    CString s1;
1024 //    s1.Format(_T("OnSize %d %d %d"), nType, cx, cy);
1025 //    DbgLog(s1);
1026
1027     if (this->IsWindowVisible())
1028     {
1029         CRect rect0;
1030         this->GetClientRect(&rect0);
1031
1032         int CellTotalHeight = m_CellHeight + (m_bShowComments ? m_CommentHeight : 0);
1033
1034         CSize sizeTotal;
1035         // TODO: 计算此视图的合计大小
1036         sizeTotal.cx = m_LeftMargin + m_CellWidth * m_CellPerLine + m_CellWidth * 2;
1037         sizeTotal.cy = m_TopMargin + CellTotalHeight * (m_nTotalRow - 1) + rect0.Height();
1038         SetScrollSizes(MM_TEXT, sizeTotal);
1039         needReDraw = 1;
1040         this->RedrawWindow();
1041     }
1042
1043     needReDraw = 1;
1044     // TODO: 在此处添加消息处理程序代码
1045 }
1046
1047 BOOL CMTerm2View::OnScrollBy(CSize sizeScroll, BOOL bDoScroll)
1048 {
1049     // TODO: 在此添加专用代码和/或调用基类
1050     needReDraw = 1;
1051     return CScrollView::OnScrollBy(sizeScroll, bDoScroll);
1052 }
1053
1054 void CMTerm2View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
1055 {
1056     // TODO: 在此添加消息处理程序代码和/或调用默认值
1057     CString s1;
1058 //    s1.Format(_T("KeyDown %d %d %d"), nChar, nRepCnt, nFlags);
1059 //    DbgLog(s1);
1060     int CellTotalHeight = m_CellHeight + (m_bShowComments ? m_CommentHeight : 0);
1061
1062     CRect rect0;
1063     this->GetClientRect(&rect0);
1064     int viewWidth = rect0.Width();
1065     CPoint scroll1;
1066     scroll1 = this->GetScrollPosition();
1067
1068     int nFirstVisibleLine;
1069     int nLastVisibleLine;
1070     int nLinesinView;
1071     nFirstVisibleLine = (scroll1.y - m_TopMargin) / CellTotalHeight;
1072     nLastVisibleLine = (rect0.Height() + scroll1.y - m_TopMargin) / CellTotalHeight + 1;
1073     if (nFirstVisibleLine < 0) { nFirstVisibleLine = 0; }
1074     if (nLastVisibleLine < 0) { nLastVisibleLine = 0; }
1075     nLinesinView = nLastVisibleLine - 1 - nFirstVisibleLine;
1076     int nRow, nCol;
1077     nRow = m_FocusRow;
1078     nCol = m_FocusCol;
1079     if (nChar == VK_LEFT) {
1080         nCol -= 1;
1081         if (nCol < 0) { 
1082             if (nRow > 0) {
1083                 nRow -= 1; nCol += m_CellPerLine;
1084             }else { 
1085                 nCol = 0; 
1086             }
1087         }
1088     }
1089     if (nChar == VK_RIGHT) {
1090         nCol += 1;
1091         if (nCol >= m_CellPerLine) { 
1092             if (nRow < m_nTotalRow + nLinesinView - 1 ) {
1093                 nCol -= m_CellPerLine;
1094                 nRow += 1;
1095             }
1096             else {
1097                 nCol = m_CellPerLine - 1;
1098             }
1099         }
1100     }
1101     if (nChar == VK_UP) {
1102         nRow -= 1;
1103         if (nRow < 0) { nRow = 0; }
1104     }
1105     if (nChar == VK_DOWN) {
1106         nRow += 1;
1107         if (nRow >= m_nTotalRow + nLinesinView) { nRow = m_nTotalRow + nLinesinView -1; }
1108
1109     }
1110     m_FocusRow = nRow;
1111     m_FocusCol = nCol;
1112     if (Cells[nRow][nCol].nType) {
1113         m_nCurProgStep = Cells[nRow][nCol].nProgStep;
1114     }
1115     
1116     if (nRow < nFirstVisibleLine) { 
1117         scroll1.y -= CellTotalHeight;
1118         ScrollToPosition(scroll1); 
1119     }
1120     if (nRow > 0 && nRow >= nLastVisibleLine - 1 ) { 
1121         scroll1.y += CellTotalHeight;
1122         ScrollToPosition(scroll1); 
1123     }
1124
1125     //    DrawFocusRect();
1126     GetDocument()->UpdateAllViews(this, m_FocusCol);
1127     needReDraw = 1;
1128     this->RedrawWindow();
1129     UpdateStatusBar();
1130
1131     CScrollView::OnKeyDown(nChar, nRepCnt, nFlags);
1132 }
1133
1134 void CMTerm2View::OnLButtonDown(UINT nFlags, CPoint point)
1135 {
1136     // TODO: 在此添加消息处理程序代码和/或调用默认值
1137     CString s1;
1138     CPoint scroll1;
1139     scroll1 = this->GetScrollPosition();
1140     int tx, ty;
1141     tx = point.x + scroll1.x;
1142     ty = point.y + scroll1.y;
1143     int nRow, nCol;
1144     int CellTotalHeight = m_CellHeight + (m_bShowComments ? m_CommentHeight : 0);
1145     nRow = (ty - m_TopMargin) / CellTotalHeight;
1146     nCol = (tx - m_LeftMargin) / m_CellWidth;
1147     if (nRow < 0) { nRow = 0; }
1148     if (nCol < 0) { nCol = 0; }
1149     if (nCol >= m_CellPerLine) { nCol = m_CellPerLine - 1; }
1150     s1.Format(_T("LD %d %d  %02X  Scroll %d %d  Total %d %d Row %d Col %d"), point.x, point.y, nFlags, scroll1.x, scroll1.y, tx, ty, nRow, nCol);
1151     m_pStatusBar->SetPaneText(6, s1);
1152     m_FocusRow = nRow;
1153     m_FocusCol = nCol;
1154     if (Cells[nRow][nCol].nType) {
1155         m_nCurProgStep = Cells[nRow][nCol].nProgStep;
1156     }
1157
1158     //    DrawFocusRect();
1159     GetDocument()->UpdateAllViews(this, m_FocusCol);
1160     needReDraw = 1;
1161     this->RedrawWindow();
1162     UpdateStatusBar();
1163     //    m_pStatusBar->Set
1164     CScrollView::OnLButtonDown(nFlags, point);
1165 }
1166
1167 void CMTerm2View::OnLButtonUp(UINT nFlags, CPoint point)
1168 {
1169     // TODO: 在此添加消息处理程序代码和/或调用默认值
1170
1171     CScrollView::OnLButtonUp(nFlags, point);
1172 }
1173
1174 void CMTerm2View::OnLButtonDblClk(UINT nFlags, CPoint point)
1175 {
1176     // TODO: 在此添加消息处理程序代码和/或调用默认值
1177     CString s1;
1178     CMTerm2Doc * pDoc = (CMTerm2Doc*)GetDocument();
1179     CPoint scroll1;
1180     scroll1 = this->GetScrollPosition();
1181     int tx, ty;
1182     tx = point.x + scroll1.x;
1183     ty = point.y + scroll1.y;
1184
1185     int CellTotalHeight = m_CellHeight + (m_bShowComments ? m_CommentHeight : 0);
1186     int nRow = (ty - m_TopMargin) / CellTotalHeight;
1187     int nCol = (tx - m_LeftMargin) / m_CellWidth;
1188
1189     if (nRow < 0) { nRow = 0; }
1190     if (nCol < 0) { nCol = 0; }
1191     if (nCol >= m_CellPerLine) { nCol = m_CellPerLine - 1; }
1192     s1.Format(_T("LD db Clk %d %d  %02X  Scroll %d %d  Total %d %d Row %d Col %d"),
1193         point.x, point.y, nFlags, scroll1.x, scroll1.y, tx, ty, nRow, nCol);
1194     m_pStatusBar->SetPaneText(6, s1);
1195     m_pStatusBar->SetPaneBackgroundColor(6, RGB(255, 255, 0));
1196     m_pStatusBar->SetPaneTextColor(6, RGB(0, 0, 255));
1197 //    m_pStatusBar->EnablePaneProgressBar(6);
1198 //    m_pStatusBar->SetPaneProgress(6, 5);
1199     SysLog(s1);
1200
1201     m_FocusRow = nRow;
1202     m_FocusCol = nCol;
1203     if (Cells[nRow][nCol].nType) {
1204         m_nCurProgStep = Cells[nRow][nCol].nProgStep;
1205     }
1206     if (!pDoc->m_bOnline) return;
1207     //if (!m_bMonitoring) return;
1208
1209     CString sParam;
1210     sParam = Cells[nRow][nCol].sParam;
1211     int nDataType, nDataAddr, nStat;
1212     nDataType = Cells[nRow][nCol].nDataType;
1213     nDataAddr = Cells[nRow][nCol].nDataAddr;
1214     nStat = Cells[nRow][nCol].nStat;
1215
1216     s1.Format(_T("Name %s DataType %d DataAddr %d  Stat %d"),
1217         sParam, nDataType, nDataAddr, nStat);
1218     SysLog(s1);
1219     if (Cells[m_FocusRow][m_FocusCol].sParam == _T("")) {
1220         return;
1221     }
1222     needReDraw = 1;
1223     if ((nDataType&TYPEDATA) == TYPEDATA) {
1224         CDialogSetData dialog2;
1225
1226         dialog2.m_strAddr = sParam;
1227         dialog2.m_nStat = nStat;
1228
1229         INT_PTR r = dialog2.DoModal();
1230         if (r == IDOK)
1231         {
1232             int s = dialog2.m_nStat;
1233             ///
1234             pDoc->SetVarData(nDataType, nDataAddr, s);
1235             //Cells[nRow][nCol].nStat = s;
1236             s1.Format(_T("Set Data %s as %d "), sParam, s);
1237             SysLog(s1);
1238             this->RedrawWindow();
1239         }
1240     }
1241     else {
1242         CDialogSetCoil dialog1;
1243
1244         dialog1.m_strAddr = sParam;
1245         dialog1.m_nStat = nStat;
1246
1247         INT_PTR r = dialog1.DoModal();
1248         if (r == IDOK)
1249         {
1250             int s = dialog1.m_nStat;
1251             ///
1252             pDoc->SetCoilValue(nDataType, nDataAddr, s);
1253             //        Cells[nRow][nCol].nStat = nStat;
1254
1255             //        Cells[m_FocusRow][m_FocusCol].nStat = s;
1256             //        s1.Format(_T("Set Coild %s as %d "), sParam, s);
1257             //        AfxMessageBox(s1);
1258             this->RedrawWindow();
1259         }
1260     }
1261     CScrollView::OnLButtonDblClk(nFlags, point);
1262 }
1263
1264 void CMTerm2View::OnRButtonDown(UINT nFlags, CPoint point)
1265 {
1266     // TODO: 在此添加消息处理程序代码和/或调用默认值
1267     CString s1;
1268     CPoint scroll1;
1269     scroll1 = this->GetScrollPosition();
1270     int tx, ty;
1271     tx = point.x + scroll1.x;
1272     ty = point.y + scroll1.y;
1273
1274     int nRow, nCol;
1275     int CellTotalHeight = m_CellHeight + (m_bShowComments ? m_CommentHeight : 0);
1276     nRow = (ty- m_TopMargin )/ CellTotalHeight;
1277     nCol = (tx - m_LeftMargin) / m_CellWidth;
1278
1279     if (nRow < 0) { nRow = 0; }
1280     if (nCol < 0) { nCol = 0; }
1281     if (nCol >= m_CellPerLine) { nCol = m_CellPerLine - 1; }
1282     s1.Format(_T("RD %d %d  %02X  Scroll %d %d  Total %d %d Row %d Col %d"), point.x, point.y, nFlags, scroll1.x, scroll1.y, tx, ty, m_FocusRow, m_FocusCol);
1283     m_pStatusBar->SetPaneText(6, s1);
1284     m_FocusRow = nRow;
1285     m_FocusCol = nCol;
1286     //    DrawFocusRect();
1287     GetDocument()->UpdateAllViews(this, m_FocusCol);
1288     needReDraw = 1;
1289     this->RedrawWindow();
1290
1291     CScrollView::OnRButtonDown(nFlags, point);
1292 }
1293
1294 void CMTerm2View::OnRButtonUp(UINT nFlags, CPoint point)
1295 {
1296     // TODO: 在此添加消息处理程序代码和/或调用默认值
1297     //CContextMenuManager
1298     CScrollView::OnRButtonUp(nFlags, point);
1299 }
1300
1301 void CMTerm2View::OnContextMenu(CWnd* /*pWnd*/, CPoint point)
1302 {
1303     // TODO: 在此处添加消息处理程序代码
1304     CMenu menu1;
1305     menu1.LoadMenu(IDR_MENU1);
1306     CMenu *pContextMenu = menu1.GetSubMenu(0);
1307     pContextMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
1308 }
1309
1310 void CMTerm2View::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
1311 {
1312     CScrollView::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
1313
1314     // TODO: 在此处添加消息处理程序代码
1315     if (!bSysMenu && pPopupMenu)
1316     {
1317         CCmdUI cmdUI;
1318         cmdUI.m_pOther = NULL;
1319         cmdUI.m_pMenu = pPopupMenu;
1320         cmdUI.m_pSubMenu = NULL;
1321
1322
1323         UINT count = pPopupMenu->GetMenuItemCount();
1324         cmdUI.m_nIndexMax = count;
1325         for (UINT i = 0; i < count; i++)
1326         {
1327             UINT nID = pPopupMenu->GetMenuItemID(i);
1328             if (-1 == nID || 0 == nID)
1329             {
1330                 continue;
1331             }
1332             cmdUI.m_nID = nID;
1333             cmdUI.m_nIndex = i;
1334             cmdUI.DoUpdate(this, FALSE);
1335         }
1336     }
1337 }
1338
1339 void CMTerm2View::OnTimer(UINT_PTR nIDEvent)
1340 {
1341     // TODO: 在此添加消息处理程序代码和/或调用默认值
1342     CString s1;
1343     CMTerm2Doc * pDoc = (CMTerm2Doc*)GetDocument();
1344
1345     if (nIDEvent == 0) {
1346
1347     }
1348     else if (nIDEvent == 1)
1349     {
1350         if (m_bMonitoring) {
1351             //this->RedrawWindow();
1352             DoReDraw();
1353         }
1354     }
1355     else if (nIDEvent == 2) {
1356         pDoc->OnTimer(2);
1357     }
1358     else {
1359
1360     }
1361     CScrollView::OnTimer(nIDEvent);
1362 }
1363
1364 void CMTerm2View::OnMonitor()
1365 {
1366     // TODO: 在此添加命令处理程序代码
1367     m_bMonitoring = !m_bMonitoring;
1368     this->RedrawWindow();
1369     UpdateStatusBar();
1370 }
1371
1372 void CMTerm2View::OnUpdateMonitor(CCmdUI *pCmdUI)
1373 {
1374     // TODO: 在此添加命令更新用户界面处理程序代码
1375     pCmdUI->SetCheck(m_bMonitoring == true);
1376 }
1377
1378 void CMTerm2View::OnProgConvert()
1379 {
1380     // TODO: 在此添加命令处理程序代码
1381     CString s1;
1382     s1.Format(_T("Prog Convert"));
1383     SysLog(s1);
1384     int r = TransLDSToProg();
1385     s1.Format(_T("LDS To Prog result %d"), r);
1386     SysLog(s1);
1387     if (r==0) {
1388     //    m_bModified = 0;
1389         int j=TransProgToLDS();
1390         s1.Format(_T("Porg to LDS retuls %d"), j);
1391         SysLog(s1);
1392         needReDraw = 1;
1393         RedrawWindow();
1394     }
1395     else {
1396         s1.Format(_T("Error in Prog Convert"));
1397         SysLog(s1);
1398     }
1399 }
1400
1401 void CMTerm2View::OnUpdateProgConvert(CCmdUI *pCmdUI)
1402 {
1403     // TODO: 在此添加命令更新用户界面处理程序代码
1404     pCmdUI->SetCheck(0);
1405     pCmdUI->Enable(m_bModified);
1406 }
1407
1408 void CMTerm2View::OnProgCancelEdit()
1409 {
1410     CString s1;
1411     s1.Format(_T("Prog Cancel Edit"));
1412     SysLog(s1);
1413     // TODO: 在此添加命令处理程序代码
1414 }
1415
1416
1417 void CMTerm2View::OnUpdateProgCancelEdit(CCmdUI *pCmdUI)
1418 {
1419     // TODO: 在此添加命令更新用户界面处理程序代码
1420 //    pCmdUI->SetCheck(m_bModified);
1421     pCmdUI->Enable(m_bModified);
1422 }
1423
1424
1425 void CMTerm2View::OnInsertBlankLine()
1426 {
1427     // TODO: 在此添加命令处理程序代码
1428     CString s1;
1429     s1.Format(_T("Insert Blank Line"));
1430     SysLog(s1);
1431     m_FocusRow;
1432     for (int i = m_nTotalRow - 1; i >= m_FocusRow; i--) {
1433         for (int j = 0; j < m_CellPerLine; j++) {
1434             Cells[i + 1][j] = Cells[i][j];
1435         }
1436     }
1437     m_nTotalRow += 1;
1438         
1439     for (int j = 0; j < m_CellPerLine; j++)    {
1440         Cells[m_FocusRow][j].clear();
1441         Cells[m_FocusRow][j].bEditing = 1;
1442         Cells[m_FocusRow][j].bModified = 1;
1443         if (Cells[m_FocusRow + 1][j].bLeftLineUp) {
1444             Cells[m_FocusRow][j].bLeftLineUp = 1;
1445             Cells[m_FocusRow][j].bLeftLineDn = 1;
1446         }
1447     }
1448     m_bModified = 1;
1449     needReDraw = 1;
1450     this->RedrawWindow();
1451 }
1452
1453 void CMTerm2View::OnUpdateInsertBlankLine(CCmdUI *pCmdUI)
1454 {
1455     // TODO: 在此添加命令更新用户界面处理程序代码
1456 }
1457
1458 void CMTerm2View::OnDeleteBlankLine()
1459 {
1460     // TODO: 在此添加命令处理程序代码
1461     CString s1;
1462     s1.Format(_T("Delete Blank Line"));
1463     SysLog(s1);
1464 }
1465
1466 void CMTerm2View::OnUpdateDeleteBlankLine(CCmdUI *pCmdUI)
1467 {
1468     // TODO: 在此添加命令更新用户界面处理程序代码
1469 }
1470
1471 void CMTerm2View::OnRectSelect()
1472 {
1473     // TODO: 在此添加命令处理程序代码
1474 }
1475
1476
1477 void CMTerm2View::OnUpdateRectSelect(CCmdUI *pCmdUI)
1478 {
1479     // TODO: 在此添加命令更新用户界面处理程序代码
1480 }
1481
1482
1483 void CMTerm2View::OnTextFirst()
1484 {
1485     // TODO: 在此添加命令处理程序代码
1486 }
1487
1488
1489 void CMTerm2View::OnUpdateTextFirst(CCmdUI *pCmdUI)
1490 {
1491     // TODO: 在此添加命令更新用户界面处理程序代码
1492 }
1493
1494 void CMTerm2View::OnDisplayComments()
1495 {
1496     // TODO: 在此添加命令处理程序代码
1497     m_bShowComments = !m_bShowComments;
1498     int CellTotalHeight = m_CellHeight + (m_bShowComments ? m_CommentHeight : 0);
1499     CRect rect0;
1500     this->GetClientRect(&rect0);
1501
1502     CSize sizeTotal;
1503     // TODO: 计算此视图的合计大小
1504     sizeTotal.cx = m_LeftMargin + m_CellWidth * m_CellPerLine + m_CellWidth * 2;
1505     sizeTotal.cy = m_TopMargin + CellTotalHeight * (m_nTotalRow-1)  + rect0.Height();
1506     SetScrollSizes(MM_TEXT, sizeTotal);
1507     needReDraw = 1;
1508     this->Invalidate();
1509 }
1510
1511
1512 void CMTerm2View::OnUpdateDisplayComments(CCmdUI *pCmdUI)
1513 {
1514     // TODO: 在此添加命令更新用户界面处理程序代码
1515     pCmdUI->SetCheck(m_bShowComments == true);
1516 }
1517
1518
1519
1520 int CMTerm2View::UpdateStatusBar(int nIndex)
1521 {
1522     // TODO: 在此处添加实现代码.
1523     CString s1;
1524     CMTerm2Doc * pDoc = (CMTerm2Doc*)GetDocument();
1525
1526     if (nIndex == idxMachineType || nIndex == -1) {        //机型代码
1527         s1 = pDoc->m_sMachineType;
1528         m_pStatusBar->SetPaneText(idxMachineType,s1);
1529     }
1530     if (nIndex == idxProgPos || nIndex == -1) { //程序位置/步数
1531         s1.Format(_T("%5d/%5d"), m_nCurProgStep,pDoc->m_nProgSteps);
1532         m_pStatusBar->SetPaneText(idxProgPos, s1);
1533     }
1534     if (nIndex == idxOnline || nIndex == -1) { //在线 /离线
1535         if (!pDoc->m_bOnline) {
1536             s1 = _T("离线");
1537             m_pStatusBar->SetPaneText(idxOnline, s1);
1538             m_pStatusBar->SetPaneBackgroundColor(idxOnline);
1539         }
1540         else if (pDoc->m_bOnline) {
1541             if (pDoc->m_bSimulate)    {
1542                 s1 = _T("在线(仿真)");
1543                 m_pStatusBar->SetPaneText(2, s1);
1544                 m_pStatusBar->SetPaneBackgroundColor(idxOnline, OnlineColor);
1545             }else{
1546                 s1 = _T("在线");
1547                 m_pStatusBar->SetPaneText(2, s1);
1548                 m_pStatusBar->SetPaneBackgroundColor(idxOnline, OnlineColor);
1549             }
1550         }
1551     }
1552     if (nIndex == idxRunning || nIndex == -1) { // 运行 / 停止
1553         if (!pDoc->m_bOnline)        {
1554             s1 = _T("");
1555             m_pStatusBar->SetPaneText(idxRunning, s1);
1556             m_pStatusBar->SetPaneBackgroundColor(idxRunning);
1557             m_pStatusBar->SetPaneWidth(idxRunning, 0);
1558             m_pStatusBar->SetPaneStyle(idxRunning, SBPS_DISABLED);
1559
1560         }else if (!pDoc->m_bPlcRunning) {
1561             s1 = _T("PROG");
1562             m_pStatusBar->SetPaneText(idxRunning, s1);
1563             m_pStatusBar->SetPaneWidth(idxRunning, s1.GetLength()*8);
1564             m_pStatusBar->SetPaneBackgroundColor(idxRunning, ProgColor);
1565         }else {
1566             s1 = _T("RUN");
1567             m_pStatusBar->SetPaneText(idxRunning, s1);
1568             m_pStatusBar->SetPaneWidth(idxRunning, s1.GetLength() * 8);
1569             m_pStatusBar->SetPaneBackgroundColor(idxRunning, RunningColor);
1570         }
1571     }
1572     if (nIndex == idxMonitor || nIndex == -1) { // 监控 //
1573 //        s1 = pDoc->m_sMachineType;
1574         if (!m_bMonitoring) {
1575             s1 = _T("[监控停止]");
1576             m_pStatusBar->SetPaneText(idxMonitor, s1);
1577             m_pStatusBar->SetPaneBackgroundColor(idxMonitor);
1578         }else{
1579             s1 = _T("[正在监控]");
1580             m_pStatusBar->SetPaneText(idxMonitor, s1);
1581             m_pStatusBar->SetPaneBackgroundColor(idxMonitor, MonitorColor);
1582         }
1583     }
1584     if (nIndex == idxAddress || nIndex == -1) { // 地址,本站
1585 //        s1 = pDoc->m_sMachineType;
1586         if (!pDoc->m_bOnline) {
1587             s1 = _T("本站");
1588             m_pStatusBar->SetPaneText(idxAddress, s1);
1589             m_pStatusBar->SetPaneBackgroundColor(idxMonitor);
1590         }else {
1591             s1 = _T("本站");
1592             m_pStatusBar->SetPaneText(idxAddress, s1);
1593             m_pStatusBar->SetPaneBackgroundColor(idxMonitor, AddressColor);
1594         }
1595
1596     }
1597     if (nIndex == idxInfoDisp || nIndex == -1) { // INFO DISPLAY
1598 //        s1 = pDoc->m_sMachineType;
1599 //        m_pStatusBar->SetPaneText(idxInfoDisp, s1);
1600     }
1601
1602     return 0;
1603 }
1604
1605
1606 void CMTerm2View::OnUpdateIndicatorMonitorStatus(CCmdUI *pCmdUI)
1607 {
1608     // TODO: 在此添加命令更新用户界面处理程序代码
1609
1610     //pCmdUI->SetCheck(m_bMonitoring == true);
1611     if (!m_bMonitoring)     pCmdUI->SetText(_T("[监控停止]"));
1612     else     pCmdUI->SetText(_T("[正在监控]"));
1613 }
1614
1615 void CMTerm2View::OnUpdateIndicators(CCmdUI *pCmdUI)
1616 {
1617     // TODO: 在此添加命令更新用户界面处理程序代码
1618     CString s1;
1619     s1.Format(_T("pCmdUI nID %d "));
1620     DbgLog(s1);
1621     pCmdUI->m_nID;
1622     pCmdUI->SetText(_T("KL-D20N16"));
1623 }
1624
1625 void CMTerm2View::OnUpdateMachineType(CCmdUI *pCmdUI)
1626 {
1627     // TODO: 在此添加命令更新用户界面处理程序代码
1628     CString s1;
1629     s1.Format(_T("pCmdUI nID %d "));
1630     DbgLog(s1);
1631     pCmdUI->m_nID;
1632     pCmdUI->SetText(_T("KL-D20N16"));
1633 }
1634
1635 void CMTerm2View::OnUpdateProgramPos(CCmdUI *pCmdUI)
1636 {
1637     // TODO: 在此添加命令更新用户界面处理程序代码
1638     CString s1;
1639     s1.Format(_T("%5d/%5d"), 18, 55);
1640     pCmdUI->SetText(s1);
1641 }
1642
1643 void CMTerm2View::OnUpdateConnectivity(CCmdUI *pCmdUI)
1644 {
1645     // TODO: 在此添加命令更新用户界面处理程序代码
1646     CString s1;
1647     s1 = _T("离线");
1648     s1 = _T("在线");
1649
1650     pCmdUI->SetText(s1);
1651 }
1652 void CMTerm2View::OnUpdateRunStatus(CCmdUI *pCmdUI)
1653 {
1654     // TODO: 在此添加命令更新用户界面处理程序代码
1655     CString s1;
1656     CMTerm2Doc* pDoc = GetDocument();
1657     ASSERT_VALID(pDoc);
1658     if (!pDoc)    return;
1659     if (pDoc->m_bPlcRunning) {
1660         s1 = _T("运行");
1661         m_pStatusBar->SetPaneText(3, s1);
1662         m_pStatusBar->SetPaneTextColor(3, RGB(0, 0, 0));
1663     }
1664     else {
1665         s1 = _T("停止");
1666         m_pStatusBar->SetPaneText(3, s1);
1667         m_pStatusBar->SetPaneTextColor(3, RGB(0, 0, 0));
1668     }
1669     s1.Format(_T("PCmdUI %d %d"), pCmdUI->m_nID, pCmdUI->m_nIndex);
1670     DbgLog(s1);
1671
1672 //    pCmdUI->SetText(s1);
1673 }
1674 void CMTerm2View::OnUpdateMonitorStatus(CCmdUI *pCmdUI)
1675 {
1676     // TODO: 在此添加命令更新用户界面处理程序代码
1677     CString s1;
1678     s1 = _T("停止监控");
1679     s1 = _T("监控中");
1680     if (!m_bMonitoring)     pCmdUI->SetText(_T("[监控停止]"));
1681     else     pCmdUI->SetText(_T("[正在监控]"));
1682
1683 //    pCmdUI->SetText(s1);
1684 }
1685 void CMTerm2View::OnUpdateTargetAddress(CCmdUI *pCmdUI)
1686 {
1687     // TODO: 在此添加命令更新用户界面处理程序代码
1688     CString s1;
1689     s1 = _T("远程");
1690     s1 = _T("本站");
1691     pCmdUI->SetText(s1);
1692 }
1693
1694 void CMTerm2View::OnInputIoComment()
1695 {
1696     // TODO: 在此添加命令处理程序代码
1697     CString s1;
1698     int nRow, nCol;
1699     nRow = m_FocusRow;
1700     nCol = m_FocusCol;
1701     if (nCol < 0) { nCol = 0; }
1702     if (nCol >= m_CellPerLine) { nCol = m_CellPerLine - 1; }
1703
1704     CString sParam;
1705     sParam = Cells[nRow][nCol].sParam;
1706     int nDataType, nDataAddr, nStat;
1707     nDataType = Cells[nRow][nCol].nDataType;
1708     nDataAddr = Cells[nRow][nCol].nDataAddr;
1709     nStat = Cells[nRow][nCol].nStat;
1710
1711     s1.Format(_T("Name %s DataType %d DataAddr %d  Stat %d"),
1712         sParam, nDataType, nDataAddr, nStat);
1713     SysLog(s1);
1714     if (Cells[m_FocusRow][m_FocusCol].sParam == _T("")) {
1715         return;
1716     }
1717
1718     CMTerm2Doc * pDoc = GetDocument();
1719     CString sComment;
1720     pDoc->GetAnno(nDataType, nDataAddr, sComment);
1721     CDialogIoComment dialog1;
1722     dialog1.m_sIOName = sParam;
1723     dialog1.m_sComment = sComment;
1724     dialog1.m_nCoilType = nDataType;
1725     dialog1.m_nCoilAddr = nDataAddr;
1726     INT_PTR r = dialog1.DoModal();
1727     if (r == IDOK)
1728     {
1729         sComment = dialog1.m_sComment;
1730         pDoc->SetAnno(nDataType, nDataAddr, sParam, sComment);
1731         s1.Format(_T("Set %s %d %d  comment -> %s"), sParam, nDataType, nDataAddr, sComment);
1732         SysLog(s1);
1733         //needReDraw = 1;
1734         this->RedrawWindow();
1735     }
1736 }
1737
1738
1739 int CMTerm2View::TransProgToLDS()
1740 {
1741     CString s1;
1742     CMTerm2Doc * pDoc = (CMTerm2Doc*)GetDocument();
1743
1744     // 先扫描分开的程序段
1745     int stpos[100] = { 0 };
1746     int nSts = 0;
1747
1748     for (int i = 0; i < m_nTotalRow && i < 2000; i++) {
1749         for (int j = 0; j < 16; j++) {
1750             Cells[i][j].clear();
1751             s1.Format(_T("%d:%d"), i, j);
1752             Cells[i][j].sCoilName = s1;
1753         }
1754     }
1755     POINT StPts[100];
1756     //    StPts[0] = POINT{ 0, 0 };
1757     POINT EndPt[100];
1758     int nEndPts = 0;
1759     nSts = 0;
1760     int nCurLine = 0;
1761
1762     int cx = 0, cy = 0;
1763     int maxy = 0;
1764     for (int i = 0; i < pDoc->m_nProgSteps; i++)
1765     {
1766         int nOp = pDoc->Progs[i].nOpType1;
1767         int nParamCount = pDoc->Progs[i].nParamCount;
1768         CStringA OpName;
1769         CStringA ShowTxt;
1770         pDoc->OpToTxt(nOp, OpName);
1771         pDoc->OpToShowTxt(nOp, ShowTxt);
1772         int nPairTo = pDoc->Progs[i].PairTo;
1773         int nPairOp = 0;
1774         if (nPairTo) nPairOp = pDoc->Progs[nPairTo].nOpType1;
1775         int nCellType;
1776         switch (nOp)
1777         {
1778
1779         case OP_NOP:
1780             break;
1781         case OP_ST:
1782         case OP_ST_:
1783             if (i == 0) {
1784
1785             }
1786             else {
1787                 //记录当前位置 
1788                 EndPt[nEndPts] = POINT{ cx,cy };
1789                 nEndPts++;
1790                 if (nPairOp == OP_ANS) {
1791                     //继续前进                
1792                     //cx = 0, cy = nCurLine;
1793                     //cx = StPts[nSts - 1].x;
1794                     //nCurLine = cy + 1; //另起一行
1795 ///*                
1796                     nCurLine=cy;
1797                     int hasData = 1;
1798                     while (hasData) {
1799                         hasData = 0;
1800                         for (int j = cx +1; j < m_CellPerLine; j++) {
1801                             if (Cells[nCurLine][j].nType != 0) {
1802                                 nCurLine++; hasData = 1; break;
1803                             }
1804                         }
1805                     }
1806                     //                    nCurLine = maxy + 1; //另起一行
1807                     if (nCurLine > maxy) maxy = nCurLine;
1808                     for (int j = cy; j < nCurLine; j++) {
1809                         Cells[j][cx].bLeftLineDn = 1;
1810                         Cells[j + 1][cx].bLeftLineUp = 1;
1811                     }
1812                     cy = nCurLine;
1813 //*/
1814                 }
1815                 else if (nPairOp == OP_ORS) {
1816                     cx = StPts[nSts - 1].x;
1817                     nCurLine = cy + 1; //另起一行
1818                     int hasData = 1;
1819                     while (hasData) {
1820                         hasData = 0;
1821                         for (int j = cx; j < m_CellPerLine; j++) {
1822                             if (Cells[nCurLine][j].nType != 0) {
1823                                 nCurLine++; hasData = 1; break;
1824                             }
1825                         }
1826                     }
1827                     //                    nCurLine = maxy + 1; //另起一行
1828                     if (nCurLine > maxy) maxy = nCurLine;
1829                     for (int j = cy; j < nCurLine; j++) {
1830                         Cells[j][cx].bLeftLineDn = 1;
1831                         Cells[j + 1][cx].bLeftLineUp = 1;
1832                     }
1833                     cy = nCurLine;
1834                 }
1835                 else if (nPairOp == 0) {
1836                     nCurLine = maxy + 1; //另起一行
1837                     maxy = nCurLine;
1838                     cx = 0; cy = nCurLine;
1839                 }
1840             }
1841             stpos[nSts] = i;
1842             StPts[nSts] = POINT{ cx,cy };
1843             nSts++;
1844             Cells[cy][cx].nType = pDoc->Progs[i].nOpType1 == OP_ST ? typeNO : typeNC; //typeNC
1845             Cells[cy][cx].nProgStep = i;
1846             Cells[cy][cx].sCoilName = pDoc->Progs[i].Params[0].sParamStr;
1847             Cells[cy][cx].sParam = pDoc->Progs[i].Params[0].sParamStr;
1848             Cells[cy][cx].nDataType = pDoc->Progs[i].Params[0].nParamType;
1849             Cells[cy][cx].nDataAddr = pDoc->Progs[i].Params[0].nParamAddr;
1850             cx++;    //移到下一格
1851             break;
1852         case OP_ST_EQ:
1853         case OP_ST_NE:
1854         case OP_ST_LT:
1855         case OP_ST_GT:
1856         case OP_ST_LE:
1857         case OP_ST_GE:
1858             if (i == 0) {
1859
1860             }
1861             else {
1862                 //记录当前位置 
1863                 EndPt[nEndPts] = POINT{ cx,cy };
1864                 nEndPts++;
1865                 if (nPairOp == OP_ANS) {
1866                     //继续前进                
1867                     //cx = 0, cy = nCurLine;
1868                 }
1869                 else if (nPairOp == OP_ORS) {
1870                     cx = StPts[nSts - 1].x;
1871                     nCurLine = cy + 1; //另起一行
1872                     int hasData = 1;
1873                     while (hasData) {
1874                         hasData = 0;
1875                         for (int j = cx; j < m_CellPerLine; j++) {
1876                             if (Cells[nCurLine][j].nType != 0) {
1877                                 nCurLine++; hasData = 1; break;
1878                             }
1879                         }
1880                     }
1881                     //                    nCurLine = maxy + 1; //另起一行
1882                     if (nCurLine > maxy) maxy = nCurLine;
1883                     for (int j = cy; j < nCurLine; j++) {
1884                         Cells[j][cx].bLeftLineDn = 1;
1885                         Cells[j + 1][cx].bLeftLineUp = 1;
1886                     }
1887                     cy = nCurLine;
1888                 }
1889                 else if (nPairOp == 0) {
1890                     nCurLine = maxy + 1; //另起一行
1891                     maxy = nCurLine;
1892                     cx = 0; cy = nCurLine;
1893                 }
1894             }
1895             stpos[nSts] = i;
1896             StPts[nSts] = POINT{ cx,cy };
1897             nSts++;
1898             Cells[cy][cx].nType = typeCMP;
1899             Cells[cy][cx].nProgStep = i;
1900             Cells[cy][cx].sParam = OpName;
1901             Cells[cy][cx].sCoilName = ShowTxt;
1902             Cells[cy][cx + 1].nType = typeExt1;
1903             Cells[cy][cx + 1].sParam = pDoc->Progs[i].Params[0].sParamStr;
1904             Cells[cy][cx + 1].nDataType = pDoc->Progs[i].Params[0].nParamType;
1905             Cells[cy][cx + 1].nDataAddr = pDoc->Progs[i].Params[0].nParamAddr;
1906             Cells[cy][cx + 2].nType = typeExt1;
1907             Cells[cy][cx + 2].sParam = pDoc->Progs[i].Params[1].sParamStr;
1908             Cells[cy][cx + 2].nDataType = pDoc->Progs[i].Params[1].nParamType;
1909             Cells[cy][cx + 2].nDataAddr = pDoc->Progs[i].Params[1].nParamAddr;
1910             cx += 3;    //移到下3格
1911             break;
1912
1913         case OP_AN:
1914         case OP_AN_:
1915
1916             Cells[cy][cx].nType = nOp == OP_AN ? typeNO : typeNC; //typeNC
1917             Cells[cy][cx].nProgStep = i;
1918             Cells[cy][cx].sParam = pDoc->Progs[i].Params[0].sParamStr;
1919             Cells[cy][cx].sCoilName = pDoc->Progs[i].Params[0].sParamStr;
1920             Cells[cy][cx].nDataType = pDoc->Progs[i].Params[0].nParamType;
1921             Cells[cy][cx].nDataAddr = pDoc->Progs[i].Params[0].nParamAddr;
1922             cx++;
1923             break;
1924         case OP_AN_EQ:
1925         case OP_AN_NE:
1926         case OP_AN_LT:
1927         case OP_AN_GT:
1928         case OP_AN_LE:
1929         case OP_AN_GE:
1930             Cells[cy][cx].nType = typeCMP;
1931             Cells[cy][cx].nProgStep = i;
1932             Cells[cy][cx].sCoilName = ShowTxt;
1933             Cells[cy][cx + 1].nType = typeExt1;
1934             Cells[cy][cx + 1].sParam = pDoc->Progs[i].Params[0].sParamStr;
1935             Cells[cy][cx + 1].nDataType = pDoc->Progs[i].Params[0].nParamType;
1936             Cells[cy][cx + 1].nDataAddr = pDoc->Progs[i].Params[0].nParamAddr;
1937             Cells[cy][cx + 2].nType = typeExt1;
1938             Cells[cy][cx + 2].sParam = pDoc->Progs[i].Params[1].sParamStr;
1939             Cells[cy][cx + 2].nDataType = pDoc->Progs[i].Params[1].nParamType;
1940             Cells[cy][cx + 2].nDataAddr = pDoc->Progs[i].Params[1].nParamAddr;
1941             cx += 3;
1942             break;
1943
1944         case OP_OR:
1945         case OP_OR_:
1946             EndPt[nEndPts] = POINT{ cx,cy };
1947             nEndPts++;
1948             cx = StPts[nSts - 1].x;
1949             nCurLine = cy + 1; //另起一行
1950             {
1951                 int hasData = 1;
1952                 while (hasData) {
1953                     hasData = 0;
1954                     for (int j = cx; j < m_CellPerLine; j++) {
1955                         if (Cells[nCurLine][j].nType != 0) {
1956                             nCurLine++; hasData = 1; break;
1957                         }
1958                     }
1959                 }
1960             }
1961             if (nCurLine > maxy)    maxy = nCurLine;
1962             for (int j = cy; j < nCurLine; j++) {
1963                 Cells[j][cx].bLeftLineDn = 1;
1964                 Cells[j + 1][cx].bLeftLineUp = 1;
1965             }
1966             cy = nCurLine;
1967             Cells[cy][cx].nProgStep = i;
1968             Cells[cy][cx].nType = nOp == OP_OR ? typeNO : typeNC; //typeNC
1969             Cells[cy][cx].sCoilName = pDoc->Progs[i].Params[0].sParamStr;
1970             Cells[cy][cx].sParam = pDoc->Progs[i].Params[0].sParamStr;
1971             Cells[cy][cx].nDataType = pDoc->Progs[i].Params[0].nParamType;
1972             Cells[cy][cx].nDataAddr = pDoc->Progs[i].Params[0].nParamAddr;
1973             cx++;
1974             if (cx < EndPt[nEndPts - 1].x)
1975             {    //本行补齐
1976                 for (int j = cx; j < EndPt[nEndPts - 1].x; j++)
1977                 {
1978                     Cells[cy][j].nType = typeLine1;
1979                 }
1980                 cx = EndPt[nEndPts - 1].x;
1981             }
1982             else {
1983                 //前一行补齐
1984                 for (int j = EndPt[nEndPts - 1].x; j < cx; j++)
1985                 {
1986                     Cells[EndPt[nEndPts - 1].y][j].nType = typeLine1;
1987                 }
1988
1989             }
1990             //连接上下线
1991             for (int j = EndPt[nEndPts - 1].y; j < cy; j++)
1992             {
1993                 Cells[j][cx].bLeftLineDn = 1;
1994                 Cells[j + 1][cx].bLeftLineUp = 1;
1995             }
1996             //光标位置, 前一结束点位置
1997             cy = EndPt[nEndPts - 1].y;
1998             nEndPts--;
1999
2000             break;
2001         case OP_OR_EQ:
2002         case OP_OR_NE:
2003         case OP_OR_LT:
2004         case OP_OR_GT:
2005         case OP_OR_LE:
2006         case OP_OR_GE:
2007             EndPt[nEndPts] = POINT{ cx,cy };
2008             nEndPts++;
2009             cx = StPts[nSts - 1].x;
2010             nCurLine = cy + 1; //另起一行
2011             {
2012                 int hasData = 1;
2013                 while (hasData) {
2014                     hasData = 0;
2015                     for (int j = cx; j < m_CellPerLine; j++) {
2016                         if (Cells[nCurLine][j].nType != 0) {
2017                             nCurLine++; hasData = 1; break;
2018                         }
2019                     }
2020                 }
2021             }
2022             if (nCurLine > maxy)    maxy = nCurLine;
2023             for (int j = cy; j < nCurLine; j++) {
2024                 Cells[j][cx].bLeftLineDn = 1;
2025                 Cells[j + 1][cx].bLeftLineUp = 1;
2026             }
2027             cy = nCurLine;
2028             Cells[cy][cx].nType = typeCMP;
2029             Cells[cy][cx].nProgStep = i;
2030             Cells[cy][cx].sCoilName = ShowTxt;
2031             Cells[cy][cx + 1].nType = typeExt1;
2032             Cells[cy][cx + 1].sParam = pDoc->Progs[i].Params[0].sParamStr;
2033             Cells[cy][cx + 1].nDataType = pDoc->Progs[i].Params[0].nParamType;
2034             Cells[cy][cx + 1].nDataAddr = pDoc->Progs[i].Params[0].nParamAddr;
2035             Cells[cy][cx + 2].nType = typeExt1;
2036             Cells[cy][cx + 2].sParam = pDoc->Progs[i].Params[1].sParamStr;
2037             Cells[cy][cx + 2].nDataType = pDoc->Progs[i].Params[1].nParamType;
2038             Cells[cy][cx + 2].nDataAddr = pDoc->Progs[i].Params[1].nParamAddr;
2039             cx += 3;
2040             if (cx < EndPt[nEndPts - 1].x)
2041             {    //本行补齐
2042                 for (int j = cx; j < EndPt[nEndPts - 1].x; j++)
2043                 {
2044                     Cells[cy][j].nType = typeLine1;
2045                 }
2046                 cx = EndPt[nEndPts - 1].x;
2047             }
2048             else {
2049                 //前一行补齐
2050                 for (int j = EndPt[nEndPts - 1].x; j < cx; j++)
2051                 {
2052                     Cells[EndPt[nEndPts - 1].y][j].nType = typeLine1;
2053                 }
2054
2055             }
2056             //连接上下线
2057             for (int j = EndPt[nEndPts - 1].y; j < cy; j++)
2058             {
2059                 Cells[j][cx].bLeftLineDn = 1;
2060                 Cells[j + 1][cx].bLeftLineUp = 1;
2061             }
2062             //光标位置, 前一结束点位置
2063             cy = EndPt[nEndPts - 1].y;
2064             nEndPts--;
2065
2066             break;
2067         case OP_NOT:
2068             Cells[cy][cx].nType = typeNOT;
2069             Cells[cy][cx].sCoilName = _T("NOT");
2070
2071             Cells[cy][cx].nProgStep = i;
2072             cx++;
2073             break;
2074         case OP_DF:
2075         case OP_DF_:
2076             Cells[cy][cx].nType = nOp == OP_DF ? typeDF : typeDF_;
2077             Cells[cy][cx].sCoilName = nOp == OP_DF ? _T("DF") : _T("DF/");
2078
2079             Cells[cy][cx].nProgStep = i;
2080             cx++;
2081             break;
2082         case OP_ANS:
2083             nSts--;
2084             nEndPts--;
2085
2086             break;
2087         case OP_ORS:
2088             // 当前序列与前面的序列合并。
2089             //当前序列的开始结束位置
2090             //EndPt[nEndPts] = POINT{ cx,cy };
2091             //nEndPts++;
2092             //StPts[nSts - 1]; EndPt[nEndPts - 1];
2093             //前一序列的开始结束位置
2094             StPts[nSts - 1]; EndPt[nEndPts - 1];
2095             //判断二者长度
2096             if (cx < EndPt[nEndPts - 1].x)
2097             {    //本行补齐
2098                 for (int j = cx; j < EndPt[nEndPts - 1].x; j++)
2099                 {
2100                     Cells[cy][j].nType = typeLine1;
2101                 }
2102                 cx = EndPt[nEndPts - 1].x;
2103             }
2104             else {
2105                 //前一行补齐
2106                 for (int j = EndPt[nEndPts - 1].x; j < cx; j++)
2107                 {
2108                     Cells[EndPt[nEndPts - 1].y][j].nType = typeLine1;
2109                 }
2110
2111             }
2112             //连接上下线
2113             for (int j = EndPt[nEndPts - 1].y; j < cy; j++)
2114             {
2115                 Cells[j][cx].bLeftLineDn = 1;
2116                 Cells[j + 1][cx].bLeftLineUp = 1;
2117             }
2118             //光标位置, 前一结束点位置
2119             cy = EndPt[nEndPts - 1].y;
2120             nSts--;
2121             nEndPts--;
2122
2123             break;
2124         case OP_PSHS:
2125             EndPt[nEndPts] = POINT{ cx,cy };
2126             nEndPts++;
2127             break;
2128         case OP_RDS:
2129             cx = EndPt[nEndPts - 1].x;
2130             for (int j = cx; j < m_CellPerLine; j++) {
2131                 if (Cells[cy][j].nType != 0)
2132                 {
2133                     cy++; j = cx - 1; //break;
2134                 }
2135             }
2136             for (int j = EndPt[nEndPts - 1].y; j < cy; j++)
2137             {
2138                 Cells[j][cx].bLeftLineDn = 1;
2139                 Cells[j + 1][cx].bLeftLineUp = 1;
2140             }
2141             break;
2142         case OP_POPS:
2143             cx = EndPt[nEndPts - 1].x;
2144             for (int j = cx; j < m_CellPerLine; j++) {
2145                 if (Cells[cy][j].nType != 0)
2146                 {
2147                     cy++; j = cx - 1; break;
2148                 }
2149             }
2150             for (int j = EndPt[nEndPts - 1].y; j < cy; j++)
2151             {
2152                 Cells[j][cx].bLeftLineDn = 1;
2153                 Cells[j + 1][cx].bLeftLineUp = 1;
2154             }
2155             nEndPts--;
2156
2157             break;
2158         case OP_OUT:
2159         case OP_SET:
2160         case OP_RESET:
2161             nCellType = nOp == OP_OUT ? typeOUT : nOp == OP_SET ? typeSET : typeRESET;
2162             nCurLine = cy;
2163             if (cx <= m_CellPerLine) {
2164
2165                 int hasData = 1;
2166                 while (hasData) {
2167                     hasData = 0;
2168                     for (int j = cx; j < m_CellPerLine; j++) {
2169                         if (Cells[nCurLine][j].nType != 0) {
2170                             nCurLine++; hasData = 1; break;
2171                         }
2172                     }
2173                 }
2174                 //if (nCurLine > maxy)    maxy = nCurLine;
2175                 for (int j = cy; j < nCurLine; j++) {
2176                     Cells[j][cx].bLeftLineDn = 1;
2177                     Cells[j + 1][cx].bLeftLineUp = 1;
2178                 }
2179                 cy = nCurLine;
2180                 for (int j = cx; j < m_CellPerLine; j++)
2181                 {
2182                     Cells[cy][j].nType = typeLine1;
2183                 }
2184                 Cells[cy][m_CellPerLine - 1].nType = nCellType;
2185                 Cells[cy][m_CellPerLine - 1].nProgStep = i;
2186                 Cells[cy][m_CellPerLine - 1].sParam = pDoc->Progs[i].Params[0].sParamStr;
2187                 Cells[cy][m_CellPerLine - 1].sCoilName = pDoc->Progs[i].Params[0].sParamStr;
2188                 Cells[cy][m_CellPerLine - 1].nDataType = pDoc->Progs[i].Params[0].nParamType;
2189                 Cells[cy][m_CellPerLine - 1].nDataAddr = pDoc->Progs[i].Params[0].nParamAddr;
2190                 
2191             }
2192             else {
2193                 Cells[cy][cx].nType = nCellType;
2194                 Cells[cy][cx].nProgStep = i;
2195                 Cells[cy][cx].sParam = pDoc->Progs[i].Params[0].sParamStr;
2196                 Cells[cy][cx].sCoilName = pDoc->Progs[i].Params[0].sParamStr;
2197                 Cells[cy][cx].nDataType = pDoc->Progs[i].Params[0].nParamType;
2198                 Cells[cy][cx].nDataAddr = pDoc->Progs[i].Params[0].nParamAddr;
2199             }
2200             if (cy > maxy) { maxy = cy; }
2201             //cy++;
2202             break;
2203
2204         case OP_TML:
2205         case OP_TMR:
2206         case OP_TMX:
2207         case OP_TMY:
2208             Cells[cy][cx].nType = typeTM;
2209             Cells[cy][cx].nProgStep = i;
2210             Cells[cy][cx].sCoilName = ShowTxt;
2211             Cells[cy][cx + 1].nType = typeExt1;
2212             Cells[cy][cx + 1].sParam = pDoc->Progs[i].Params[0].sParamStr;
2213             Cells[cy][cx + 1].nDataType = KLDataTypeEV;
2214             Cells[cy][cx + 1].nDataAddr = pDoc->Progs[i].Params[0].nParamAddr;
2215             Cells[cy][cx + 2].nType = typeExt1;
2216             Cells[cy][cx + 2].sParam = pDoc->Progs[i].Params[1].sParamStr;
2217             Cells[cy][cx + 2].nDataType = pDoc->Progs[i].Params[1].nParamType;
2218             Cells[cy][cx + 2].nDataAddr = pDoc->Progs[i].Params[1].nParamAddr;
2219             cx += 3;
2220             break;
2221         case OP_INC:
2222         case OP_DEC:
2223             Cells[cy][cx].nType = typeFN1;
2224             Cells[cy][cx].nProgStep = i;
2225             Cells[cy][cx].sCoilName = ShowTxt;
2226             Cells[cy][cx + 1].nType = typeExt1;
2227             Cells[cy][cx + 1].sParam = pDoc->Progs[i].Params[0].sParamStr;
2228             Cells[cy][cx + 1].nDataType = pDoc->Progs[i].Params[0].nParamType;
2229             Cells[cy][cx + 1].nDataAddr = pDoc->Progs[i].Params[0].nParamAddr;
2230             cx += 2;
2231             break;
2232
2233         case OP_MV:
2234         case OP_ADD2:
2235         case OP_SUB2:
2236             Cells[cy][cx].nType = typeFN2;
2237             Cells[cy][cx].nProgStep = i;
2238             Cells[cy][cx].sCoilName = ShowTxt;
2239             Cells[cy][cx + 1].nType = typeExt1;
2240             Cells[cy][cx + 1].sParam = pDoc->Progs[i].Params[0].sParamStr;
2241             Cells[cy][cx + 1].nDataType = pDoc->Progs[i].Params[0].nParamType;
2242             Cells[cy][cx + 1].nDataAddr = pDoc->Progs[i].Params[0].nParamAddr;
2243             Cells[cy][cx + 2].nType = typeExt1;
2244             Cells[cy][cx + 2].sParam = pDoc->Progs[i].Params[1].sParamStr;
2245             Cells[cy][cx + 2].nDataType = pDoc->Progs[i].Params[1].nParamType;
2246             Cells[cy][cx + 2].nDataAddr = pDoc->Progs[i].Params[1].nParamAddr;
2247             cx += 3;
2248             break;
2249
2250         case OP_ADD3:
2251         case OP_SUB3:
2252         case OP_MUL:
2253         case OP_DIV:
2254             Cells[cy][cx].nType = typeFN3;
2255             Cells[cy][cx].nProgStep = i;
2256             Cells[cy][cx].sCoilName = ShowTxt;
2257             Cells[cy][cx + 1].nType = typeExt1;
2258             Cells[cy][cx + 1].sParam = pDoc->Progs[i].Params[0].sParamStr;
2259             Cells[cy][cx + 1].nDataType = pDoc->Progs[i].Params[0].nParamType;
2260             Cells[cy][cx + 1].nDataAddr = pDoc->Progs[i].Params[0].nParamAddr;
2261             Cells[cy][cx + 2].nType = typeExt1;
2262             Cells[cy][cx + 2].sParam = pDoc->Progs[i].Params[1].sParamStr;
2263             Cells[cy][cx + 2].nDataType = pDoc->Progs[i].Params[1].nParamType;
2264             Cells[cy][cx + 2].nDataAddr = pDoc->Progs[i].Params[1].nParamAddr;
2265             Cells[cy][cx + 3].nType = typeExt1;
2266             Cells[cy][cx + 3].sParam = pDoc->Progs[i].Params[2].sParamStr;
2267             Cells[cy][cx + 3].nDataType = pDoc->Progs[i].Params[2].nParamType;
2268             Cells[cy][cx + 3].nDataAddr = pDoc->Progs[i].Params[2].nParamAddr;
2269             cx += 4;
2270             break;
2271
2272         default:
2273             break;
2274         }
2275     }
2276     m_nTotalRow = maxy + 1;
2277     /*
2278         for (int i = 0; i < 25; i++)
2279         {
2280             for (int j = 0; j < 16; j++)
2281             {
2282                 Cells[i][j].nType = i;
2283                 s1.Format(_T("%d:%d"), i, j);
2284                 Cells[i][j].sCoilName = s1;
2285             }
2286         }
2287     */
2288     needReDraw = 1;
2289     return 0;
2290 }
2291
2292
2293 int CMTerm2View::TransLDSToProg()
2294 {
2295     // TODO: 在此处添加实现代码.
0a20f7 2296     CMTerm2Doc * pDoc = GetDocument();
0ed438 2297     CString s1;
Q 2298     s1.Format(_T("Trans LDS to PRrog"));
2299     DbgLog(s1);
2300
2301     //梯形图 数量
2302     s1.Format(_T("Total Lines %d"), m_nTotalRow);
2303     DbgLog(s1);
2304     //分段
2305     int nDivCount = 0;
2306     int Divs[100] = { 0 };
2307     for (int i = 0; i < m_nTotalRow; i++)    {
2308         int nRow = i;
2309         int bConnected = 0;
2310         for (int j = 0; j < m_CellPerLine; j++)        {
2311             int nCol = j;
2312             if (Cells[nRow][nCol].bLeftLineDn) {
2313                 bConnected = 1; break;
2314             }
2315         }
2316         if (!bConnected) {
2317             //找到一处分界点
2318             Divs[nDivCount] = i;
2319             s1.Format(_T("Div at Line %d "), nRow);
2320             DbgLog(s1);
2321             nDivCount++;
2322         }
2323     }
0a20f7 2324     stProgSection allprogs;
0ed438 2325     //每段单独处理
Q 2326     for (int i = 0; i < nDivCount; i++)    {
2327         int nStartLine, nEndLine;
2328         if (i == 0) { nStartLine = 0; nEndLine = Divs[i]; }
2329         else { nStartLine = Divs[i - 1]+1; nEndLine = Divs[i]; }
2330         s1.Format(_T("Process Line %d - %d "), nStartLine, nEndLine);
2331         DbgLog(s1);
2332         int nCounts[20] = { 0 };
2333         int nCounts2[20] = { 0 };
2334         int nCounts3[20] = { 0 };
2335
2336         s1.Empty();
2337         for (int j = 0; j < m_CellPerLine; j++)    {
2338             int nCount = 0;
2339             int nCount2 = 0;
2340             int nCount3 = 0;
2341             for (int k = nStartLine; k <= nEndLine; k++) {
2342                 if (Cells[k][j].nType) {
2343                     nCount += 1;
2344                     nCount2 += 1;
2345                     nCount3 += 1;
2346                     if (Cells[k][j].bLeftLineUp) nCount2 -= 1;
2347 //                    if (Cells[k][j].bLeftLineDn) nCount2 -= 1;
2348                     if (j != m_CellPerLine - 1)    {
2349                         if (Cells[k][j + 1].bLeftLineUp) nCount3 -= 1;
2350 //                        if (Cells[k][j + 1].bLeftLineDn) nCount3 -= 1;
2351                     }
2352
2353                 }
2354             }
2355             nCounts[j] = nCount;
2356             nCounts2[j] = nCount2;
2357             nCounts3[j] = nCount3;
2358         }
2359         s1.Empty();
2360         for (int j = 0; j < m_CellPerLine; j++) {
2361             s1.AppendFormat(_T(" %d(%d)"), nCounts[j],nCounts3[j]);
2362         }
2363         DbgLog(s1);
2364         s1.Empty();
2365         for (int j = 0; j < m_CellPerLine; j++)    {
2366             s1.AppendFormat(_T(" %d "), nCounts2[j]);
2367         }
2368         DbgLog(s1);
2369         //开始从左到右,从上到下扫描,主要关注 竖直连接线。
2370         int nCurPosX,nCurPosY;
2371         nCurPosY = nStartLine;
2372         nCurPosX = 0;
2373         CString sProg;
2374         int nAllSteps=0;
0a20f7 2375         stProgSection Progsec;
0ed438 2376         for (int i = nStartLine; i <= nEndLine; i++){
0a20f7 2377             CString sProgSec;
0ed438 2378             int nSteps = 0;;
Q 2379             nCurPosY = i;
0a20f7 2380             stProgSection thisprogsec;
0ed438 2381             if (Cells[i][0].nType)
0a20f7 2382             ScanLDSCells(nStartLine, nEndLine, nCurPosY, nCurPosX, 0, thisprogsec, sProgSec,nSteps);
Q 2383             sProg += sProgSec;
0ed438 2384             nAllSteps += nSteps;
0a20f7 2385             Progsec += thisprogsec;
0ed438 2386         }
Q 2387         DbgLog(_T("\r\n")+ sProg);
65f713 2388         int n = int(Progsec.Progs.size());
0a20f7 2389         s1.Format(_T("progSec steps %d "), n);
Q 2390         DbgLog(s1);
2391         for (int i = 0; i < n; i++) {
2392             int optype = Progsec.Progs[i].nOpType1;
2393             CStringA OpTxtA, OpShowTxtA;
2394             CString OpTxt, OpShowTxt;
2395             pDoc->OpToTxt(optype, OpTxtA);
2396             pDoc->OpToShowTxt(optype, OpShowTxtA);
2397             OpTxt = OpTxtA;
2398             OpShowTxt = OpShowTxtA;
2399             s1.Format(_T("%d %s %s"), optype, OpTxt, OpShowTxt);
2400             DbgLog(s1);
2401         }
2402         allprogs += Progsec;
0ed438 2403     }
Q 2404     //输出程序
65f713 2405     int n=(int)allprogs.Progs.size();
0a20f7 2406     s1.Format(_T("all prog steps %d "), n);
Q 2407     DbgLog(s1);
2408     for (int i = 0; i < n; i++)    {
2409         int optype=allprogs.Progs[i].nOpType1;
2410         CStringA OpTxtA,OpShowTxtA;
2411         CString OpTxt,OpShowTxt;
2412         pDoc->OpToTxt(optype, OpTxtA);
2413         pDoc->OpToShowTxt(optype, OpShowTxtA);
2414         OpTxt = OpTxtA;
2415         OpShowTxt = OpShowTxtA;
2416         s1.Format(_T("%d %s %s"), optype, OpTxt, OpShowTxt);
65f713 2417 //        DbgLog(s1);
0a20f7 2418     }
0ed438 2419     return 0;
Q 2420 }
2421
0a20f7 2422 int CMTerm2View::ScanLDSCells(int nStartLine, int nEndLine, int nPosY, int nPosX, int nLevel, stProgSection & progsec, CString & sProgSec, int &nSteps)
0ed438 2423 {
Q 2424     // TODO: 在此处添加实现代码.
2425     CString s1;
2426     int nCurPosX, nCurPosY;
2427     int nNextX = 1;
2428     nCurPosY = nPosY;
2429     nCurPosX = nPosX;
2430
2431     for (int j = nPosX; j < m_CellPerLine; j+=nNextX) {
2432         nCurPosX = j;
2433         //先处理当前单元;
2434         int nType = Cells[nCurPosY][nCurPosX].nType;
2435         CString sCellName = Cells[nCurPosY][nCurPosX].sCoilName;
0a20f7 2436         CMTerm2Doc::stProg theprog;
Q 2437
0ed438 2438         if (nType == typeNO) {
Q 2439             if (j==0) {
2440                 s1.Format(_T("%d %d ST %s"), nCurPosY, nCurPosX,sCellName);
2441                 sProgSec.AppendFormat(_T("ST %s\r\n"),sCellName);
0a20f7 2442                 theprog.nOpType1 = OP_ST;
Q 2443                 progsec.Append(theprog);
0ed438 2444             }
Q 2445             else {
2446                 s1.Format(_T("%d %d AN %s"), nCurPosY, nCurPosX, sCellName);
2447                 sProgSec.AppendFormat(_T("NO %s\r\n"), sCellName);
0a20f7 2448                 theprog.nOpType1 = OP_AN;
Q 2449                 progsec.Append(theprog);
0ed438 2450             }
Q 2451             nSteps += 1;
2452             DbgLog(s1);
2453             nNextX =  1;
2454         }else 
2455         if (nType == typeNC) {
2456             if (j == 0) {
2457                 s1.Format(_T("%d %d ST/ %s"), nCurPosY, nCurPosX, sCellName);
2458                 sProgSec.AppendFormat(_T("ST/ %s\r\n"), sCellName);
0a20f7 2459                 theprog.nOpType1 = OP_ST_;
Q 2460                 progsec.Append(theprog);
2461
0ed438 2462             }
Q 2463             else
2464             {
2465                 s1.Format(_T("%d %d AN/ %s"), nCurPosY, nCurPosX, sCellName);
2466                 sProgSec.AppendFormat(_T("AN/ %s\r\n"), sCellName);
0a20f7 2467                 theprog.nOpType1 = OP_AN_;
Q 2468                 progsec.Append(theprog);
0ed438 2469             }
Q 2470             DbgLog(s1);
2471             nSteps += 1;
2472             nNextX =  1;
2473         }else 
2474         if (nType == typePP) {
2475             s1.Format(_T("%d %d PP %s"), nCurPosY, nCurPosX, sCellName);
2476             DbgLog(s1);
0a20f7 2477             //progsec.Append(theprog);
0ed438 2478             sProgSec.AppendFormat(_T("PP %s\r\n"), sCellName);
Q 2479             nSteps += 1;
2480             nNextX =  1;
2481         }else 
2482         if (nType == typePN) {
2483             s1.Format(_T("%d %d PN %s"), nCurPosY, nCurPosX, sCellName);
2484             DbgLog(s1);
0a20f7 2485             //progsec.Append(theprog);
0ed438 2486             sProgSec.AppendFormat(_T("PN %s\r\n"), sCellName, sCellName);
Q 2487             nSteps += 1;
2488             nNextX =  1;
2489         }else 
2490         if (nType == typeNOT) {
2491             s1.Format(_T("%d %d NOT %s"), nCurPosY, nCurPosX, sCellName);
2492             DbgLog(s1);
2493             sProgSec.AppendFormat(_T("NOT %s\r\n"), sCellName);
0a20f7 2494             theprog.nOpType1 = OP_NOT;
Q 2495             progsec.Append(theprog);
0ed438 2496             nSteps += 1;
Q 2497             nNextX =  1;
2498         }else 
2499         if (nType == typeDF) {
2500             s1.Format(_T("%d %d DF %s"), nCurPosY, nCurPosX, sCellName);
2501             DbgLog(s1);
2502             sProgSec.AppendFormat(_T("DF %s\r\n"), sCellName);
0a20f7 2503             theprog.nOpType1 = OP_DF;
Q 2504             progsec.Append(theprog);
0ed438 2505             nSteps += 1;
Q 2506             nNextX =  1;
2507         }else 
2508         if (nType == typeDF_) {
2509             s1.Format(_T("%d %d DF/ %s"), nCurPosY, nCurPosX, sCellName);
2510             DbgLog(s1);
2511             sProgSec.AppendFormat(_T("DF/ %s\r\n"), sCellName);
0a20f7 2512             theprog.nOpType1 = OP_DF_;
Q 2513             progsec.Append(theprog);
0ed438 2514             nSteps += 1;
Q 2515             nNextX =  1;
2516         }else 
2517         if (nType == typeOUT) {
2518             s1.Format(_T("%d %d OUT %s"), nCurPosY, nCurPosX, sCellName);
2519             DbgLog(s1);
2520             sProgSec.AppendFormat(_T("OUT %s\r\n"), sCellName);
0a20f7 2521             theprog.nOpType1 = OP_OUT;
Q 2522             progsec.Append(theprog);
0ed438 2523             nSteps += 1;
Q 2524             nNextX =  1;
2525         }else 
2526         if (nType == typeSET) {
2527             s1.Format(_T("%d %d SET %s"), nCurPosY, nCurPosX, sCellName);
2528             DbgLog(s1);
2529             sProgSec.AppendFormat(_T("SET %s\r\n"), sCellName);
0a20f7 2530             theprog.nOpType1 = OP_SET;
Q 2531             progsec.Append(theprog);
0ed438 2532             nSteps += 1;
Q 2533             nNextX =  1;
2534         }else 
2535         if (nType == typeRESET) {
2536             s1.Format(_T("%d %d RESET %s"), nCurPosY, nCurPosX, sCellName);
2537             DbgLog(s1);
2538             sProgSec.AppendFormat(_T("RESET %s\r\n"), sCellName);
0a20f7 2539             theprog.nOpType1 = OP_RESET;
Q 2540             progsec.Append(theprog);
0ed438 2541             nSteps += 1;
Q 2542             nNextX =  1;
2543         }else 
2544         if (nType == typeCMP) {
2545             s1.Format(_T("%d %d CMP %s %s %s"), nCurPosY, nCurPosX, sCellName,Cells[nCurPosY][nCurPosX+1].sParam,Cells[nCurPosY][nCurPosX + 2].sParam);
2546             DbgLog(s1);
0a20f7 2547             theprog.nOpType1 = OP_ST_GT;
Q 2548             progsec.Append(theprog);
0ed438 2549             sProgSec.AppendFormat(_T("CMP %s %s %s \r\n"), sCellName, Cells[nCurPosY][nCurPosX + 1].sParam, Cells[nCurPosY][nCurPosX + 2].sParam);
Q 2550             nSteps += 1;
2551             nNextX =  3;
2552         }else 
2553         if (nType == typeTM) {
2554             s1.Format(_T("%d %d TM %s %d %s"), nCurPosY, nCurPosX, sCellName,Cells[nCurPosY][nCurPosX+1].sParam,Cells[nCurPosY][nCurPosX + 2].sParam);
2555             DbgLog(s1);
0a20f7 2556             theprog.nOpType1 = OP_TMX;
Q 2557             progsec.Append(theprog);
0ed438 2558             sProgSec.AppendFormat(_T("TM %s %d %s\r\n"), sCellName, Cells[nCurPosY][nCurPosX+1].sParam, Cells[nCurPosY][nCurPosX + 2].sParam);
Q 2559             nSteps += 1;
2560             nNextX =  3;
2561         }else 
2562         if (nType == typeFN1) {
2563             s1.Format(_T("%d %d FN1 %s %s"), nCurPosY, nCurPosX, sCellName,Cells[nCurPosY][nCurPosX + 1].sParam);
2564             DbgLog(s1);
0a20f7 2565             theprog.nOpType1 = OP_INC;
Q 2566             progsec.Append(theprog);
0ed438 2567             sProgSec.AppendFormat(_T("FN1 %s %s\r\n"), sCellName, Cells[nCurPosY][nCurPosX + 1].sParam);
Q 2568             nSteps += 1;
2569             nNextX =  2;
2570         }else 
2571         if (nType == typeFN2) {
2572             s1.Format(_T("%d %d FN2 %s %s %s "), nCurPosY, nCurPosX, sCellName, Cells[nCurPosY][nCurPosX + 1].sParam, Cells[nCurPosY][nCurPosX + 2].sParam);
2573             DbgLog(s1);
0a20f7 2574             theprog.nOpType1 = OP_MV;
Q 2575             progsec.Append(theprog);
0ed438 2576             sProgSec.AppendFormat(_T("FN2 %s %s %s \r\n"), sCellName, Cells[nCurPosY][nCurPosX + 1].sParam, Cells[nCurPosY][nCurPosX + 2].sParam);
Q 2577             nSteps += 1;
2578             nNextX =  3;
2579         }else 
2580         if (nType == typeFN3) {
2581             s1.Format(_T("%d %d FN3 %s %s %s %s"), nCurPosY, nCurPosX, sCellName, Cells[nCurPosY][nCurPosX + 1].sParam, Cells[nCurPosY][nCurPosX + 2].sParam, Cells[nCurPosY][nCurPosX + 3].sParam);
2582             DbgLog(s1);
0a20f7 2583             theprog.nOpType1 = OP_ADD3;
Q 2584             progsec.Append(theprog);
0ed438 2585             sProgSec.AppendFormat(_T("FN3 %s %s %s %s\r\n"), sCellName, Cells[nCurPosY][nCurPosX + 1].sParam, Cells[nCurPosY][nCurPosX + 2].sParam, Cells[nCurPosY][nCurPosX + 3].sParam);
Q 2586             nSteps += 1;
2587             nNextX =  4;
2588         }else {
2589             nNextX =  1;
2590             //continue;
2591         }
0a20f7 2592
0ed438 2593         if (j + nNextX >= m_CellPerLine) continue;
Q 2594         if (Cells[nCurPosY][j + nNextX].bLeftLineUp || Cells[nCurPosY][j + nNextX].bLeftLineDn) {    // 发现竖线
2595             //先看往上面有没有连接
2596             if (Cells[nCurPosY][j + nNextX].bLeftLineUp) { // 往上面有连接
2597                 s1.Format(_T("%d %d ORS "), nCurPosY, nCurPosX);
2598                 DbgLog(s1);
0a20f7 2599                 theprog.nOpType1 = OP_ORS;
Q 2600                 progsec.Append(theprog);
0ed438 2601                 sProgSec.AppendFormat(_T("ORS \r\n"));
Q 2602                 nSteps += 1;
2603                 nLevel -= 1;
2604             }
2605             int nLeftUpCon = 0;
2606             if (Cells[nCurPosY][j + nNextX].bLeftLineUp ) nLeftUpCon = 1;
2607             //向下查找,看看竖线的左侧下面还有没有连接其他东西/
2608             int nLeftDnCon = 0;
2609             for (int k = nCurPosY + 1; k <= nEndLine; k++) {
2610                 if (!Cells[k][j + nNextX].bLeftLineUp) break;  // 竖线到最下面的端点了。
2611                 if (Cells[k][j + nNextX - 1 ].nType) { nLeftDnCon += 1; break; }
2612             }
2613             s1.Format(_T("LeftUp %d   LeftDn  %d"), nLeftUpCon, nLeftDnCon);
2614             DbgLog(s1);
2615             if (nLeftDnCon) {    //左侧有连接,那么扫描到这个竖线,继续扫描左侧下面的内容。
2616
2617                 return 1;
2618             }
2619             if (!nLeftDnCon) {// 左侧下面没有连接,那么这个就是左面最后的单元,开始处理右面的单元。
2620                 if (nLeftUpCon) {
2621                     if ( nPosX >0 || nLevel > 0) {
2622                     s1.Format(_T("%d %d ANS "), nCurPosY, nCurPosX);
2623                     DbgLog(s1);
0a20f7 2624                     theprog.nOpType1 = OP_ANS;
Q 2625                     progsec.Append(theprog);
0ed438 2626                     sProgSec.AppendFormat(_T("ANS \r\n"));
Q 2627                     nSteps += 1;
2628                     nLevel -= 1;
2629                 }
2630
2631                 }
2632                 //从头到尾处理, 查找此竖线的最高位置;
2633                 int nLineTop = nCurPosY;
2634                 int nLineBottom = nCurPosY;
2635                 for (int k = nCurPosY; k >= nStartLine; k--)
2636                 {
2637                     if (!Cells[k][j + nNextX].bLeftLineUp) {  break; }
2638                     nLineTop = k -1;
2639                 }
2640                 // 查找右侧有几个连接
2641                 int nRightCon = 0;
2642                 for (int k = nLineTop; k <= nEndLine; k++) {
2643                     if (Cells[k][j + nNextX].nType) { nRightCon += 1; }
2644                     nLineBottom = k;
2645                     if (!Cells[k][j + nNextX].bLeftLineDn) { break; }
2646                 }
2647                 s1.Format(_T("VLine %d - %d : %d , right = %d "), nLineTop,nLineBottom,j+nNextX,nRightCon);
2648                 DbgLog(s1);
2649                 if (nRightCon == 1) {
2650                     s1.Format(_T(">>>> Go %d : %d , level %d "), nLineTop, j + nNextX, nLevel);
2651                     DbgLog(s1);
2652                     CString ProgSec;
2653                     int theSteps = 0;
0a20f7 2654                     stProgSection thisprogsec;
Q 2655                     int r = ScanLDSCells(nStartLine, nEndLine, nLineTop, j + nNextX, nLevel,thisprogsec, ProgSec,theSteps);
0ed438 2656                     sProgSec += ProgSec;
Q 2657                     nSteps += theSteps;
0a20f7 2658                     progsec += thisprogsec;
0ed438 2659                     s1.Format(_T("<<<< Re %d : %d , Result %d "), nLineTop, j + nNextX, r);
Q 2660                     DbgLog(s1);
2661                 }
2662                 else
2663                 {
2664                     int nLastResult = 0;
2665                     int nRightCount = 0;
2666                     CString sCons[100];
2667                     CString ProgSecs[100];
2668                     int res[100] = { 0 };
2669                     int nLastSteps = 0;
2670                     for (int k = nLineTop; k <= nLineBottom; k++)
2671                     {
2672                         //s1.Format(_T("VLine %d - %d : %d       %d of %d "), nLineTop, nLineBottom, j + nNextX, k+1,nRightCon);
2673                         //DbgLog(s1);
2674                         if (Cells[k][j + nNextX].nType) {
2675                             s1.Format(_T(" >>> Go %d : %d , level %d "), k, j + nNextX, nLevel +1);
2676                             DbgLog(s1);
2677                             CString ProgSec;
2678                             int theSteps = 0;
2679                             nLevel += 1;
0a20f7 2680                             stProgSection thisprogsec;
Q 2681                             res[nRightCount] = ScanLDSCells(nStartLine, nEndLine, k, j + nNextX, nLevel ,thisprogsec,ProgSecs[nRightCount],theSteps);
0ed438 2682                             nLastResult = res[nRightCount];
Q 2683                             nSteps += theSteps;
0a20f7 2684                             progsec += thisprogsec;
0ed438 2685                             //if (res[nRightCount] > 0) nLevel += 1;
Q 2686                             sProgSec += ProgSec;
2687                             s1.Format(_T(" <<< Re %d : %d , Result %d Steps %d Last %d"), k, j + nNextX, res[nRightCount],theSteps,nLastSteps);
2688                             DbgLog(s1);
2689                             if (nRightCount == 0) {
2690                             }
2691                             else if (res[nRightCount-1] == 0) {
2692                                 s1.Format(_T(" POPS"), k, j + nNextX, nLevel + 1);
2693                                 DbgLog(s1);
2694                                 //sProgSec.AppendFormat(_T("POPS \r\n"));
2695                                 if (nLastSteps > 1) 
2696                                 {
2697                                     if (sCons[nRightCount - 1] == _T("POPS")) { sCons[nRightCount - 1] = _T("RDS"); }
2698                                     else { sCons[nRightCount - 1] = _T("PSHS"); }
2699                                     sCons[nRightCount] = _T("POPS");
2700                                 }
2701                             }
2702                             else {
2703
2704                             }
2705                             nLastSteps = theSteps;
2706                             nRightCount++;
2707                         }
2708                     }
2709                     nLastResult = 0;
2710                     for (int k = 0; k < nRightCount; k++)
2711                     {
2712                         if (nLastResult || res[k]) { s1 = _T("ST") + ProgSecs[k];  ProgSecs[k] =s1; }
2713                         s1= sCons[k] + _T("\r\n") + ProgSecs[k];
2714                         sProgSec.Append(s1);
2715                         nLastResult = res[k];
2716                     }
2717                     if (nLastResult) sProgSec.Append(_T("ANS\r\n"));
2718                     return 0;
2719                 }
2720             }
2721         }
2722     }
2723     return 0;
2724 }