// ClientDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "Client.h"
#include "ClientDlg.h"
#include "afxdialogex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();
// 对话框数据
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
// CClientDlg 对话框
CClientDlg::CClientDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CClientDlg::IDD, pParent)
, m_usrName(_T(""))
, m_serverIP(_T("127.0.0.1"))
, m_serverPort(2537)
, m_sendMsg(_T(""))
, m_publicChannel(_T(""))
, m_privateChannel(_T(""))
, m_strPeopleToTalk(_T(""))
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_clientSocket.m_pClientDlg = this;
}
void CClientDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
// DDX_Text(pDX, IDC_USERNAME, m_usrName);
DDX_Text(pDX, IDC_SERVERPORT, m_serverPort);
DDV_MinMaxUInt(pDX, m_serverPort, 1024, 65535);
DDX_Control(pDX, IDC_SERVERIP, m_ctrlServerIP);
DDX_Text(pDX, IDC_USERNAME, m_usrName);
DDV_MaxChars(pDX, m_usrName, 8);
DDX_Text(pDX, IDC_MESSAGE, m_sendMsg);
DDV_MaxChars(pDX, m_sendMsg, 800);
DDX_Control(pDX, IDC_MESSAGE, m_ctrlSendMsg);
DDX_Control(pDX, IDC_MSGSTYTLE, m_ctrlMsgStyle);
DDX_Control(pDX, IDC_SELECTUSER, m_ctrlPeopleToTalk);
DDX_Text(pDX, IDC_PUBLICAREA, m_publicChannel);
DDX_Text(pDX, IDC_PRIVATEAREA, m_privateChannel);
DDX_Control(pDX, IDC_USERONLINE, m_ctrlUserOnline);
DDX_CBString(pDX, IDC_SELECTUSER, m_strPeopleToTalk);
}
BEGIN_MESSAGE_MAP(CClientDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(ID_SENDMSG, &CClientDlg::OnBnClickedSendmsg)
ON_WM_CTLCOLOR()
ON_BN_CLICKED(IDC_BTN_CONNECT, &CClientDlg::OnBnClickedBtnConnect)
ON_WM_CLOSE()
ON_WM_DESTROY()
END_MESSAGE_MAP()
// CClientDlg 消息处理程序
BOOL CClientDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
((CButton *)GetDlgItem(IDC_MALE))->SetCheck(TRUE);
GetDlgItem(IDC_USERNAME)->SetFocus();
m_ctrlServerIP.SetWindowTextW(m_serverIP);
m_editFont.CreatePointFont(120, _T("黑体"));
m_ctrlSendMsg.SetFont(&m_editFont); // 设置新字体
m_ctrlMsgStyle.AddString(_T("微笑着"));
m_ctrlMsgStyle.AddString(_T("开心地"));
m_ctrlMsgStyle.AddString(_T("大笑着"));
m_ctrlMsgStyle.AddString(_T("愤怒地"));
m_ctrlMsgStyle.AddString(_T("忧伤地"));
m_ctrlMsgStyle.AddString(_T("大哭着"));
m_ctrlMsgStyle.AddString(_T("兴高采烈地"));
m_ctrlMsgStyle.AddString(_T("怒不可遏地"));
m_ctrlMsgStyle.AddString(_T("伤心欲绝地"));
m_ctrlMsgStyle.AddString(_T("喜笑颜开地"));
m_ctrlMsgStyle.AddString(_T("可怜兮兮地"));
m_ctrlMsgStyle.SetCurSel(0);
m_ctrlPeopleToTalk.AddString(_T("所有人"));
m_ctrlPeopleToTalk.SetCurSel(0);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
void CClientDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CClientDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CPaintDC dc(this);
CRect rect;
GetClientRect(&rect);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
CBitmap bmpBackground;
bmpBackground.LoadBitmap(IDB_BACKGROUND);
BITMAP bitmap;
bmpBackground.GetBitmap(&bitmap);
CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground);
dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);
//CDialogEx::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CClientDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CClientDlg::OnBnClickedSendmsg()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData();
if (m_clientSocket.m_hSocket == INVALID_SOCKET)
{
MessageBox(_T("未连接到服务器!"),_T("错误"),MB_ICONERROR);
return;
}
unsigned char buf[MAX_BUFSIZE]={0};
CString strStyle;
GetDlgItem(IDC_MSGSTYTLE)->GetWindowTextW(strStyle);
if (m_ctrlPeopleToTalk.GetCurSel() == 0) //选中了第0项,也就是发送给所有人
{
buf[0] = MESSAGE_ALL; //公共消息
memcpy(buf+1,m_usrName.GetBuffer(0),m_usrName.GetLength()*2); //16字节用户名
memcpy(buf+17,strStyle.GetBuffer(0),strStyle.GetLength()*2); //10字节消息方式
memcpy(buf+27,m_sendMsg.GetBuffer(0),m_sendMsg.GetLength()*2); //消息主体
m_clientSocket.Send(buf,m_sendMsg.GetLength()*2+27); //发送消息
}
else
{
UpdateData();
buf[0] = MESSAGE_ONE; //私聊消息
memcpy(buf+1,m_strPeopleToTalk.GetBuffer(0),m_strPeopleToTalk.GetLength()*2); //16字节目的用户名
memcpy(buf+17,m_usrName.GetBuffer(0),m_usrName.GetLength()*2); //16字节源用户名
memcpy(buf+33,strStyle.GetBuffer(0),strStyle.GetLength()*2); //10字节消息方式
memcpy(buf+43,m_sendMsg.GetBuffer(0),m_sendMsg.GetLength()*2); //消息主体
m_clientSocket.Send(buf,m_sendMsg.GetLength()*2+43); //发送消息
m_privateChannel+=_T("【你】");
m_privateChannel+=strStyle;
m_privateChannel+=_T("* 对 【");
m_privateChannel+=m_strPeopleToTalk;
m_privateChannel+=_T("】 说:");
m_privateChannel+=m_sendMsg;
m_privateChannel+=_T("\r\n");
UpdateData(FALSE);
}
}
HBRUSH CClientDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
int CtrlID=pWnd->GetDlgCtrlID();
switch (CtrlID)
{
case IDC_PUBLICAREA:
case IDC_PRIVATEAREA:
pDC->SetBkColor(RGB(255, 255, 255));
return ::CreateSolidBrush(RGB(255, 255, 255));
case IDC_STATIC:
case IDC_MALE:
case IDC_FEMALE:
pDC->SetBkMode(TRANSPARENT);
//e pDC->SetTextColor(RGB(255,255,255)); //字体颜色
return (HBRUSH)GetStockObject(NULL_BRUSH);
default:
break;
}
return hbr;
}
void CClientDlg::OnBnClickedBtnConnect()
{
// TODO: 在此添加控件通知处理程序代码
CString str;
GetDlgItem(IDC_BTN_CONNECT)->GetWindowTextW(str);
if (str == "连接服务器") //当前处于断开状态
{
UpdateData();
GetDlgItem(IDC_SERVERIP)->GetWindowTextW(m_serverIP);
if (m_usrName.IsEmpty())
{
MessageBox(_T("请输入用户名!"),_T("提示"),MB_ICONWARNING);
GetDlgItem(IDC_USERNAME)->SetFocus();
return ;
}
if (m_serverIP.IsEmpty())
{
MessageBox(_T("请输入服务器IP!"),_T("提示"),MB_ICONWARNING);
GetDlgItem(IDC_SERVERIP)->SetFocus();
return ;
}
if (!m_clientSocket.Create()) //建立Socket
{
MessageBox(_T("创建套接字失败!"),_T("错误"),MB_ICONERROR);
return;
}
if (!m_clientSocket.Connect(m_serverIP,m_serverPort))
{
MessageBox(_T("连接服务器�
基于mfc的多人聊天室
5星 · 超过95%的资源 需积分: 10 183 浏览量
2017-02-24
08:44:56
上传
评论 4
收藏 1.44MB ZIP 举报
Alpace
- 粉丝: 0
- 资源: 2
最新资源
- 毕业设计- 基于STM32F103C8T6 单片机,物联网技术的太阳能发电装置+源代码+文档说明+架构图+界面截图
- 基于 LSTM(长短期记忆)(即改进的循环神经网络)预测风力发电厂中风力涡轮机产生的功率+源代码+文档说明
- 基于stm32f103+空心杯电机+oled按键+运动算法
- 《CKA/CKAD应试指南/从docker到kubernetes 完全攻略》学习笔记 第1章docker基础(1.1-1.4)
- 基于python实现的水下压缩空气储能互补系统建模仿真与经济效益分析+源代码+论文
- 华中科技大学-自然语言处理实验,Bi-LSTM+CRF的中文分词框架,并且利用基于深度学习的方法进行中文命名实体识别++源码报告
- 基于动态罚函数的铁路车流分配与径路优化模型python源码
- 鱼群算法求解组环问题python源码+文档说明
- 基于决策优化的多波束测深测线规划模型MATLAB代码
- 课程设计-基于python实现的多目标优化算法求解带时间窗的车辆路径规划问题+源代码+文档说明+界面截图+pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈