?? 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 + -