TTYView.cpp
上传用户:seaboy_04
上传日期:2013-02-24
资源大小:284k
文件大小:4k
源码类别:

其他行业

开发平台:

Visual C++

  1. // TTYView.cpp : implementation of the CTTYView class
  2. //
  3. #include "stdafx.h"
  4. #include "TTY.h"
  5. #include "TTYDoc.h"
  6. #include "TTYView.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CTTYView
  14. IMPLEMENT_DYNCREATE(CTTYView, CEditView)
  15. BEGIN_MESSAGE_MAP(CTTYView, CEditView)
  16. //{{AFX_MSG_MAP(CTTYView)
  17. ON_WM_CHAR()
  18. ON_COMMAND(IDM_WRITE, OnWrite)
  19. //}}AFX_MSG_MAP
  20. // Standard printing commands
  21. ON_COMMAND(ID_FILE_PRINT, CEditView::OnFilePrint)
  22. ON_COMMAND(ID_FILE_PRINT_DIRECT, CEditView::OnFilePrint)
  23. ON_COMMAND(ID_FILE_PRINT_PREVIEW, CEditView::OnFilePrintPreview)
  24. ON_MESSAGE(WM_COMMNOTIFY, OnCommNotify)
  25. END_MESSAGE_MAP()
  26. /////////////////////////////////////////////////////////////////////////////
  27. // CTTYView construction/destruction
  28. CTTYView::CTTYView()
  29. {
  30. // TODO: add construction code here
  31. }
  32. CTTYView::~CTTYView()
  33. {
  34. }
  35. BOOL CTTYView::PreCreateWindow(CREATESTRUCT& cs)
  36. {
  37. // TODO: Modify the Window class or styles here by modifying
  38. //  the CREATESTRUCT cs
  39. BOOL bPreCreated = CEditView::PreCreateWindow(cs);
  40. cs.style &= ~(ES_AUTOHSCROLL|WS_HSCROLL); // Enable word-wrapping
  41. return bPreCreated;
  42. }
  43. /////////////////////////////////////////////////////////////////////////////
  44. // CTTYView drawing
  45. void CTTYView::OnDraw(CDC* pDC)
  46. {
  47. CTTYDoc* pDoc = GetDocument();
  48. ASSERT_VALID(pDoc);
  49. // TODO: add draw code for native data here
  50. }
  51. /////////////////////////////////////////////////////////////////////////////
  52. // CTTYView printing
  53. BOOL CTTYView::OnPreparePrinting(CPrintInfo* pInfo)
  54. {
  55. // default CEditView preparation
  56. return CEditView::OnPreparePrinting(pInfo);
  57. }
  58. void CTTYView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
  59. {
  60. // Default CEditView begin printing.
  61. CEditView::OnBeginPrinting(pDC, pInfo);
  62. }
  63. void CTTYView::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo)
  64. {
  65. // Default CEditView end printing
  66. CEditView::OnEndPrinting(pDC, pInfo);
  67. }
  68. /////////////////////////////////////////////////////////////////////////////
  69. // CTTYView diagnostics
  70. #ifdef _DEBUG
  71. void CTTYView::AssertValid() const
  72. {
  73. CEditView::AssertValid();
  74. }
  75. void CTTYView::Dump(CDumpContext& dc) const
  76. {
  77. CEditView::Dump(dc);
  78. }
  79. CTTYDoc* CTTYView::GetDocument() // non-debug version is inline
  80. {
  81. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTTYDoc)));
  82. return (CTTYDoc*)m_pDocument;
  83. }
  84. #endif //_DEBUG
  85. /////////////////////////////////////////////////////////////////////////////
  86. // CTTYView message handlers
  87. void CTTYView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
  88. {
  89. // TODO: Add your message handler code here and/or call default
  90. CTTYDoc* pDoc=GetDocument();
  91. unsigned char c=(char)nChar;
  92. if(!pDoc->m_bConnected)
  93. return;
  94. pDoc->WriteComm(&c, 1);
  95. if(pDoc->m_bEcho) 
  96. CEditView::OnChar(nChar, nRepCnt, nFlags); // 本地回显
  97. }
  98. LRESULT CTTYView::OnCommNotify(WPARAM wParam, LPARAM lParam)
  99. {
  100. unsigned char buf[MAXBLOCK/4];
  101. char rbuf[10];
  102. CString str;
  103. int nLength, nTextLength;
  104. CTTYDoc* pDoc=GetDocument();
  105. CEdit& edit=GetEditCtrl();
  106. if(!pDoc->m_bConnected ||  (wParam & EV_RXCHAR)!=EV_RXCHAR) // 是否是EV_RXCHAR事件?
  107. {
  108. SetEvent(pDoc->m_hPostMsgEvent); // 允许发送下一个WM_COMMNOTIFY消息
  109. return 0L;
  110. }
  111. nLength=pDoc->ReadComm(buf,1);
  112. if(nLength)
  113. {
  114. nTextLength=edit.GetWindowTextLength();
  115. edit.SetSel(nTextLength,nTextLength); //移动插入光标到正文末尾
  116. for(int i=0;i<nLength;i++)
  117. {
  118. switch(buf[i])
  119. {
  120. case 'r': // 回车
  121. if(!pDoc->m_bNewLine) 
  122. break;
  123. case 'n': // 换行
  124. str+="rn";
  125. break;
  126. case 'b': // 退格
  127. edit.SetSel(-1, 0);
  128. edit.ReplaceSel(str);
  129. nTextLength=edit.GetWindowTextLength();
  130. edit.SetSel(nTextLength-1,nTextLength);
  131. edit.ReplaceSel(""); //回退一个字符
  132. str="";
  133. break;
  134. case 'a': // 振铃 
  135. MessageBeep((UINT)-1);
  136. break;
  137. default : 
  138. // str+=buf[i];
  139. sprintf(rbuf," %02X ",buf[i]);
  140. str+=rbuf;
  141. }
  142. }
  143. edit.SetSel(-1, 0);
  144. edit.ReplaceSel(str); // 向编辑视图中插入收到的字符
  145. }
  146. SetEvent(pDoc->m_hPostMsgEvent); // 允许发送下一个WM_COMMNOTIFY消息
  147. return 0L;
  148. }
  149. void CTTYView::OnWrite() 
  150. {
  151. unsigned char buf[MAXBLOCK/4];
  152. CTTYDoc* pDoc=GetDocument();
  153. buf[0]=0x7f;
  154. buf[1]=0x1;
  155. buf[2]=0xFE;
  156. buf[3]=0xFF;
  157. buf[4]=0x02;
  158.     pDoc->WriteComm(buf,5);
  159. }