📄 15.6.4 实现发送端功能.txt
字号:
15.6.4 实现发送端功能
本例的设计是当用户单击对话框上的【发送】按钮后,程序应将用户输入的数据发送给聊天的对方。
因此,需要捕获【发送】按钮的单击消息,并在其中实现发送功能。我们双击对话框资源上的【发
送】按钮, VC++开发环境将为该按钮自动生成一个按钮单击命令响应函数: OnBtnSend,然后在此
函数中添加代码实现数据发送的功能,结果如例 15-18所示。
例15-18
//数据发送处理
void CChatDlg : : OnBtnSend()
// TODO: Add your control not工ficat工on handler code here
//获取对方IP
DWORD dwIP ;
( (CIPAddressCtrl * )GetDlgItem (IDC_IPADDRESS1))->GetAddress(dwIP) ;
SOCKADDR_IN addrTo ;
addrTo . sin_ family=AF_INET ;
addrTo . sin-port=htons(6000) ;
addrTo.sin_addr.S_un.S_addr=htonl(dwIP) ;
CString strSend;
1/获得待发送数据
GetDlgItemText (IDC_ EDIT_ SEND , strSend) ;
//发送数据
sendto(m_ socket , strSend, strSend .GetLength() +1 , 0 , (SOCKADDR*)&addrTo,sizeof(SOCKADDR)) ;
//清空发送编辑框中的内容
SetDlgItemText (IDC_ EDIT_SEND,"" ) ;
在上述例 15-18所示 OnBtnSend函数中,首先需要从 IP地址控件 (其 E为 IDC IPADDRESS 1)上得
到对方 IP地址。在 MFC中,如果需要对控件进行操作,都是利用控件所对应的类来完成的, IP控
件对应的 MFC类是: CIPAddressCtrl。这个类有一个 GetAddress成员函数,该函数将返回 ID地址控
件中非空白字段的数值。 GetAddress函数有两种声明形式,其中一种如下所示 :
int GetAddress( DWORD& dwAddress );
GetAddress函数的这种声明形式需要一个 DWORD引用类型的参数,也就是说,我们只需要定义一个
DWORD变量,并将其传递给 GetAddress函数,就可得到以 DWORD值 ·表示的 IP地址。所以上述例
15-18所示 OnBtnSend函数中,首先调用 GetDlgltem得到E地址控件,因为该控件是 CIPAddressCtrl
类型,所以需要将 GetDlgItem函数的返回值强制转换为 CIPAddressCtrl*类型。然后调用该类的
GetAddress函数得到 E地址。
接着定义了一个地址结构 ( SOCKADDR_IN )变量 : addrTo,并设置其成员的值。其他成员的设置前
面内容已经介绍过了,这里主要关注第三个成员 sin-addrSJHIS-addr的设置,该成员是聊天对方的
IP地址,并且要求是 DWORD类型,虽然刚刚获得的 IP地址: dwIP也是 DWORD类型,但它是主机字节
顺序,因此这里需要调用 htonl函数将其转换为网络字节顺序。
接下来调用 GetDlgItemText函数得到要发迭的数据,然后调用 sendto函数发送该数据,并且多发
送一个字节。当数据发送完成之后,调用 SetDlgltemText函数清空发送编辑框中的内容。
Build井运行 Chat程序,在 IP地址控件中输入与之聊天的对方 E地址,例如,输入本地回路 IP地
址: 127.0.0.1,并在发送编辅框中输入一些字符,然后单击【发送】 -按钮,在接收编辑框中就可
以看到发送的数据。但是当再次发送数据后,看到在接收编辑框中两次接收到的数据并没有换行,
所有的数据都是在同一行显示的,如图 15.14所示。
图 15.14多次接收到的数据并未换行显示
但是在上面的 OnRecvData程序(如例 15-17所示代码)中已经为接收到的数据添加了"\r\n",即换行
符,那么为什么显示时文字没有换行呢?读者应注意,为了件接受换行符,必须设置该控件支持多行
数据这一属性,即打开接收编辑框控件的属性对话框,井打开Styles选项卡,在该选项卡中选中
Multiline选项,如图 15.15所示。
图 15.15为编辑框控件设置支持多行数据属性
然后再次运行 Chat程序,试着发送几条数据,这时可以看到数据以多行的方式显示了,如图 15.16
所示。
另外,在 Chat程序中还可以将【发送】按钮设置为默认按钮,这样用户在输入将要发送的数据之后,
只要按下回车键就可以发送该数据了。为了实现这样的功能,我们可以修改该按钮的属性,设置其
Defau1tbutton选工页,如图 15.17所示。当然,这时我们还可以将该按钮隐藏起来,即在发送按钮
属性对话框的General选项卡上取消其Visible选项(如图 15.18所示),这样Chat程序运行时就看不
到这个按钮,用户只要按下回车键就可以发
送数据。对于聊天程序来说,这种操作方式对用户是很方便的。这时的程序运行界面如图
15.19所示。
图 1 5 . 1 7设置发送按钮的默认按钮选项
图 15.1 8取消发送按钮的可视选项
图 15.1 9隐藏发送按钮时程序运行界面
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -