📄 chap12_4.htm
字号:
<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,
NULL))==NULL)</p>
<p align="JUSTIFY">return FALSE;</p>
<p align="JUSTIFY">// 为重叠写创建事件对象,手工重置,初始化为无信号的</p>
<p align="JUSTIFY">if((m_osWrite.hEvent=CreateEvent(NULL, TRUE, FALSE,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -