1 // MFC_TCP_ClientDlg.cpp : 实现文件
2 //
3
4 #include "stdafx.h"
5 #include "MFC_TCP_Client.h"
6 #include "MFC_TCP_ClientDlg.h"
7 #include "afxdialogex.h"
8
9 #ifdef _DEBUG
10 #define new DEBUG_NEW
11 #endif
12
13 // 用于应用程序“关于”菜单项的 CAboutDlg 对话框
14
15 class CAboutDlg : public CDialogEx
16 {
17 public:
18 CAboutDlg();
19
20 // 对话框数据
21 #ifdef AFX_DESIGN_TIME
22 enum { IDD = IDD_ABOUTBOX };
23 #endif
24
25 protected:
26 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
27
28 // 实现
29 protected:
30 DECLARE_MESSAGE_MAP()
31 };
32
33 CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
34 {
35 }
36
37 void CAboutDlg::DoDataExchange(CDataExchange* pDX)
38 {
39 CDialogEx::DoDataExchange(pDX);
40 }
41
42 BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
43 END_MESSAGE_MAP()
44
45
46 // CMFC_TCP_ClientDlg 对话框
47
48
49
50 CMFC_TCP_ClientDlg::CMFC_TCP_ClientDlg(CWnd* pParent /*=NULL*/)
51 : CDialogEx(IDD_MFC_TCP_CLIENT_DIALOG, pParent)
52 {
53 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
54 }
55
56 void CMFC_TCP_ClientDlg::DoDataExchange(CDataExchange* pDX)
57 {
58 CDialogEx::DoDataExchange(pDX);
59 }
60
61 BEGIN_MESSAGE_MAP(CMFC_TCP_ClientDlg, CDialogEx)
62 ON_MESSAGE(WM_SOCKET, OnSocket)
63 ON_WM_SYSCOMMAND()
64 ON_WM_PAINT()
65 ON_WM_QUERYDRAGICON()
66 ON_BN_CLICKED(Connect, &CMFC_TCP_ClientDlg::OnBnClickedConnect)
67 ON_BN_CLICKED(IDC_SEND, &CMFC_TCP_ClientDlg::OnBnClickedSend)
68 END_MESSAGE_MAP()
69
70
71 // CMFC_TCP_ClientDlg 消息处理程序
72
73 BOOL CMFC_TCP_ClientDlg::OnInitDialog()
74 {
75 CDialogEx::OnInitDialog();
76
77 // 将“关于...”菜单项添加到系统菜单中。
78
79 // IDM_ABOUTBOX 必须在系统命令范围内。
80 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
81 ASSERT(IDM_ABOUTBOX < 0xF000);
82
83 CMenu* pSysMenu = GetSystemMenu(FALSE);
84 if (pSysMenu != NULL)
85 {
86 BOOL bNameValid;
87 CString strAboutMenu;
88 bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
89 ASSERT(bNameValid);
90 if (!strAboutMenu.IsEmpty())
91 {
92 pSysMenu->AppendMenu(MF_SEPARATOR);
93 pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
94 }
95 }
96
97 // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
98 // 执行此操作
99 SetIcon(m_hIcon, TRUE); // 设置大图标
100 SetIcon(m_hIcon, FALSE); // 设置小图标
101
102 // TODO: 在此添加额外的初始化代码
103
104 //将消息显示框,发送消息编辑框,发送按键禁用
105
106 GetDlgItem(IDC_TEXT)->EnableWindow(FALSE);
107 GetDlgItem(IDC_SENDTEXT)->EnableWindow(FALSE);
108 GetDlgItem(IDC_SEND)->EnableWindow(FALSE);
109
110 //对套子接初始化
111 s = ::socket(AF_INET, SOCK_STREAM, 0);
112 ::WSAAsyncSelect(s, this->m_hWnd, WM_SOCKET, FD_READ);
113
114
115 return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
116 }
117
118 void CMFC_TCP_ClientDlg::OnSysCommand(UINT nID, LPARAM lParam)
119 {
120 if ((nID & 0xFFF0) == IDM_ABOUTBOX)
121 {
122 CAboutDlg dlgAbout;
123 dlgAbout.DoModal();
124 }
125 else
126 {
127 CDialogEx::OnSysCommand(nID, lParam);
128 }
129 }
130
131 // 如果向对话框添加最小化按钮,则需要下面的代码
132 // 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序,
133 // 这将由框架自动完成。
134
135 void CMFC_TCP_ClientDlg::OnPaint()
136 {
137 if (IsIconic())
138 {
139 CPaintDC dc(this); // 用于绘制的设备上下文
140
141 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
142
143 // 使图标在工作区矩形中居中
144 int cxIcon = GetSystemMetrics(SM_CXICON);
145 int cyIcon = GetSystemMetrics(SM_CYICON);
146 CRect rect;
147 GetClientRect(&rect);
148 int x = (rect.Width() - cxIcon + 1) / 2;
149 int y = (rect.Height() - cyIcon + 1) / 2;
150
151 // 绘制图标
152 dc.DrawIcon(x, y, m_hIcon);
153 }
154 else
155 {
156 CDialogEx::OnPaint();
157 }
158 }
159
160 //当用户拖动最小化窗口时系统调用此函数取得光标
161 //显示。
162 HCURSOR CMFC_TCP_ClientDlg::OnQueryDragIcon()
163 {
164 return static_cast<HCURSOR>(m_hIcon);
165 }
166
167
168
169 void CMFC_TCP_ClientDlg::OnBnClickedButton2()
170 {
171 // TODO: 在此添加控件通知处理程序代码
172 }
173
174
175 void CMFC_TCP_ClientDlg::OnBnClickedConnect()
176 {
177 // TODO: 在此添加控件通知处理程序代码
178 CString str;
179 CString str1;
180
181 int port; //定义端口号
182
183 GetDlgItem(IDC_ADDR)->GetWindowText(str);
184 GetDlgItem(IDC_PORT)->GetWindowText(str1);
185
186 //判断服务器端口号是否为空
187 if (str == "" || str1 == "")
188 {
189 MessageBox("服务器地址或者端口号不能为空");
190
191 }
192 else
193 {
194 port = atoi(str1.GetBuffer(1));//将端口字符串转换为数字
195 addr.sin_family = AF_INET;
196 addr.sin_addr.S_un.S_addr = inet_addr(str.GetBuffer(1));
197 addr.sin_port = ntohs(port);
198
199 GetDlgItem(IDC_TEXT)->SetWindowText("正在连接服务器....\r\n");
200 }
201 if (::connect(s, (sockaddr*)&addr, sizeof(addr)) != SOCKET_ERROR)
202 {
203 GetDlgItem(IDC_TEXT)->SetWindowText(str);
204 str += "连接成功 \r\n";
205
206 GetDlgItem(IDC_TEXT)->SetWindowText(str);
207
208 GetDlgItem(IDC_SENDTEXT)->EnableWindow(true);
209
210 GetDlgItem(IDC_SEND)->EnableWindow(true);
211
212 GetDlgItem(IDC_ADDR)->EnableWindow(false);
213
214 GetDlgItem(IDC_PORT)->EnableWindow(false);
215 }
216 else
217
218 {
219
220 GetDlgItem(IDC_TEXT)->GetWindowText(str);
221
222 str += "连接服务器失败! 请重试\r\n";
223
224 GetDlgItem(IDC_TEXT)->SetWindowText(str);
225
226 }
227 }
228
229
230 void CMFC_TCP_ClientDlg::OnBnClickedSend()
231 {
232 // TODO: 在此添加控件通知处理程序代码
233 CString str;
234 CString str1;
235 GetDlgItem(IDC_SENDTEXT)->GetWindowText(str);
236 if (str == "")
237 {
238 GetDlgItem(IDC_TEXT)->GetWindowTextA(str1);
239 str1 += "\r\n";
240 str1 += "消息不能为空\r\n";
241 GetDlgItem(IDC_TEXT)->SetWindowText(str1);
242 }
243 else
244 {
245 ::send(s, str.GetBuffer(1), sizeof(str), 0);
246 GetDlgItem(IDC_TEXT)->GetWindowTextA(str1);
247 str1 += "\r\n";
248 str1 += str;
249 GetDlgItem(IDC_TEXT)->SetWindowText(str1);
250 }
251 }
252
253 LRESULT CMFC_TCP_ClientDlg::OnSocket(WPARAM wParam, LPARAM lParam)
254
255 {
256
257 char cs[100] = { 0 };
258
259 if (lParam == FD_READ)
260
261 {
262
263 CString num = "";
264 recv(s, cs, 100, NULL);
265 GetDlgItem(IDC_TEXT)->GetWindowText(num);
266 num += "\r\n服务器说: ";
267 num += (LPTSTR)cs;
268 GetDlgItem(IDC_TEXT)->SetWindowText(num);
269
270 }
271
272 return true;
273
274 }