📄 chap12_4.htm
字号:
</table> <p> </p> <p align="JUSTIFY"> </p> <blockquote> <blockquote> <p align="JUSTIFY">打开ClassWizard,为IDD_COMSETTINGS模板创建一个名为CSetupDlg的对话框类。为该类加入OnInitDialog成员函数,并按表12.7加入数据成员。</p> </blockquote> </blockquote> <p><b> </b></p> <b> <p align="CENTER">表12.7 CSetupDlg类的数据成员</p> </b> <table border="1" cellspacing="1" cellpadding="1" width="579"> <tr> <td width="33%"><b> <p align="JUSTIFY">控件ID </b></td> <td width="33%"><b> <p align="JUSTIFY">变量名 </b></td> <td width="33%"><b> <p align="JUSTIFY">数据类型 </b></td> </tr> <tr> <td width="33%"> <p align="JUSTIFY">IDC_BAND </td> <td width="33%"> <p align="JUSTIFY">m_sBaud </td> <td width="33%"> <p align="JUSTIFY">CString </td> </tr> <tr> <td width="33%"> <p align="JUSTIFY">IDC_DATABITS </td> <td width="33%"> <p align="JUSTIFY">m_sDataBits </td> <td width="33%"> <p align="JUSTIFY">CString </td> </tr> <tr> <td width="33%"> <p align="JUSTIFY">IDC_ECHO </td> <td width="33%"> <p align="JUSTIFY">m_bEcho </td> <td width="33%"> <p align="JUSTIFY">BOOL </td> </tr> <tr> <td width="33%"> <p align="JUSTIFY">IDC_FLOWCTRL </td> <td width="33%"> <p align="JUSTIFY">m_nFlowCtrl </td> <td width="33%"> <p align="JUSTIFY">int </td> </tr> <tr> <td width="33%"> <p align="JUSTIFY">IDC_NEWLINE </td> <td width="33%"> <p align="JUSTIFY">m_bNewLine </td> <td width="33%"> <p align="JUSTIFY">BOOL </td> </tr> <tr> <td width="33%"> <p align="JUSTIFY">IDC_PARITY </td> <td width="33%"> <p align="JUSTIFY">m_nParity </td> <td width="33%"> <p align="JUSTIFY">int </td> </tr> <tr> <td width="33%"> <p align="JUSTIFY">IDC_PORT </td> <td width="33%"> <p align="JUSTIFY">m_sPort </td> <td width="33%"> <p align="JUSTIFY">CString </td> </tr> <tr> <td width="33%"> <p align="JUSTIFY">IDC_STOPBITS </td> <td width="33%"> <p align="JUSTIFY">m_nStopBits </td> <td width="33%"> <p align="JUSTIFY">int </td> </tr> </table> <p> </p> <p align="JUSTIFY"> </p> <blockquote> <blockquote> <p align="JUSTIFY">按清单12.6、12.7和12.8修改程序。清单12.6列出了CTerminalDoc类的部分代码,清单12.7是CTerminalView的部分代码,清单12.8是CSetupDlg类的部分代码。在本例中使用了WM_COMMNOTIFY消息。虽然在Win32中,WM_COMMNOTIFY消息已经取消,系统自己不会产生该消息,但Visual C++对该消息的定义依然保留。考虑到使用习惯,Terminal程序辅助线程通过发送该消息来通知视图有通信事件发生。</p> </blockquote> </blockquote> <p><b> </b></p> <b> <p align="JUSTIFY">清单12.6 CTerminalDoc类的部分代码</p> </b> <p align="JUSTIFY">// TerminalDoc.h : interface of the CTerminalDoc class</p> <p align="JUSTIFY">//</p> <p align="JUSTIFY">/////////////////////////////////////////////////////////////////////////////</p> <p><b> </b></p> <b> <p align="JUSTIFY"> </p> <p align="JUSTIFY">#define MAXBLOCK 2048</p> <p align="JUSTIFY">#define XON 0x11</p> <p align="JUSTIFY">#define XOFF 0x13</p> <p align="JUSTIFY"> </p> <p align="JUSTIFY">UINT CommProc(LPVOID pParam);</p> </b> <p align="JUSTIFY"> </p> <p align="JUSTIFY">class CTerminalDoc : public CDocument</p> <p align="JUSTIFY">{</p> <p align="JUSTIFY">protected: // create from serialization only</p> <p align="JUSTIFY">CTerminalDoc();</p> <p align="JUSTIFY">DECLARE_DYNCREATE(CTerminalDoc)</p> <p align="JUSTIFY"> </p> <p align="JUSTIFY">// Attributes</p> <p align="JUSTIFY">public:</p> <p><b> </b></p> <b> <p align="JUSTIFY">CWinThread* m_pThread; // 代表辅助线程</p> <p align="JUSTIFY">volatile BOOL m_bConnected;</p> <p align="JUSTIFY">volatile HWND m_hTermWnd;</p> <p align="JUSTIFY">volatile HANDLE m_hPostMsgEvent; // 用于WM_COMMNOTIFY消息的事件对象</p> <p align="JUSTIFY">OVERLAPPED m_osRead, m_osWrite; // 用于重叠读/写</p> <p align="JUSTIFY"> </p> <p align="JUSTIFY">volatile HANDLE m_hCom; // 串行口句柄</p> <p align="JUSTIFY">int m_nBaud;</p> <p align="JUSTIFY">int m_nDataBits;</p> <p align="JUSTIFY">BOOL m_bEcho;</p> <p align="JUSTIFY">int m_nFlowCtrl;</p> <p align="JUSTIFY">BOOL m_bNewLine;</p> <p align="JUSTIFY">int m_nParity;</p> <p align="JUSTIFY">CString m_sPort;</p> <p align="JUSTIFY">int m_nStopBits;</p> </b> <p align="JUSTIFY"><b></b> </p> <p align="JUSTIFY"> </p> <p align="JUSTIFY">// Operations</p> <p align="JUSTIFY">public:</p> <p><b> </b></p> <b> <p align="JUSTIFY">BOOL ConfigConnection();</p> <p align="JUSTIFY">BOOL OpenConnection();</p> <p align="JUSTIFY">void CloseConnection();</p> <p align="JUSTIFY">DWORD ReadComm(char *buf,DWORD dwLength);</p> <p align="JUSTIFY">DWORD WriteComm(char *buf,DWORD dwLength);</p> </b> <p align="JUSTIFY">// Overrides</p> <p align="JUSTIFY"><b>. . .</b></p> <p align="JUSTIFY">};</p> <p align="JUSTIFY"> </p> <p align="JUSTIFY">/////////////////////////////////////////////////////////////////////////////</p> <p align="JUSTIFY">// TerminalDoc.cpp : implementation of the CTerminalDoc class</p> <p align="JUSTIFY">//</p> <p><b> </b></p> <b> <p align="JUSTIFY">#include "SetupDlg.h"</p> </b> <p align="JUSTIFY"> </p> <p align="JUSTIFY">CTerminalDoc::CTerminalDoc()</p> <p align="JUSTIFY">{</p> <p align="JUSTIFY">// TODO: add one-time construction code here</p> <p><b> </b></p> <b> <p align="JUSTIFY">m_bConnected=FALSE;</p> <p align="JUSTIFY">m_pThread=NULL;</p> <p align="JUSTIFY"> </p> <p align="JUSTIFY">m_nBaud = 9600;</p> <p align="JUSTIFY">m_nDataBits = 8;</p> <p align="JUSTIFY">m_bEcho = FALSE;</p> <p align="JUSTIFY">m_nFlowCtrl = 0;</p> <p align="JUSTIFY">m_bNewLine = FALSE;</p> <p align="JUSTIFY">m_nParity = 0;</p> <p align="JUSTIFY">m_sPort = "COM2";</p> <p align="JUSTIFY">m_nStopBits = 0;</p> </b> <p align="JUSTIFY">}</p> <p align="JUSTIFY"> </p> <p align="JUSTIFY">CTerminalDoc::~CTerminalDoc()</p> <p align="JUSTIFY">{</p> <p><b> </b></p> <b> <p align="JUSTIFY">if(m_bConnected)</p> <p align="JUSTIFY">CloseConnection();</p> <p align="JUSTIFY">// 删除事件句柄</p> <p align="JUSTIFY">if(m_hPostMsgEvent)</p> <p align="JUSTIFY">CloseHandle(m_hPostMsgEvent);</p> <p align="JUSTIFY">if(m_osRead.hEvent)</p> <p align="JUSTIFY">CloseHandle(m_osRead.hEvent);</p> <p align="JUSTIFY">if(m_osWrite.hEvent)</p> <p align="JUSTIFY">CloseHandle(m_osWrite.hEvent);</p> </b> <p align="JUSTIFY">}</p> <p align="JUSTIFY"> </p> <p align="JUSTIFY">BOOL CTerminalDoc::OnNewDocument()</p> <p align="JUSTIFY">{</p> <p align="JUSTIFY">if (!CDocument::OnNewDocument())</p> <p align="JUSTIFY">return FALSE;</p> <p align="JUSTIFY">((CEditView*)m_viewList.GetHead())->SetWindowText(NULL);</p> <p align="JUSTIFY"> </p> <p align="JUSTIFY">// TODO: add reinitialization code here</p> <p align="JUSTIFY">// (SDI documents will reuse this document)</p> <p align="JUSTIFY"> </p> <p><b> </b></p> <b> <p align="JUSTIFY">// 为WM_COMMNOTIFY消息创建事件对象,手工重置,初始化为有信号的</p> <p align="JUSTIFY">if((m_hPostMsgEvent=CreateEvent(NULL, TRUE, TRUE, NULL))==NULL)</p> <p align="JUSTIFY">return FALSE;</p> <p align="JUSTIFY">memset(&m_osRead, 0, sizeof(OVERLAPPED));</p> <p align="JUSTIFY">memset(&m_osWrite, 0, sizeof(OVERLAPPED));</p> <p align="JUSTIFY">// 为重叠读创建事件对象,手工重置,初始化为无信号的</p> <p align="JUSTIFY">if((m_osRead.hEvent=CreateEvent(NULL, TRUE, FALSE,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -