zxd
2023-10-21 89cd7441c184d37f90d4d5311b348e938119765f
提交 | 用户 | 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);
b978bf 1195 //    m_pStatusBar->SetPaneBackgroundColor(6, RGB(255, 255, 0));
Q 1196 //    m_pStatusBar->SetPaneTextColor(6, RGB(0, 0, 255));
0ed438 1197 //    m_pStatusBar->EnablePaneProgressBar(6);
Q 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;
fc8a81 1432     //当前行之后的所有,下移一行
0ed438 1433     for (int i = m_nTotalRow - 1; i >= m_FocusRow; i--) {
Q 1434         for (int j = 0; j < m_CellPerLine; j++) {
1435             Cells[i + 1][j] = Cells[i][j];
1436         }
1437     }
1438     m_nTotalRow += 1;
fc8a81 1439     // 当前行灰色    
0ed438 1440     for (int j = 0; j < m_CellPerLine; j++)    {
Q 1441         Cells[m_FocusRow][j].clear();
1442         Cells[m_FocusRow][j].bEditing = 1;
1443         Cells[m_FocusRow][j].bModified = 1;
1444         if (Cells[m_FocusRow + 1][j].bLeftLineUp) {
1445             Cells[m_FocusRow][j].bLeftLineUp = 1;
1446             Cells[m_FocusRow][j].bLeftLineDn = 1;
1447         }
1448     }
e00d5a 1449
fc8a81 1450     // 当前行 加入 触点
dd67df 1451 //    m_FocusCol;
Q 1452 //    Cells[m_FocusRow][0].nType= typeNO;
1453 //    Cells[m_FocusRow][0].nDataType = KLCoilTypeX;
1454 //    Cells[m_FocusRow][0].nDataAddr = 15;
1455 //    Cells[m_FocusRow][0].sCoilName = "ABCDEFG";
fc8a81 1456
0ed438 1457     m_bModified = 1;
Q 1458     needReDraw = 1;
1459     this->RedrawWindow();
1460 }
e00d5a 1461 int FindTypeIndex(CString str[], CString strType, int num)
YC 1462 {
1463     for (int i = 0;i < num;i++)
1464     {
1465         if (strType == str[i])
1466         {
1467             return i;
1468         }
1469     }
1470     return -1;
1471 }
418cb3 1472
e00d5a 1473 void CMTerm2View::GetIncToView(stCell cell1)               //**************************************************************************************************//
YC 1474 {
0ed438 1475
e00d5a 1476
YC 1477     Cells[m_FocusRow][m_FocusCol] = cell1;
1478
1479     m_bModified = 1;
1480     needReDraw = 1;
1481     m_FocusCol += 1;
1482     if (m_FocusCol >= 16) 
1483     { m_FocusCol = 0;m_FocusRow += 1; }
1484     
1485     this->RedrawWindow();
1486     
1487 }
0ed438 1488 void CMTerm2View::OnUpdateInsertBlankLine(CCmdUI *pCmdUI)
Q 1489 {
1490     // TODO: 在此添加命令更新用户界面处理程序代码
1491 }
1492
1493 void CMTerm2View::OnDeleteBlankLine()
1494 {
1495     // TODO: 在此添加命令处理程序代码
1496     CString s1;
1497     s1.Format(_T("Delete Blank Line"));
1498     SysLog(s1);
1499 }
1500
1501 void CMTerm2View::OnUpdateDeleteBlankLine(CCmdUI *pCmdUI)
1502 {
1503     // TODO: 在此添加命令更新用户界面处理程序代码
1504 }
1505
1506 void CMTerm2View::OnRectSelect()
1507 {
1508     // TODO: 在此添加命令处理程序代码
1509 }
1510
1511
1512 void CMTerm2View::OnUpdateRectSelect(CCmdUI *pCmdUI)
1513 {
1514     // TODO: 在此添加命令更新用户界面处理程序代码
1515 }
1516
1517
1518 void CMTerm2View::OnTextFirst()
1519 {
1520     // TODO: 在此添加命令处理程序代码
1521 }
1522
1523
1524 void CMTerm2View::OnUpdateTextFirst(CCmdUI *pCmdUI)
1525 {
1526     // TODO: 在此添加命令更新用户界面处理程序代码
1527 }
1528
1529 void CMTerm2View::OnDisplayComments()
1530 {
1531     // TODO: 在此添加命令处理程序代码
1532     m_bShowComments = !m_bShowComments;
1533     int CellTotalHeight = m_CellHeight + (m_bShowComments ? m_CommentHeight : 0);
1534     CRect rect0;
1535     this->GetClientRect(&rect0);
1536
1537     CSize sizeTotal;
1538     // TODO: 计算此视图的合计大小
1539     sizeTotal.cx = m_LeftMargin + m_CellWidth * m_CellPerLine + m_CellWidth * 2;
1540     sizeTotal.cy = m_TopMargin + CellTotalHeight * (m_nTotalRow-1)  + rect0.Height();
1541     SetScrollSizes(MM_TEXT, sizeTotal);
1542     needReDraw = 1;
1543     this->Invalidate();
1544 }
1545
1546
1547 void CMTerm2View::OnUpdateDisplayComments(CCmdUI *pCmdUI)
1548 {
1549     // TODO: 在此添加命令更新用户界面处理程序代码
1550     pCmdUI->SetCheck(m_bShowComments == true);
1551 }
1552
1553
1554
1555 int CMTerm2View::UpdateStatusBar(int nIndex)
1556 {
1557     // TODO: 在此处添加实现代码.
1558     CString s1;
1559     CMTerm2Doc * pDoc = (CMTerm2Doc*)GetDocument();
1560
1561     if (nIndex == idxMachineType || nIndex == -1) {        //机型代码
1562         s1 = pDoc->m_sMachineType;
1563         m_pStatusBar->SetPaneText(idxMachineType,s1);
1564     }
1565     if (nIndex == idxProgPos || nIndex == -1) { //程序位置/步数
1566         s1.Format(_T("%5d/%5d"), m_nCurProgStep,pDoc->m_nProgSteps);
1567         m_pStatusBar->SetPaneText(idxProgPos, s1);
1568     }
1569     if (nIndex == idxOnline || nIndex == -1) { //在线 /离线
1570         if (!pDoc->m_bOnline) {
1571             s1 = _T("离线");
1572             m_pStatusBar->SetPaneText(idxOnline, s1);
b978bf 1573 //            m_pStatusBar->SetPaneBackgroundColor(idxOnline);
0ed438 1574         }
Q 1575         else if (pDoc->m_bOnline) {
1576             if (pDoc->m_bSimulate)    {
1577                 s1 = _T("在线(仿真)");
1578                 m_pStatusBar->SetPaneText(2, s1);
b978bf 1579 //                m_pStatusBar->SetPaneBackgroundColor(idxOnline, OnlineColor);
0ed438 1580             }else{
Q 1581                 s1 = _T("在线");
1582                 m_pStatusBar->SetPaneText(2, s1);
b978bf 1583 //                m_pStatusBar->SetPaneBackgroundColor(idxOnline, OnlineColor);
0ed438 1584             }
Q 1585         }
1586     }
1587     if (nIndex == idxRunning || nIndex == -1) { // 运行 / 停止
1588         if (!pDoc->m_bOnline)        {
1589             s1 = _T("");
1590             m_pStatusBar->SetPaneText(idxRunning, s1);
b978bf 1591 //            m_pStatusBar->SetPaneBackgroundColor(idxRunning);
Q 1592 //            m_pStatusBar->SetPaneWidth(idxRunning, 0);
0ed438 1593             m_pStatusBar->SetPaneStyle(idxRunning, SBPS_DISABLED);
Q 1594
1595         }else if (!pDoc->m_bPlcRunning) {
1596             s1 = _T("PROG");
1597             m_pStatusBar->SetPaneText(idxRunning, s1);
b978bf 1598 //            m_pStatusBar->SetPaneWidth(idxRunning, s1.GetLength()*8);
Q 1599 //            m_pStatusBar->SetPaneBackgroundColor(idxRunning, ProgColor);
0ed438 1600         }else {
Q 1601             s1 = _T("RUN");
1602             m_pStatusBar->SetPaneText(idxRunning, s1);
b978bf 1603 //            m_pStatusBar->SetPaneWidth(idxRunning, s1.GetLength() * 8);
Q 1604 //            m_pStatusBar->SetPaneBackgroundColor(idxRunning, RunningColor);
0ed438 1605         }
Q 1606     }
1607     if (nIndex == idxMonitor || nIndex == -1) { // 监控 //
1608 //        s1 = pDoc->m_sMachineType;
1609         if (!m_bMonitoring) {
1610             s1 = _T("[监控停止]");
1611             m_pStatusBar->SetPaneText(idxMonitor, s1);
b978bf 1612 //            m_pStatusBar->SetPaneBackgroundColor(idxMonitor);
0ed438 1613         }else{
Q 1614             s1 = _T("[正在监控]");
1615             m_pStatusBar->SetPaneText(idxMonitor, s1);
b978bf 1616 //            m_pStatusBar->SetPaneBackgroundColor(idxMonitor, MonitorColor);
0ed438 1617         }
Q 1618     }
1619     if (nIndex == idxAddress || nIndex == -1) { // 地址,本站
1620 //        s1 = pDoc->m_sMachineType;
1621         if (!pDoc->m_bOnline) {
1622             s1 = _T("本站");
1623             m_pStatusBar->SetPaneText(idxAddress, s1);
b978bf 1624 //            m_pStatusBar->SetPaneBackgroundColor(idxMonitor);
0ed438 1625         }else {
Q 1626             s1 = _T("本站");
1627             m_pStatusBar->SetPaneText(idxAddress, s1);
b978bf 1628 //            m_pStatusBar->SetPaneBackgroundColor(idxMonitor, AddressColor);
0ed438 1629         }
Q 1630
1631     }
1632     if (nIndex == idxInfoDisp || nIndex == -1) { // INFO DISPLAY
1633 //        s1 = pDoc->m_sMachineType;
1634 //        m_pStatusBar->SetPaneText(idxInfoDisp, s1);
1635     }
1636
1637     return 0;
1638 }
1639
1640
1641 void CMTerm2View::OnUpdateIndicatorMonitorStatus(CCmdUI *pCmdUI)
1642 {
1643     // TODO: 在此添加命令更新用户界面处理程序代码
1644
1645     //pCmdUI->SetCheck(m_bMonitoring == true);
1646     if (!m_bMonitoring)     pCmdUI->SetText(_T("[监控停止]"));
1647     else     pCmdUI->SetText(_T("[正在监控]"));
1648 }
1649
1650 void CMTerm2View::OnUpdateIndicators(CCmdUI *pCmdUI)
1651 {
1652     // TODO: 在此添加命令更新用户界面处理程序代码
1653     CString s1;
1654     s1.Format(_T("pCmdUI nID %d "));
1655     DbgLog(s1);
1656     pCmdUI->m_nID;
1657     pCmdUI->SetText(_T("KL-D20N16"));
1658 }
1659
1660 void CMTerm2View::OnUpdateMachineType(CCmdUI *pCmdUI)
1661 {
1662     // TODO: 在此添加命令更新用户界面处理程序代码
1663     CString s1;
1664     s1.Format(_T("pCmdUI nID %d "));
1665     DbgLog(s1);
1666     pCmdUI->m_nID;
1667     pCmdUI->SetText(_T("KL-D20N16"));
1668 }
1669
1670 void CMTerm2View::OnUpdateProgramPos(CCmdUI *pCmdUI)
1671 {
1672     // TODO: 在此添加命令更新用户界面处理程序代码
1673     CString s1;
1674     s1.Format(_T("%5d/%5d"), 18, 55);
1675     pCmdUI->SetText(s1);
1676 }
1677
1678 void CMTerm2View::OnUpdateConnectivity(CCmdUI *pCmdUI)
1679 {
1680     // TODO: 在此添加命令更新用户界面处理程序代码
1681     CString s1;
1682     s1 = _T("离线");
1683     s1 = _T("在线");
1684
1685     pCmdUI->SetText(s1);
1686 }
1687 void CMTerm2View::OnUpdateRunStatus(CCmdUI *pCmdUI)
1688 {
1689     // TODO: 在此添加命令更新用户界面处理程序代码
1690     CString s1;
1691     CMTerm2Doc* pDoc = GetDocument();
1692     ASSERT_VALID(pDoc);
1693     if (!pDoc)    return;
1694     if (pDoc->m_bPlcRunning) {
1695         s1 = _T("运行");
1696         m_pStatusBar->SetPaneText(3, s1);
b978bf 1697 //        m_pStatusBar->SetPaneTextColor(3, RGB(0, 0, 0));
0ed438 1698     }
Q 1699     else {
1700         s1 = _T("停止");
1701         m_pStatusBar->SetPaneText(3, s1);
b978bf 1702 //        m_pStatusBar->SetPaneTextColor(3, RGB(0, 0, 0));
0ed438 1703     }
Q 1704     s1.Format(_T("PCmdUI %d %d"), pCmdUI->m_nID, pCmdUI->m_nIndex);
1705     DbgLog(s1);
1706
1707 //    pCmdUI->SetText(s1);
1708 }
1709 void CMTerm2View::OnUpdateMonitorStatus(CCmdUI *pCmdUI)
1710 {
1711     // TODO: 在此添加命令更新用户界面处理程序代码
1712     CString s1;
1713     s1 = _T("停止监控");
1714     s1 = _T("监控中");
1715     if (!m_bMonitoring)     pCmdUI->SetText(_T("[监控停止]"));
1716     else     pCmdUI->SetText(_T("[正在监控]"));
1717
1718 //    pCmdUI->SetText(s1);
1719 }
1720 void CMTerm2View::OnUpdateTargetAddress(CCmdUI *pCmdUI)
1721 {
1722     // TODO: 在此添加命令更新用户界面处理程序代码
1723     CString s1;
1724     s1 = _T("远程");
1725     s1 = _T("本站");
1726     pCmdUI->SetText(s1);
1727 }
1728
1729 void CMTerm2View::OnInputIoComment()
1730 {
1731     // TODO: 在此添加命令处理程序代码
1732     CString s1;
1733     int nRow, nCol;
1734     nRow = m_FocusRow;
1735     nCol = m_FocusCol;
1736     if (nCol < 0) { nCol = 0; }
1737     if (nCol >= m_CellPerLine) { nCol = m_CellPerLine - 1; }
1738
1739     CString sParam;
1740     sParam = Cells[nRow][nCol].sParam;
1741     int nDataType, nDataAddr, nStat;
1742     nDataType = Cells[nRow][nCol].nDataType;
1743     nDataAddr = Cells[nRow][nCol].nDataAddr;
1744     nStat = Cells[nRow][nCol].nStat;
1745
1746     s1.Format(_T("Name %s DataType %d DataAddr %d  Stat %d"),
1747         sParam, nDataType, nDataAddr, nStat);
1748     SysLog(s1);
1749     if (Cells[m_FocusRow][m_FocusCol].sParam == _T("")) {
1750         return;
1751     }
1752
1753     CMTerm2Doc * pDoc = GetDocument();
1754     CString sComment;
1755     pDoc->GetAnno(nDataType, nDataAddr, sComment);
1756     CDialogIoComment dialog1;
1757     dialog1.m_sIOName = sParam;
1758     dialog1.m_sComment = sComment;
1759     dialog1.m_nCoilType = nDataType;
1760     dialog1.m_nCoilAddr = nDataAddr;
1761     INT_PTR r = dialog1.DoModal();
1762     if (r == IDOK)
1763     {
1764         sComment = dialog1.m_sComment;
1765         pDoc->SetAnno(nDataType, nDataAddr, sParam, sComment);
1766         s1.Format(_T("Set %s %d %d  comment -> %s"), sParam, nDataType, nDataAddr, sComment);
1767         SysLog(s1);
1768         //needReDraw = 1;
1769         this->RedrawWindow();
1770     }
1771 }
1772
1773
1774 int CMTerm2View::TransProgToLDS()
1775 {
1776     CString s1;
1777     CMTerm2Doc * pDoc = (CMTerm2Doc*)GetDocument();
1778
1779     // 先扫描分开的程序段
1780     int stpos[100] = { 0 };
1781     int nSts = 0;
1782
1783     for (int i = 0; i < m_nTotalRow && i < 2000; i++) {
1784         for (int j = 0; j < 16; j++) {
1785             Cells[i][j].clear();
1786             s1.Format(_T("%d:%d"), i, j);
1787             Cells[i][j].sCoilName = s1;
1788         }
1789     }
1790     POINT StPts[100];
1791     //    StPts[0] = POINT{ 0, 0 };
1792     POINT EndPt[100];
1793     int nEndPts = 0;
1794     nSts = 0;
1795     int nCurLine = 0;
1796
1797     int cx = 0, cy = 0;
1798     int maxy = 0;
1799     for (int i = 0; i < pDoc->m_nProgSteps; i++)
1800     {
1801         int nOp = pDoc->Progs[i].nOpType1;
1802         int nParamCount = pDoc->Progs[i].nParamCount;
1803         CStringA OpName;
1804         CStringA ShowTxt;
1805         pDoc->OpToTxt(nOp, OpName);
1806         pDoc->OpToShowTxt(nOp, ShowTxt);
1807         int nPairTo = pDoc->Progs[i].PairTo;
1808         int nPairOp = 0;
1809         if (nPairTo) nPairOp = pDoc->Progs[nPairTo].nOpType1;
1810         int nCellType;
1811         switch (nOp)
1812         {
1813
1814         case OP_NOP:
1815             break;
1816         case OP_ST:
1817         case OP_ST_:
1818             if (i == 0) {
1819
1820             }
1821             else {
1822                 //记录当前位置 
1823                 EndPt[nEndPts] = POINT{ cx,cy };
1824                 nEndPts++;
1825                 if (nPairOp == OP_ANS) {
1826                     //继续前进                
1827                     //cx = 0, cy = nCurLine;
1828                     //cx = StPts[nSts - 1].x;
1829                     //nCurLine = cy + 1; //另起一行
1830 ///*                
1831                     nCurLine=cy;
1832                     int hasData = 1;
1833                     while (hasData) {
1834                         hasData = 0;
1835                         for (int j = cx +1; j < m_CellPerLine; j++) {
1836                             if (Cells[nCurLine][j].nType != 0) {
1837                                 nCurLine++; hasData = 1; break;
1838                             }
1839                         }
1840                     }
1841                     //                    nCurLine = maxy + 1; //另起一行
1842                     if (nCurLine > maxy) maxy = nCurLine;
1843                     for (int j = cy; j < nCurLine; j++) {
1844                         Cells[j][cx].bLeftLineDn = 1;
1845                         Cells[j + 1][cx].bLeftLineUp = 1;
1846                     }
1847                     cy = nCurLine;
1848 //*/
1849                 }
1850                 else if (nPairOp == OP_ORS) {
1851                     cx = StPts[nSts - 1].x;
1852                     nCurLine = cy + 1; //另起一行
1853                     int hasData = 1;
1854                     while (hasData) {
1855                         hasData = 0;
1856                         for (int j = cx; j < m_CellPerLine; j++) {
1857                             if (Cells[nCurLine][j].nType != 0) {
1858                                 nCurLine++; hasData = 1; break;
1859                             }
1860                         }
1861                     }
1862                     //                    nCurLine = maxy + 1; //另起一行
1863                     if (nCurLine > maxy) maxy = nCurLine;
1864                     for (int j = cy; j < nCurLine; j++) {
1865                         Cells[j][cx].bLeftLineDn = 1;
1866                         Cells[j + 1][cx].bLeftLineUp = 1;
1867                     }
1868                     cy = nCurLine;
1869                 }
1870                 else if (nPairOp == 0) {
1871                     nCurLine = maxy + 1; //另起一行
1872                     maxy = nCurLine;
1873                     cx = 0; cy = nCurLine;
1874                 }
1875             }
1876             stpos[nSts] = i;
1877             StPts[nSts] = POINT{ cx,cy };
1878             nSts++;
1879             Cells[cy][cx].nType = pDoc->Progs[i].nOpType1 == OP_ST ? typeNO : typeNC; //typeNC
1880             Cells[cy][cx].nProgStep = i;
1881             Cells[cy][cx].sCoilName = pDoc->Progs[i].Params[0].sParamStr;
1882             Cells[cy][cx].sParam = pDoc->Progs[i].Params[0].sParamStr;
1883             Cells[cy][cx].nDataType = pDoc->Progs[i].Params[0].nParamType;
1884             Cells[cy][cx].nDataAddr = pDoc->Progs[i].Params[0].nParamAddr;
1885             cx++;    //移到下一格
1886             break;
1887         case OP_ST_EQ:
1888         case OP_ST_NE:
1889         case OP_ST_LT:
1890         case OP_ST_GT:
1891         case OP_ST_LE:
1892         case OP_ST_GE:
1893             if (i == 0) {
1894
1895             }
1896             else {
1897                 //记录当前位置 
1898                 EndPt[nEndPts] = POINT{ cx,cy };
1899                 nEndPts++;
1900                 if (nPairOp == OP_ANS) {
1901                     //继续前进                
1902                     //cx = 0, cy = nCurLine;
1903                 }
1904                 else if (nPairOp == OP_ORS) {
1905                     cx = StPts[nSts - 1].x;
1906                     nCurLine = cy + 1; //另起一行
1907                     int hasData = 1;
1908                     while (hasData) {
1909                         hasData = 0;
1910                         for (int j = cx; j < m_CellPerLine; j++) {
1911                             if (Cells[nCurLine][j].nType != 0) {
1912                                 nCurLine++; hasData = 1; break;
1913                             }
1914                         }
1915                     }
1916                     //                    nCurLine = maxy + 1; //另起一行
1917                     if (nCurLine > maxy) maxy = nCurLine;
1918                     for (int j = cy; j < nCurLine; j++) {
1919                         Cells[j][cx].bLeftLineDn = 1;
1920                         Cells[j + 1][cx].bLeftLineUp = 1;
1921                     }
1922                     cy = nCurLine;
1923                 }
1924                 else if (nPairOp == 0) {
1925                     nCurLine = maxy + 1; //另起一行
1926                     maxy = nCurLine;
1927                     cx = 0; cy = nCurLine;
1928                 }
1929             }
1930             stpos[nSts] = i;
1931             StPts[nSts] = POINT{ cx,cy };
1932             nSts++;
1933             Cells[cy][cx].nType = typeCMP;
1934             Cells[cy][cx].nProgStep = i;
1935             Cells[cy][cx].sParam = OpName;
1936             Cells[cy][cx].sCoilName = ShowTxt;
1937             Cells[cy][cx + 1].nType = typeExt1;
1938             Cells[cy][cx + 1].sParam = pDoc->Progs[i].Params[0].sParamStr;
1939             Cells[cy][cx + 1].nDataType = pDoc->Progs[i].Params[0].nParamType;
1940             Cells[cy][cx + 1].nDataAddr = pDoc->Progs[i].Params[0].nParamAddr;
1941             Cells[cy][cx + 2].nType = typeExt1;
1942             Cells[cy][cx + 2].sParam = pDoc->Progs[i].Params[1].sParamStr;
1943             Cells[cy][cx + 2].nDataType = pDoc->Progs[i].Params[1].nParamType;
1944             Cells[cy][cx + 2].nDataAddr = pDoc->Progs[i].Params[1].nParamAddr;
1945             cx += 3;    //移到下3格
1946             break;
1947
1948         case OP_AN:
1949         case OP_AN_:
1950
1951             Cells[cy][cx].nType = nOp == OP_AN ? typeNO : typeNC; //typeNC
1952             Cells[cy][cx].nProgStep = i;
1953             Cells[cy][cx].sParam = pDoc->Progs[i].Params[0].sParamStr;
1954             Cells[cy][cx].sCoilName = pDoc->Progs[i].Params[0].sParamStr;
1955             Cells[cy][cx].nDataType = pDoc->Progs[i].Params[0].nParamType;
1956             Cells[cy][cx].nDataAddr = pDoc->Progs[i].Params[0].nParamAddr;
1957             cx++;
1958             break;
1959         case OP_AN_EQ:
1960         case OP_AN_NE:
1961         case OP_AN_LT:
1962         case OP_AN_GT:
1963         case OP_AN_LE:
1964         case OP_AN_GE:
1965             Cells[cy][cx].nType = typeCMP;
1966             Cells[cy][cx].nProgStep = i;
1967             Cells[cy][cx].sCoilName = ShowTxt;
1968             Cells[cy][cx + 1].nType = typeExt1;
1969             Cells[cy][cx + 1].sParam = pDoc->Progs[i].Params[0].sParamStr;
1970             Cells[cy][cx + 1].nDataType = pDoc->Progs[i].Params[0].nParamType;
1971             Cells[cy][cx + 1].nDataAddr = pDoc->Progs[i].Params[0].nParamAddr;
1972             Cells[cy][cx + 2].nType = typeExt1;
1973             Cells[cy][cx + 2].sParam = pDoc->Progs[i].Params[1].sParamStr;
1974             Cells[cy][cx + 2].nDataType = pDoc->Progs[i].Params[1].nParamType;
1975             Cells[cy][cx + 2].nDataAddr = pDoc->Progs[i].Params[1].nParamAddr;
1976             cx += 3;
1977             break;
1978
1979         case OP_OR:
1980         case OP_OR_:
1981             EndPt[nEndPts] = POINT{ cx,cy };
1982             nEndPts++;
1983             cx = StPts[nSts - 1].x;
1984             nCurLine = cy + 1; //另起一行
1985             {
1986                 int hasData = 1;
1987                 while (hasData) {
1988                     hasData = 0;
1989                     for (int j = cx; j < m_CellPerLine; j++) {
1990                         if (Cells[nCurLine][j].nType != 0) {
1991                             nCurLine++; hasData = 1; break;
1992                         }
1993                     }
1994                 }
1995             }
1996             if (nCurLine > maxy)    maxy = nCurLine;
1997             for (int j = cy; j < nCurLine; j++) {
1998                 Cells[j][cx].bLeftLineDn = 1;
1999                 Cells[j + 1][cx].bLeftLineUp = 1;
2000             }
2001             cy = nCurLine;
2002             Cells[cy][cx].nProgStep = i;
2003             Cells[cy][cx].nType = nOp == OP_OR ? typeNO : typeNC; //typeNC
2004             Cells[cy][cx].sCoilName = pDoc->Progs[i].Params[0].sParamStr;
2005             Cells[cy][cx].sParam = pDoc->Progs[i].Params[0].sParamStr;
2006             Cells[cy][cx].nDataType = pDoc->Progs[i].Params[0].nParamType;
2007             Cells[cy][cx].nDataAddr = pDoc->Progs[i].Params[0].nParamAddr;
2008             cx++;
2009             if (cx < EndPt[nEndPts - 1].x)
2010             {    //本行补齐
2011                 for (int j = cx; j < EndPt[nEndPts - 1].x; j++)
2012                 {
2013                     Cells[cy][j].nType = typeLine1;
2014                 }
2015                 cx = EndPt[nEndPts - 1].x;
2016             }
2017             else {
2018                 //前一行补齐
2019                 for (int j = EndPt[nEndPts - 1].x; j < cx; j++)
2020                 {
2021                     Cells[EndPt[nEndPts - 1].y][j].nType = typeLine1;
2022                 }
2023
2024             }
2025             //连接上下线
2026             for (int j = EndPt[nEndPts - 1].y; j < cy; j++)
2027             {
2028                 Cells[j][cx].bLeftLineDn = 1;
2029                 Cells[j + 1][cx].bLeftLineUp = 1;
2030             }
2031             //光标位置, 前一结束点位置
2032             cy = EndPt[nEndPts - 1].y;
2033             nEndPts--;
2034
2035             break;
2036         case OP_OR_EQ:
2037         case OP_OR_NE:
2038         case OP_OR_LT:
2039         case OP_OR_GT:
2040         case OP_OR_LE:
2041         case OP_OR_GE:
2042             EndPt[nEndPts] = POINT{ cx,cy };
2043             nEndPts++;
2044             cx = StPts[nSts - 1].x;
2045             nCurLine = cy + 1; //另起一行
2046             {
2047                 int hasData = 1;
2048                 while (hasData) {
2049                     hasData = 0;
2050                     for (int j = cx; j < m_CellPerLine; j++) {
2051                         if (Cells[nCurLine][j].nType != 0) {
2052                             nCurLine++; hasData = 1; break;
2053                         }
2054                     }
2055                 }
2056             }
2057             if (nCurLine > maxy)    maxy = nCurLine;
2058             for (int j = cy; j < nCurLine; j++) {
2059                 Cells[j][cx].bLeftLineDn = 1;
2060                 Cells[j + 1][cx].bLeftLineUp = 1;
2061             }
2062             cy = nCurLine;
2063             Cells[cy][cx].nType = typeCMP;
2064             Cells[cy][cx].nProgStep = i;
2065             Cells[cy][cx].sCoilName = ShowTxt;
2066             Cells[cy][cx + 1].nType = typeExt1;
2067             Cells[cy][cx + 1].sParam = pDoc->Progs[i].Params[0].sParamStr;
2068             Cells[cy][cx + 1].nDataType = pDoc->Progs[i].Params[0].nParamType;
2069             Cells[cy][cx + 1].nDataAddr = pDoc->Progs[i].Params[0].nParamAddr;
2070             Cells[cy][cx + 2].nType = typeExt1;
2071             Cells[cy][cx + 2].sParam = pDoc->Progs[i].Params[1].sParamStr;
2072             Cells[cy][cx + 2].nDataType = pDoc->Progs[i].Params[1].nParamType;
2073             Cells[cy][cx + 2].nDataAddr = pDoc->Progs[i].Params[1].nParamAddr;
2074             cx += 3;
2075             if (cx < EndPt[nEndPts - 1].x)
2076             {    //本行补齐
2077                 for (int j = cx; j < EndPt[nEndPts - 1].x; j++)
2078                 {
2079                     Cells[cy][j].nType = typeLine1;
2080                 }
2081                 cx = EndPt[nEndPts - 1].x;
2082             }
2083             else {
2084                 //前一行补齐
2085                 for (int j = EndPt[nEndPts - 1].x; j < cx; j++)
2086                 {
2087                     Cells[EndPt[nEndPts - 1].y][j].nType = typeLine1;
2088                 }
2089
2090             }
2091             //连接上下线
2092             for (int j = EndPt[nEndPts - 1].y; j < cy; j++)
2093             {
2094                 Cells[j][cx].bLeftLineDn = 1;
2095                 Cells[j + 1][cx].bLeftLineUp = 1;
2096             }
2097             //光标位置, 前一结束点位置
2098             cy = EndPt[nEndPts - 1].y;
2099             nEndPts--;
2100
2101             break;
2102         case OP_NOT:
2103             Cells[cy][cx].nType = typeNOT;
2104             Cells[cy][cx].sCoilName = _T("NOT");
2105
2106             Cells[cy][cx].nProgStep = i;
2107             cx++;
2108             break;
2109         case OP_DF:
2110         case OP_DF_:
2111             Cells[cy][cx].nType = nOp == OP_DF ? typeDF : typeDF_;
2112             Cells[cy][cx].sCoilName = nOp == OP_DF ? _T("DF") : _T("DF/");
2113
2114             Cells[cy][cx].nProgStep = i;
2115             cx++;
2116             break;
2117         case OP_ANS:
2118             nSts--;
2119             nEndPts--;
2120
2121             break;
2122         case OP_ORS:
2123             // 当前序列与前面的序列合并。
2124             //当前序列的开始结束位置
2125             //EndPt[nEndPts] = POINT{ cx,cy };
2126             //nEndPts++;
2127             //StPts[nSts - 1]; EndPt[nEndPts - 1];
2128             //前一序列的开始结束位置
2129             StPts[nSts - 1]; EndPt[nEndPts - 1];
2130             //判断二者长度
2131             if (cx < EndPt[nEndPts - 1].x)
2132             {    //本行补齐
2133                 for (int j = cx; j < EndPt[nEndPts - 1].x; j++)
2134                 {
2135                     Cells[cy][j].nType = typeLine1;
2136                 }
2137                 cx = EndPt[nEndPts - 1].x;
2138             }
2139             else {
2140                 //前一行补齐
2141                 for (int j = EndPt[nEndPts - 1].x; j < cx; j++)
2142                 {
2143                     Cells[EndPt[nEndPts - 1].y][j].nType = typeLine1;
2144                 }
2145
2146             }
2147             //连接上下线
2148             for (int j = EndPt[nEndPts - 1].y; j < cy; j++)
2149             {
2150                 Cells[j][cx].bLeftLineDn = 1;
2151                 Cells[j + 1][cx].bLeftLineUp = 1;
2152             }
2153             //光标位置, 前一结束点位置
2154             cy = EndPt[nEndPts - 1].y;
2155             nSts--;
2156             nEndPts--;
2157
2158             break;
2159         case OP_PSHS:
2160             EndPt[nEndPts] = POINT{ cx,cy };
2161             nEndPts++;
2162             break;
2163         case OP_RDS:
2164             cx = EndPt[nEndPts - 1].x;
2165             for (int j = cx; j < m_CellPerLine; j++) {
2166                 if (Cells[cy][j].nType != 0)
2167                 {
2168                     cy++; j = cx - 1; //break;
2169                 }
2170             }
2171             for (int j = EndPt[nEndPts - 1].y; j < cy; j++)
2172             {
2173                 Cells[j][cx].bLeftLineDn = 1;
2174                 Cells[j + 1][cx].bLeftLineUp = 1;
2175             }
2176             break;
2177         case OP_POPS:
2178             cx = EndPt[nEndPts - 1].x;
2179             for (int j = cx; j < m_CellPerLine; j++) {
2180                 if (Cells[cy][j].nType != 0)
2181                 {
2182                     cy++; j = cx - 1; break;
2183                 }
2184             }
2185             for (int j = EndPt[nEndPts - 1].y; j < cy; j++)
2186             {
2187                 Cells[j][cx].bLeftLineDn = 1;
2188                 Cells[j + 1][cx].bLeftLineUp = 1;
2189             }
2190             nEndPts--;
2191
2192             break;
2193         case OP_OUT:
2194         case OP_SET:
2195         case OP_RESET:
2196             nCellType = nOp == OP_OUT ? typeOUT : nOp == OP_SET ? typeSET : typeRESET;
2197             nCurLine = cy;
2198             if (cx <= m_CellPerLine) {
2199
2200                 int hasData = 1;
2201                 while (hasData) {
2202                     hasData = 0;
2203                     for (int j = cx; j < m_CellPerLine; j++) {
2204                         if (Cells[nCurLine][j].nType != 0) {
2205                             nCurLine++; hasData = 1; break;
2206                         }
2207                     }
2208                 }
2209                 //if (nCurLine > maxy)    maxy = nCurLine;
2210                 for (int j = cy; j < nCurLine; j++) {
2211                     Cells[j][cx].bLeftLineDn = 1;
2212                     Cells[j + 1][cx].bLeftLineUp = 1;
2213                 }
2214                 cy = nCurLine;
2215                 for (int j = cx; j < m_CellPerLine; j++)
2216                 {
2217                     Cells[cy][j].nType = typeLine1;
2218                 }
2219                 Cells[cy][m_CellPerLine - 1].nType = nCellType;
2220                 Cells[cy][m_CellPerLine - 1].nProgStep = i;
2221                 Cells[cy][m_CellPerLine - 1].sParam = pDoc->Progs[i].Params[0].sParamStr;
2222                 Cells[cy][m_CellPerLine - 1].sCoilName = pDoc->Progs[i].Params[0].sParamStr;
2223                 Cells[cy][m_CellPerLine - 1].nDataType = pDoc->Progs[i].Params[0].nParamType;
2224                 Cells[cy][m_CellPerLine - 1].nDataAddr = pDoc->Progs[i].Params[0].nParamAddr;
2225                 
2226             }
2227             else {
2228                 Cells[cy][cx].nType = nCellType;
2229                 Cells[cy][cx].nProgStep = i;
2230                 Cells[cy][cx].sParam = pDoc->Progs[i].Params[0].sParamStr;
2231                 Cells[cy][cx].sCoilName = pDoc->Progs[i].Params[0].sParamStr;
2232                 Cells[cy][cx].nDataType = pDoc->Progs[i].Params[0].nParamType;
2233                 Cells[cy][cx].nDataAddr = pDoc->Progs[i].Params[0].nParamAddr;
2234             }
2235             if (cy > maxy) { maxy = cy; }
2236             //cy++;
2237             break;
2238
2239         case OP_TML:
2240         case OP_TMR:
2241         case OP_TMX:
2242         case OP_TMY:
2243             Cells[cy][cx].nType = typeTM;
2244             Cells[cy][cx].nProgStep = i;
2245             Cells[cy][cx].sCoilName = ShowTxt;
2246             Cells[cy][cx + 1].nType = typeExt1;
2247             Cells[cy][cx + 1].sParam = pDoc->Progs[i].Params[0].sParamStr;
2248             Cells[cy][cx + 1].nDataType = KLDataTypeEV;
2249             Cells[cy][cx + 1].nDataAddr = pDoc->Progs[i].Params[0].nParamAddr;
2250             Cells[cy][cx + 2].nType = typeExt1;
2251             Cells[cy][cx + 2].sParam = pDoc->Progs[i].Params[1].sParamStr;
2252             Cells[cy][cx + 2].nDataType = pDoc->Progs[i].Params[1].nParamType;
2253             Cells[cy][cx + 2].nDataAddr = pDoc->Progs[i].Params[1].nParamAddr;
2254             cx += 3;
2255             break;
2256         case OP_INC:
2257         case OP_DEC:
2258             Cells[cy][cx].nType = typeFN1;
2259             Cells[cy][cx].nProgStep = i;
2260             Cells[cy][cx].sCoilName = ShowTxt;
2261             Cells[cy][cx + 1].nType = typeExt1;
2262             Cells[cy][cx + 1].sParam = pDoc->Progs[i].Params[0].sParamStr;
2263             Cells[cy][cx + 1].nDataType = pDoc->Progs[i].Params[0].nParamType;
2264             Cells[cy][cx + 1].nDataAddr = pDoc->Progs[i].Params[0].nParamAddr;
2265             cx += 2;
2266             break;
2267
2268         case OP_MV:
2269         case OP_ADD2:
2270         case OP_SUB2:
2271             Cells[cy][cx].nType = typeFN2;
2272             Cells[cy][cx].nProgStep = i;
2273             Cells[cy][cx].sCoilName = ShowTxt;
2274             Cells[cy][cx + 1].nType = typeExt1;
2275             Cells[cy][cx + 1].sParam = pDoc->Progs[i].Params[0].sParamStr;
2276             Cells[cy][cx + 1].nDataType = pDoc->Progs[i].Params[0].nParamType;
2277             Cells[cy][cx + 1].nDataAddr = pDoc->Progs[i].Params[0].nParamAddr;
2278             Cells[cy][cx + 2].nType = typeExt1;
2279             Cells[cy][cx + 2].sParam = pDoc->Progs[i].Params[1].sParamStr;
2280             Cells[cy][cx + 2].nDataType = pDoc->Progs[i].Params[1].nParamType;
2281             Cells[cy][cx + 2].nDataAddr = pDoc->Progs[i].Params[1].nParamAddr;
2282             cx += 3;
2283             break;
2284
2285         case OP_ADD3:
2286         case OP_SUB3:
2287         case OP_MUL:
2288         case OP_DIV:
2289             Cells[cy][cx].nType = typeFN3;
2290             Cells[cy][cx].nProgStep = i;
2291             Cells[cy][cx].sCoilName = ShowTxt;
2292             Cells[cy][cx + 1].nType = typeExt1;
2293             Cells[cy][cx + 1].sParam = pDoc->Progs[i].Params[0].sParamStr;
2294             Cells[cy][cx + 1].nDataType = pDoc->Progs[i].Params[0].nParamType;
2295             Cells[cy][cx + 1].nDataAddr = pDoc->Progs[i].Params[0].nParamAddr;
2296             Cells[cy][cx + 2].nType = typeExt1;
2297             Cells[cy][cx + 2].sParam = pDoc->Progs[i].Params[1].sParamStr;
2298             Cells[cy][cx + 2].nDataType = pDoc->Progs[i].Params[1].nParamType;
2299             Cells[cy][cx + 2].nDataAddr = pDoc->Progs[i].Params[1].nParamAddr;
2300             Cells[cy][cx + 3].nType = typeExt1;
2301             Cells[cy][cx + 3].sParam = pDoc->Progs[i].Params[2].sParamStr;
2302             Cells[cy][cx + 3].nDataType = pDoc->Progs[i].Params[2].nParamType;
2303             Cells[cy][cx + 3].nDataAddr = pDoc->Progs[i].Params[2].nParamAddr;
2304             cx += 4;
2305             break;
2306
2307         default:
2308             break;
2309         }
2310     }
2311     m_nTotalRow = maxy + 1;
2312     /*
2313         for (int i = 0; i < 25; i++)
2314         {
2315             for (int j = 0; j < 16; j++)
2316             {
2317                 Cells[i][j].nType = i;
2318                 s1.Format(_T("%d:%d"), i, j);
2319                 Cells[i][j].sCoilName = s1;
2320             }
2321         }
2322     */
2323     needReDraw = 1;
2324     return 0;
2325 }
2326
2327
2328 int CMTerm2View::TransLDSToProg()
2329 {
2330     // TODO: 在此处添加实现代码.
0a20f7 2331     CMTerm2Doc * pDoc = GetDocument();
0ed438 2332     CString s1;
Q 2333     s1.Format(_T("Trans LDS to PRrog"));
2334     DbgLog(s1);
2335
2336     //梯形图 数量
2337     s1.Format(_T("Total Lines %d"), m_nTotalRow);
2338     DbgLog(s1);
2339     //分段
2340     int nDivCount = 0;
2341     int Divs[100] = { 0 };
2342     for (int i = 0; i < m_nTotalRow; i++)    {
2343         int nRow = i;
2344         int bConnected = 0;
2345         for (int j = 0; j < m_CellPerLine; j++)        {
2346             int nCol = j;
2347             if (Cells[nRow][nCol].bLeftLineDn) {
2348                 bConnected = 1; break;
2349             }
2350         }
2351         if (!bConnected) {
2352             //找到一处分界点
2353             Divs[nDivCount] = i;
2354             s1.Format(_T("Div at Line %d "), nRow);
2355             DbgLog(s1);
2356             nDivCount++;
2357         }
2358     }
0a20f7 2359     stProgSection allprogs;
0ed438 2360     //每段单独处理
Q 2361     for (int i = 0; i < nDivCount; i++)    {
2362         int nStartLine, nEndLine;
2363         if (i == 0) { nStartLine = 0; nEndLine = Divs[i]; }
2364         else { nStartLine = Divs[i - 1]+1; nEndLine = Divs[i]; }
2365         s1.Format(_T("Process Line %d - %d "), nStartLine, nEndLine);
2366         DbgLog(s1);
2367         int nCounts[20] = { 0 };
2368         int nCounts2[20] = { 0 };
2369         int nCounts3[20] = { 0 };
2370
2371         s1.Empty();
2372         for (int j = 0; j < m_CellPerLine; j++)    {
2373             int nCount = 0;
2374             int nCount2 = 0;
2375             int nCount3 = 0;
2376             for (int k = nStartLine; k <= nEndLine; k++) {
2377                 if (Cells[k][j].nType) {
2378                     nCount += 1;
2379                     nCount2 += 1;
2380                     nCount3 += 1;
2381                     if (Cells[k][j].bLeftLineUp) nCount2 -= 1;
2382 //                    if (Cells[k][j].bLeftLineDn) nCount2 -= 1;
2383                     if (j != m_CellPerLine - 1)    {
2384                         if (Cells[k][j + 1].bLeftLineUp) nCount3 -= 1;
2385 //                        if (Cells[k][j + 1].bLeftLineDn) nCount3 -= 1;
2386                     }
2387
2388                 }
2389             }
2390             nCounts[j] = nCount;
2391             nCounts2[j] = nCount2;
2392             nCounts3[j] = nCount3;
2393         }
2394         s1.Empty();
2395         for (int j = 0; j < m_CellPerLine; j++) {
2396             s1.AppendFormat(_T(" %d(%d)"), nCounts[j],nCounts3[j]);
2397         }
2398         DbgLog(s1);
2399         s1.Empty();
2400         for (int j = 0; j < m_CellPerLine; j++)    {
2401             s1.AppendFormat(_T(" %d "), nCounts2[j]);
2402         }
2403         DbgLog(s1);
2404         //开始从左到右,从上到下扫描,主要关注 竖直连接线。
2405         int nCurPosX,nCurPosY;
2406         nCurPosY = nStartLine;
2407         nCurPosX = 0;
2408         CString sProg;
2409         int nAllSteps=0;
0a20f7 2410         stProgSection Progsec;
0ed438 2411         for (int i = nStartLine; i <= nEndLine; i++){
0a20f7 2412             CString sProgSec;
0ed438 2413             int nSteps = 0;;
Q 2414             nCurPosY = i;
0a20f7 2415             stProgSection thisprogsec;
0ed438 2416             if (Cells[i][0].nType)
0a20f7 2417             ScanLDSCells(nStartLine, nEndLine, nCurPosY, nCurPosX, 0, thisprogsec, sProgSec,nSteps);
Q 2418             sProg += sProgSec;
0ed438 2419             nAllSteps += nSteps;
0a20f7 2420             Progsec += thisprogsec;
0ed438 2421         }
Q 2422         DbgLog(_T("\r\n")+ sProg);
65f713 2423         int n = int(Progsec.Progs.size());
0a20f7 2424         s1.Format(_T("progSec steps %d "), n);
Q 2425         DbgLog(s1);
2426         for (int i = 0; i < n; i++) {
2427             int optype = Progsec.Progs[i].nOpType1;
2428             CStringA OpTxtA, OpShowTxtA;
2429             CString OpTxt, OpShowTxt;
2430             pDoc->OpToTxt(optype, OpTxtA);
2431             pDoc->OpToShowTxt(optype, OpShowTxtA);
2432             OpTxt = OpTxtA;
2433             OpShowTxt = OpShowTxtA;
2434             s1.Format(_T("%d %s %s"), optype, OpTxt, OpShowTxt);
2435             DbgLog(s1);
2436         }
2437         allprogs += Progsec;
0ed438 2438     }
Q 2439     //输出程序
65f713 2440     int n=(int)allprogs.Progs.size();
0a20f7 2441     s1.Format(_T("all prog steps %d "), n);
Q 2442     DbgLog(s1);
2443     for (int i = 0; i < n; i++)    {
2444         int optype=allprogs.Progs[i].nOpType1;
2445         CStringA OpTxtA,OpShowTxtA;
2446         CString OpTxt,OpShowTxt;
2447         pDoc->OpToTxt(optype, OpTxtA);
2448         pDoc->OpToShowTxt(optype, OpShowTxtA);
2449         OpTxt = OpTxtA;
2450         OpShowTxt = OpShowTxtA;
2451         s1.Format(_T("%d %s %s"), optype, OpTxt, OpShowTxt);
65f713 2452 //        DbgLog(s1);
0a20f7 2453     }
0ed438 2454     return 0;
Q 2455 }
2456
0a20f7 2457 int CMTerm2View::ScanLDSCells(int nStartLine, int nEndLine, int nPosY, int nPosX, int nLevel, stProgSection & progsec, CString & sProgSec, int &nSteps)
0ed438 2458 {
Q 2459     // TODO: 在此处添加实现代码.
2460     CString s1;
2461     int nCurPosX, nCurPosY;
2462     int nNextX = 1;
2463     nCurPosY = nPosY;
2464     nCurPosX = nPosX;
2465
2466     for (int j = nPosX; j < m_CellPerLine; j+=nNextX) {
2467         nCurPosX = j;
2468         //先处理当前单元;
2469         int nType = Cells[nCurPosY][nCurPosX].nType;
2470         CString sCellName = Cells[nCurPosY][nCurPosX].sCoilName;
0a20f7 2471         CMTerm2Doc::stProg theprog;
Q 2472
0ed438 2473         if (nType == typeNO) {
Q 2474             if (j==0) {
2475                 s1.Format(_T("%d %d ST %s"), nCurPosY, nCurPosX,sCellName);
2476                 sProgSec.AppendFormat(_T("ST %s\r\n"),sCellName);
0a20f7 2477                 theprog.nOpType1 = OP_ST;
Q 2478                 progsec.Append(theprog);
0ed438 2479             }
Q 2480             else {
2481                 s1.Format(_T("%d %d AN %s"), nCurPosY, nCurPosX, sCellName);
2482                 sProgSec.AppendFormat(_T("NO %s\r\n"), sCellName);
0a20f7 2483                 theprog.nOpType1 = OP_AN;
Q 2484                 progsec.Append(theprog);
0ed438 2485             }
Q 2486             nSteps += 1;
2487             DbgLog(s1);
2488             nNextX =  1;
2489         }else 
2490         if (nType == typeNC) {
2491             if (j == 0) {
2492                 s1.Format(_T("%d %d ST/ %s"), nCurPosY, nCurPosX, sCellName);
2493                 sProgSec.AppendFormat(_T("ST/ %s\r\n"), sCellName);
0a20f7 2494                 theprog.nOpType1 = OP_ST_;
Q 2495                 progsec.Append(theprog);
2496
0ed438 2497             }
Q 2498             else
2499             {
2500                 s1.Format(_T("%d %d AN/ %s"), nCurPosY, nCurPosX, sCellName);
2501                 sProgSec.AppendFormat(_T("AN/ %s\r\n"), sCellName);
0a20f7 2502                 theprog.nOpType1 = OP_AN_;
Q 2503                 progsec.Append(theprog);
0ed438 2504             }
Q 2505             DbgLog(s1);
2506             nSteps += 1;
2507             nNextX =  1;
2508         }else 
2509         if (nType == typePP) {
2510             s1.Format(_T("%d %d PP %s"), nCurPosY, nCurPosX, sCellName);
2511             DbgLog(s1);
0a20f7 2512             //progsec.Append(theprog);
0ed438 2513             sProgSec.AppendFormat(_T("PP %s\r\n"), sCellName);
Q 2514             nSteps += 1;
2515             nNextX =  1;
2516         }else 
2517         if (nType == typePN) {
2518             s1.Format(_T("%d %d PN %s"), nCurPosY, nCurPosX, sCellName);
2519             DbgLog(s1);
0a20f7 2520             //progsec.Append(theprog);
0ed438 2521             sProgSec.AppendFormat(_T("PN %s\r\n"), sCellName, sCellName);
Q 2522             nSteps += 1;
2523             nNextX =  1;
2524         }else 
2525         if (nType == typeNOT) {
2526             s1.Format(_T("%d %d NOT %s"), nCurPosY, nCurPosX, sCellName);
2527             DbgLog(s1);
2528             sProgSec.AppendFormat(_T("NOT %s\r\n"), sCellName);
0a20f7 2529             theprog.nOpType1 = OP_NOT;
Q 2530             progsec.Append(theprog);
0ed438 2531             nSteps += 1;
Q 2532             nNextX =  1;
2533         }else 
2534         if (nType == typeDF) {
2535             s1.Format(_T("%d %d DF %s"), nCurPosY, nCurPosX, sCellName);
2536             DbgLog(s1);
2537             sProgSec.AppendFormat(_T("DF %s\r\n"), sCellName);
0a20f7 2538             theprog.nOpType1 = OP_DF;
Q 2539             progsec.Append(theprog);
0ed438 2540             nSteps += 1;
Q 2541             nNextX =  1;
2542         }else 
2543         if (nType == typeDF_) {
2544             s1.Format(_T("%d %d DF/ %s"), nCurPosY, nCurPosX, sCellName);
2545             DbgLog(s1);
2546             sProgSec.AppendFormat(_T("DF/ %s\r\n"), sCellName);
0a20f7 2547             theprog.nOpType1 = OP_DF_;
Q 2548             progsec.Append(theprog);
0ed438 2549             nSteps += 1;
Q 2550             nNextX =  1;
2551         }else 
2552         if (nType == typeOUT) {
2553             s1.Format(_T("%d %d OUT %s"), nCurPosY, nCurPosX, sCellName);
2554             DbgLog(s1);
2555             sProgSec.AppendFormat(_T("OUT %s\r\n"), sCellName);
0a20f7 2556             theprog.nOpType1 = OP_OUT;
Q 2557             progsec.Append(theprog);
0ed438 2558             nSteps += 1;
Q 2559             nNextX =  1;
2560         }else 
2561         if (nType == typeSET) {
2562             s1.Format(_T("%d %d SET %s"), nCurPosY, nCurPosX, sCellName);
2563             DbgLog(s1);
2564             sProgSec.AppendFormat(_T("SET %s\r\n"), sCellName);
0a20f7 2565             theprog.nOpType1 = OP_SET;
Q 2566             progsec.Append(theprog);
0ed438 2567             nSteps += 1;
Q 2568             nNextX =  1;
2569         }else 
2570         if (nType == typeRESET) {
2571             s1.Format(_T("%d %d RESET %s"), nCurPosY, nCurPosX, sCellName);
2572             DbgLog(s1);
2573             sProgSec.AppendFormat(_T("RESET %s\r\n"), sCellName);
0a20f7 2574             theprog.nOpType1 = OP_RESET;
Q 2575             progsec.Append(theprog);
0ed438 2576             nSteps += 1;
Q 2577             nNextX =  1;
2578         }else 
2579         if (nType == typeCMP) {
2580             s1.Format(_T("%d %d CMP %s %s %s"), nCurPosY, nCurPosX, sCellName,Cells[nCurPosY][nCurPosX+1].sParam,Cells[nCurPosY][nCurPosX + 2].sParam);
2581             DbgLog(s1);
0a20f7 2582             theprog.nOpType1 = OP_ST_GT;
Q 2583             progsec.Append(theprog);
0ed438 2584             sProgSec.AppendFormat(_T("CMP %s %s %s \r\n"), sCellName, Cells[nCurPosY][nCurPosX + 1].sParam, Cells[nCurPosY][nCurPosX + 2].sParam);
Q 2585             nSteps += 1;
2586             nNextX =  3;
2587         }else 
2588         if (nType == typeTM) {
2589             s1.Format(_T("%d %d TM %s %d %s"), nCurPosY, nCurPosX, sCellName,Cells[nCurPosY][nCurPosX+1].sParam,Cells[nCurPosY][nCurPosX + 2].sParam);
2590             DbgLog(s1);
0a20f7 2591             theprog.nOpType1 = OP_TMX;
Q 2592             progsec.Append(theprog);
0ed438 2593             sProgSec.AppendFormat(_T("TM %s %d %s\r\n"), sCellName, Cells[nCurPosY][nCurPosX+1].sParam, Cells[nCurPosY][nCurPosX + 2].sParam);
Q 2594             nSteps += 1;
2595             nNextX =  3;
2596         }else 
2597         if (nType == typeFN1) {
2598             s1.Format(_T("%d %d FN1 %s %s"), nCurPosY, nCurPosX, sCellName,Cells[nCurPosY][nCurPosX + 1].sParam);
2599             DbgLog(s1);
0a20f7 2600             theprog.nOpType1 = OP_INC;
Q 2601             progsec.Append(theprog);
0ed438 2602             sProgSec.AppendFormat(_T("FN1 %s %s\r\n"), sCellName, Cells[nCurPosY][nCurPosX + 1].sParam);
Q 2603             nSteps += 1;
2604             nNextX =  2;
2605         }else 
2606         if (nType == typeFN2) {
2607             s1.Format(_T("%d %d FN2 %s %s %s "), nCurPosY, nCurPosX, sCellName, Cells[nCurPosY][nCurPosX + 1].sParam, Cells[nCurPosY][nCurPosX + 2].sParam);
2608             DbgLog(s1);
0a20f7 2609             theprog.nOpType1 = OP_MV;
Q 2610             progsec.Append(theprog);
0ed438 2611             sProgSec.AppendFormat(_T("FN2 %s %s %s \r\n"), sCellName, Cells[nCurPosY][nCurPosX + 1].sParam, Cells[nCurPosY][nCurPosX + 2].sParam);
Q 2612             nSteps += 1;
2613             nNextX =  3;
2614         }else 
2615         if (nType == typeFN3) {
2616             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);
2617             DbgLog(s1);
0a20f7 2618             theprog.nOpType1 = OP_ADD3;
Q 2619             progsec.Append(theprog);
0ed438 2620             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 2621             nSteps += 1;
2622             nNextX =  4;
2623         }else {
2624             nNextX =  1;
2625             //continue;
2626         }
0a20f7 2627
0ed438 2628         if (j + nNextX >= m_CellPerLine) continue;
Q 2629         if (Cells[nCurPosY][j + nNextX].bLeftLineUp || Cells[nCurPosY][j + nNextX].bLeftLineDn) {    // 发现竖线
2630             //先看往上面有没有连接
2631             if (Cells[nCurPosY][j + nNextX].bLeftLineUp) { // 往上面有连接
2632                 s1.Format(_T("%d %d ORS "), nCurPosY, nCurPosX);
2633                 DbgLog(s1);
0a20f7 2634                 theprog.nOpType1 = OP_ORS;
Q 2635                 progsec.Append(theprog);
0ed438 2636                 sProgSec.AppendFormat(_T("ORS \r\n"));
Q 2637                 nSteps += 1;
2638                 nLevel -= 1;
2639             }
2640             int nLeftUpCon = 0;
2641             if (Cells[nCurPosY][j + nNextX].bLeftLineUp ) nLeftUpCon = 1;
2642             //向下查找,看看竖线的左侧下面还有没有连接其他东西/
2643             int nLeftDnCon = 0;
2644             for (int k = nCurPosY + 1; k <= nEndLine; k++) {
2645                 if (!Cells[k][j + nNextX].bLeftLineUp) break;  // 竖线到最下面的端点了。
2646                 if (Cells[k][j + nNextX - 1 ].nType) { nLeftDnCon += 1; break; }
2647             }
2648             s1.Format(_T("LeftUp %d   LeftDn  %d"), nLeftUpCon, nLeftDnCon);
2649             DbgLog(s1);
2650             if (nLeftDnCon) {    //左侧有连接,那么扫描到这个竖线,继续扫描左侧下面的内容。
2651
2652                 return 1;
2653             }
2654             if (!nLeftDnCon) {// 左侧下面没有连接,那么这个就是左面最后的单元,开始处理右面的单元。
2655                 if (nLeftUpCon) {
2656                     if ( nPosX >0 || nLevel > 0) {
2657                     s1.Format(_T("%d %d ANS "), nCurPosY, nCurPosX);
2658                     DbgLog(s1);
0a20f7 2659                     theprog.nOpType1 = OP_ANS;
Q 2660                     progsec.Append(theprog);
0ed438 2661                     sProgSec.AppendFormat(_T("ANS \r\n"));
Q 2662                     nSteps += 1;
2663                     nLevel -= 1;
2664                 }
2665
2666                 }
2667                 //从头到尾处理, 查找此竖线的最高位置;
2668                 int nLineTop = nCurPosY;
2669                 int nLineBottom = nCurPosY;
2670                 for (int k = nCurPosY; k >= nStartLine; k--)
2671                 {
2672                     if (!Cells[k][j + nNextX].bLeftLineUp) {  break; }
2673                     nLineTop = k -1;
2674                 }
2675                 // 查找右侧有几个连接
2676                 int nRightCon = 0;
2677                 for (int k = nLineTop; k <= nEndLine; k++) {
2678                     if (Cells[k][j + nNextX].nType) { nRightCon += 1; }
2679                     nLineBottom = k;
2680                     if (!Cells[k][j + nNextX].bLeftLineDn) { break; }
2681                 }
2682                 s1.Format(_T("VLine %d - %d : %d , right = %d "), nLineTop,nLineBottom,j+nNextX,nRightCon);
2683                 DbgLog(s1);
2684                 if (nRightCon == 1) {
2685                     s1.Format(_T(">>>> Go %d : %d , level %d "), nLineTop, j + nNextX, nLevel);
2686                     DbgLog(s1);
2687                     CString ProgSec;
2688                     int theSteps = 0;
0a20f7 2689                     stProgSection thisprogsec;
Q 2690                     int r = ScanLDSCells(nStartLine, nEndLine, nLineTop, j + nNextX, nLevel,thisprogsec, ProgSec,theSteps);
0ed438 2691                     sProgSec += ProgSec;
Q 2692                     nSteps += theSteps;
0a20f7 2693                     progsec += thisprogsec;
0ed438 2694                     s1.Format(_T("<<<< Re %d : %d , Result %d "), nLineTop, j + nNextX, r);
Q 2695                     DbgLog(s1);
2696                 }
2697                 else
2698                 {
2699                     int nLastResult = 0;
2700                     int nRightCount = 0;
2701                     CString sCons[100];
2702                     CString ProgSecs[100];
2703                     int res[100] = { 0 };
2704                     int nLastSteps = 0;
2705                     for (int k = nLineTop; k <= nLineBottom; k++)
2706                     {
2707                         //s1.Format(_T("VLine %d - %d : %d       %d of %d "), nLineTop, nLineBottom, j + nNextX, k+1,nRightCon);
2708                         //DbgLog(s1);
2709                         if (Cells[k][j + nNextX].nType) {
2710                             s1.Format(_T(" >>> Go %d : %d , level %d "), k, j + nNextX, nLevel +1);
2711                             DbgLog(s1);
2712                             CString ProgSec;
2713                             int theSteps = 0;
2714                             nLevel += 1;
0a20f7 2715                             stProgSection thisprogsec;
Q 2716                             res[nRightCount] = ScanLDSCells(nStartLine, nEndLine, k, j + nNextX, nLevel ,thisprogsec,ProgSecs[nRightCount],theSteps);
0ed438 2717                             nLastResult = res[nRightCount];
Q 2718                             nSteps += theSteps;
0a20f7 2719                             progsec += thisprogsec;
0ed438 2720                             //if (res[nRightCount] > 0) nLevel += 1;
Q 2721                             sProgSec += ProgSec;
2722                             s1.Format(_T(" <<< Re %d : %d , Result %d Steps %d Last %d"), k, j + nNextX, res[nRightCount],theSteps,nLastSteps);
2723                             DbgLog(s1);
2724                             if (nRightCount == 0) {
2725                             }
2726                             else if (res[nRightCount-1] == 0) {
2727                                 s1.Format(_T(" POPS"), k, j + nNextX, nLevel + 1);
2728                                 DbgLog(s1);
2729                                 //sProgSec.AppendFormat(_T("POPS \r\n"));
2730                                 if (nLastSteps > 1) 
2731                                 {
2732                                     if (sCons[nRightCount - 1] == _T("POPS")) { sCons[nRightCount - 1] = _T("RDS"); }
2733                                     else { sCons[nRightCount - 1] = _T("PSHS"); }
2734                                     sCons[nRightCount] = _T("POPS");
2735                                 }
2736                             }
2737                             else {
2738
2739                             }
2740                             nLastSteps = theSteps;
2741                             nRightCount++;
2742                         }
2743                     }
2744                     nLastResult = 0;
2745                     for (int k = 0; k < nRightCount; k++)
2746                     {
2747                         if (nLastResult || res[k]) { s1 = _T("ST") + ProgSecs[k];  ProgSecs[k] =s1; }
2748                         s1= sCons[k] + _T("\r\n") + ProgSecs[k];
2749                         sProgSec.Append(s1);
2750                         nLastResult = res[k];
2751                     }
2752                     if (nLastResult) sProgSec.Append(_T("ANS\r\n"));
2753                     return 0;
2754                 }
2755             }
2756         }
2757     }
2758     return 0;
2759 }
e00d5a 2760