VC语言6.0程序设计从入门到精通-第72部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
pChattersView…》ClearChattersList();
}
CString strTemp = pMsg…》m_strText;
//得到所有的用户名并加入到用户列表中
do
{
CString sName = strTemp。Left(strTemp。Find(〃:〃;0));
pChattersView…》AddToChattersList(sName);
strTemp = strTemp。Mid(strTemp。Find(〃:〃 ; 0)+1);
}while(strTemp。Find(〃:〃;0) != …1);
·319 ·
…………………………………………………………Page 331……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
}
为 DeleteContents() 函数编写如下代码:
void CChatClientDoc::DeleteContents()
{
if ((m_pSocket != NULL) && (m_pFile != NULL) && (m_pArchiveOut != NULL))
{
//首先发送用户名
SendMsg(m_strName; LEAVING_CHAT; false);
CMsg msg;
CString strTemp;
//发送普通消息
strTemp。Format(〃:离开了聊天室〃);
msg。code = NORMAL_MESSAGE;
msg。m_bClose = TRUE;
msg。m_strText = m_strName + strTemp;
msg。Serialize(*m_pArchiveOut);
m_pArchiveOut…》Flush();
}
//删除各对象
delete m_pArchiveOut;
m_pArchiveOut = NULL;
delete m_pArchiveIn;
m_pArchiveIn = NULL;
delete m_pFile;
m_pFile = NULL;
//关闭连接
if (m_pSocket != NULL)
{
m_pSocket…》ShutDown(2);
delete m_pSocket;
m_pSocket = NULL;
}
//更新视图
for(POSITION pos=GetFirstViewPosition();pos!=NULL;)
{
CView* pView = GetNextView(pos);
if (pView…》IsKindOf(RUNTIME_CLASS(CMessageView)))
{
CMessageView* pChatView = (CMessageView*)pView;
pChatView…》GetEditCtrl()。SetWindowText(_T(〃〃));
·320 ·
…………………………………………………………Page 332……………………………………………………………
第 11 章 网络编程
}
if (pView…》IsKindOf(RUNTIME_CLASS(CChattersView)))
{
CChattersView* pCChattersView = (CChattersView*)pView;
pCChattersView…》ClearChattersList();
}
}
CDocument::DeleteContents();
}
至此,整个程序编写完毕。分别运行服务器端程序和客户端程序,效果如图 11…13~图 11…15
所示。
图 11…13 服务器端界面 图 11…14 客户端界面 1
图 11…15 客户端界面 2
本程序实现了一个简单的基于服务器/客户端模型的网络聊天系统,系统功能虽然简单,
但是体现了一般网络编程的基本步骤 。在本程序中,由于对信息进行了封装,且采用了文档
视图结构,用户可以很容易扩展其功能,比如可以加入两人私聊(其他人看不到聊天内容 )、
服务器广播等功能。由于篇幅所限,这些功能请读者自行实现。
·321 ·
…………………………………………………………Page 333……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
11。5 利用 MSm 控件进行串口编程
计算机串口编程在网络通信中也有着十分广泛的应用,比如电话、传真、视频控制等。
本节将介绍如何在 Visual C++ 中利用 MSm 控件进行串口编程。
11。5。1 MSm 控件介绍
1.MSm 控件处理通信的方式
MSm 控件为应用程序提供了读写串口功能,它提供了两种处理通信的方法。
o 事件驱动方式 。在这种情况下,使用 MSm 控件的 Onm 事件可以捕获和处理
这些通信事件。同时,Onm 也可以捕获和处理通信中的错误。
o 查询方式。用户可以在每个重要的程序功能之后检查 mEvent 属性的值来检测事
件和通信错误。在通信频繁的情况下,这种方式更为方便。
2 .MSm 控件常用属性
(1)mPort 属性
该属性用于设置或返回通信端口号,端口号的范围是 1~16,默认为 1。对应的函数为
void SetmPort(short nNewValue)和 short GetmPort() 。
(2 )Settings 属性
该属性用于设置或返回数据传输率、奇偶校验、数据位和停止位参数,其属性值格式为
“BBBB;P;D;S ”。
其中 BBBB 为数据传输率,P 为奇偶校验,D 为数据位,S 为停止位。默认值为
9600;N;8;1 ”。
“
该属性对应的函数为 void SetSettings(LPCTSTR lpszNewValue)和 String GetSettings()。
(3 )PortOpen 属性
该属性用于设置或返回串口状态,值为 TRUE 时打开,值为 FALSE 时关闭。如果要打
开端口,则必须现设置 mPort 属性。
该属性对应的函数为 void SetPortOpen(BOOL bNewValue)和 BOOL GetPortOpen() 。
(4 )Input 属性
该属性用于从接收缓冲区中读取数据,其对应的函数为 VARIANT GetInput() 。
(5 )InputMode 属性
该属性用于设置或返回从接收缓冲区读取数据的格式,属性值为 0 时表示以文本格式读
取数据;属性之为 1 时表示以二进制格式读取数据;属性值为 2 时表示以十六进制格式读取
数据。
该属性对应的函数分别为 void SetInputMode(long nNewValue)和 long GetInputMode() 。
(6 )InBufferCount 属性
该属性用于设置或返回在接收缓冲区中等待的字符数,该属性在端口未打开时不可用。
·322 ·
…………………………………………………………Page 334……………………………………………………………
第 11 章 网络编程
对应的函数为 void SetInBufferCount(short nNewValue)和 short GetInBufferCount() 。
(7 )InBufferSize 属性
该 属 性 用 于 设 置 或 返 回 接 收 缓 冲 区 大 小 的 字 节 数 , 其 对 应 的 函 数 分 别 为 void
SetInBufferSize(short nNewValue)和 short GetInBufferSize() 。
(8)Output 属性
该属性用于向发送缓冲区中写入数据,其对应的函数为 void SetOutput(const VARIANT&
newValue) 。
(9 )OutBufferCount 属性
该属性用于设置或返回在发送缓冲区中等待的字符数,该属性在端口未打开时不可用。
其对应的函数分别为 void SetOutBufferCount(short nNewValue)和 short GetOutBufferCount() 。
(10)OutBufferSize 属性
该 属 性 用 于 设 置 或 返 回 发 送 缓 冲 区 的 字 节 大 小 , 对 应 的 函 数 分 别 为 void
SetOutBufferSize(short nNewValue)和 short GetOutBufferSize() 。
(11)mEvent 属性
该属性用于设置或返回串口事件,其对应的函数分别为 void SetmEvent(short
nNewValue)和 short GetmEvent() 。常见的串口事件如表 11…13 所示。
表 11…13 常见串口事件
常数 取值 描述
EvSend 1 发送事件
EvReceive 2 接收事件
EvCTS 3 clear…to…send 线的状态发生变化
EvDSR 4 data…set ready 线的状态发生变化
EvCD 5 carrier detect 线的状态发生变化
EvRing 6 检测到震铃信号
EvEOF 7 收到文件结束字符
(12)RThreshold 属性
该属性用于设置或返回 RThreshold 数值,所谓 RThreshold 数值是通过 MSm 控件将
mEvent 属性设置为 EvReceive,并在产生 Onm 事件之前所接收的字符数。
该属性对应的函数为 void SetRThreshold(short nNewValue)和 short GetRThreshold() 。
11。5。2 利用 MSm 控件编程的基本流程
利用 MSm 控件编程的基本流程如下。
o 在当前 Project 中插入 MSm 控件;
o 初始化并打开串口;
o 捕捉串口事项;
o 串口读写;
o 关闭串口。
·323 ·
…………………………………………………………Page 335……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
11。5。3 利用 MSm 进行串口通信
实例 11…2:MSm 控件使用实例。源代码在光盘中“11实例 11…2MSm”目录下。
本节通过编写一个小程序来实现利用 MSm 控件进行串口数据传输。
新建一个基于对话框的 MFC 工程,取名为 MSm 。依次单击菜单栏的“Project ”→
“Add To Project ”→“ponents and Controls ”,弹出添加控件对话框,如图 11…16 所示。然
后打开“Registered ActiveX Controls ”文件夹,选中“Microsoft munications Control ,vision
6。0 ”控件,将其添加到工程中,如图 11…17 所示。
图 11…16 添加控件对话框 图 11…17 加入 MSm 控件
然后编辑对话框界面,完成后的效果如图 11…18 所示(本例中,用于选择串口的控件为
bo Box 控件,在为对话框添加 bo Box 控件的时候,需要为该 bo Box 控件加入
1 和 2 两个数据,分别表示串口 1 和串口 2 ),其中控件 就是 MSm 控件。
注意:在为 bo Box 控件添加数据的时候,如果数据多于一个,则在添加后面数据的时候,要
按住 Ctrl 键,同时按回车键进行换行,而不是直接用回车键进行换行。
图 11…18 对话框界面
为对话