• 聊天软件项目开发2


    目录

    2.1昵称设置 

    2.2自动回复

    2.3清屏

    2.4按钮添加容错

    2.5断开连接 

    客户端

    服务端

    2.6改变字体颜色 

    2.7对话框界面插入背景图 


    2.1昵称设置 

     最终目标

    配置昵称原理

    1.启动客户端,就应该有个读取配置文件的操作,把昵称从配置文件里面读到控件

    2.客户配置昵称,需要写入到配置文件

    在昵称保存控件函数中

    1. void CMFCChatClientDlg::OnBnClickedSavenameBtn()
    2. {
    3. //获取文本框里的内容
    4. CString strName;
    5. GetDlgItemText(IDC_NAME_EDIT, strName);
    6. //判断昵称框是否为空
    7. if (strName.GetLength() <= 0) {
    8. MessageBox(_T("昵称不能为空!"));
    9. return;
    10. }
    11. //MB_OKCANCEL表示消息框是OK/CANCEL键,用户选择OK则进入if语句
    12. if (IDOK == AfxMessageBox(_T("是否修改昵称"), MB_OKCANCEL)) {
    13. //保存昵称
    14. //关于路径数组的定义,内置的260大小
    15. WCHAR strPath[MAX_PATH] = { 0 };
    16. //获取当前路径
    17. GetCurrentDirectoryW(MAX_PATH, strPath);
    18. //L"%s"也表示宽字节,如果是"%ls"发现无法输出全部内容
    19. TRACE(L"#####strPath= %s", strPath);
    20. CString strFilePath;
    21. //大写L表示宽字节,.ini表示配置文件
    22. strFilePath.Format(L"%ls//Test.ini", strPath);
    23. //在配置文件里写入一个字符串
    24. WritePrivateProfileStringW(_T("CLIENT"), _T("NAME"), strName, strFilePath);
    25. //WritePrivateProfileStringW(
    26. // _In_opt_ LPCWSTR lpAppName, 项名
    27. // _In_opt_ LPCWSTR lpKeyName, 键名
    28. // _In_opt_ LPCWSTR lpString,
    29. // _In_opt_ LPCWSTR lpFileName
    30. //);
    31. }
    32. }

    在初始化都画框函数中OnInitDlg

    1. //从配置文件获取昵称
    2. WCHAR strPath[MAX_PATH] = { 0 };
    3. GetCurrentDirectoryW(MAX_PATH, strPath);
    4. CString strFilePath;
    5. strFilePath.Format(L"%ls//Test.ini", strPath);
    6. //拿到昵称
    7. WCHAR wszName[MAX_PATH] = { 0 };
    8. DWORD dwNum = GetPrivateProfileStringW(_T("CLIENT"), _T("NAME"), NULL, wszName, MAX_PATH, strFilePath);
    9. if (dwNum > 0) {
    10. //读到了
    11. //显示在昵称框
    12. GetDlgItem(IDC_NAME_EDIT)->SetWindowText(wszName);
    13. }
    14. else {
    15. //没有读到或者文件损坏了
    16. //先随便在文件写一个,再显示在昵称框
    17. WritePrivateProfileStringW(_T("CLIENT"), _T("NAME"), _T("客户端"), strFilePath);
    18. GetDlgItem(IDC_NAME_EDIT)->SetWindowText(_T("客户端"));
    19. }
    20. //GetPrivateProfileStringW(
    21. // _In_opt_ LPCWSTR lpAppName, 项名
    22. // _In_opt_ LPCWSTR lpKeyName, 键名
    23. // _In_opt_ LPCWSTR lpDefault, 默认值
    24. // _Out_writes_to_opt_(nSize, return +1) LPWSTR lpReturnedString, 一个Buff,将内容搞到buff里
    25. // _In_ DWORD nSize,
    26. // _In_opt_ LPCWSTR lpFileName
    27. //);

    2.2自动回复

    在客户端的接收函数中,如果用户选择了自动发送消息,则将消息框中的内容发送给服务端,然后在历史消息框中显示该条消息

    在客户端OnReceive函数中补充代码

    1. //自动回复
    2. //如果选中
    3. if (((CButton*)dlg->GetDlgItem(IDC_AUTOSEND_RADIO))->GetCheck()) {
    4. //1.读编辑框的内容
    5. CString strAutoSendMsg;
    6. dlg->GetDlgItemText(IDC_AUTOSEND_RADIO, strAutoSendMsg);
    7. //2.封包+组格式
    8. CString strName;
    9. dlg->GetDlgItemTextW(IDC_NAME_EDIT, strName);
    10. //时间+昵称+[自动回复]+内容
    11. CString strMsg = strName + _T(":") + _T("[自动回复]") + strAutoSendMsg;
    12. char* szSendBuf = T2A(strMsg);
    13. //发送给服务端
    14. dlg->m_client->Send(szSendBuf, SEND_MAX_BUF, 0);
    15. //显示在列表框
    16. CString strShow;
    17. strShow = dlg->CatShowString(_T(""), strMsg);
    18. dlg->m_list.AddString(strShow);
    19. }

    补充自动回复的控件函数

    1. //自动回复
    2. void CMFCChatClientDlg::OnBnClickedAutosendRadio()
    3. {
    4. if (((CButton*)GetDlgItem(IDC_AUTOSEND_RADIO))->GetCheck()) {
    5. TRACE("####选中");
    6. ((CButton*)GetDlgItem(IDC_AUTOSEND_RADIO))->SetCheck(FALSE);
    7. }
    8. else {
    9. TRACE("#####为选中");
    10. ((CButton*)GetDlgItem(IDC_AUTOSEND_RADIO))->SetCheck(TRUE);
    11. }
    12. }

    2.3清屏

    只需要在对应控件函数下使用ResetControl函数即可 

    2.4按钮添加容错

    在客户端或者服务端启动时,应将除连接控件外的一些按钮置灰,防止程序崩溃

    1. GetDlgItem(IDC_SEND_BTN)->EnableWindow(FALSE);
    2. //断开按钮置灰
    3. GetDlgItem(IDC_DISCONNECT_BTN)->EnableWindow(FALSE);
    4. //自动回复置灰
    5. GetDlgItem(IDC_AUTOSEND_CHECK)->EnableWindow(FALSE);
    6. //连接按钮可用
    7. GetDlgItem(IDC_CONNECT_BTN)->EnableWindow(TRUE);

    2.5断开连接 

    客户端

    在断开控件函数里

    1. void CMFCChatClientDlg::OnBnClickedDisconnectBtn()
    2. {
    3. //1.控制控件
    4. GetDlgItem(IDC_SEND_BTN)->EnableWindow(FALSE);
    5. //断开按钮置灰
    6. GetDlgItem(IDC_DISCONNECT_BTN)->EnableWindow(FALSE);
    7. //自动回复置灰
    8. GetDlgItem(IDC_AUTOSEND_CHECK)->EnableWindow(FALSE);
    9. //连接按钮可用
    10. GetDlgItem(IDC_CONNECT_BTN)->EnableWindow(TRUE);
    11. //2.回收资源
    12. m_client->Close();
    13. if (m_client != NULL) {
    14. delete m_client;
    15. m_client = NULL;
    16. }
    17. //3.显示到列表框
    18. CString strShow;
    19. strShow = CatShowString(_T(""), _T("断开与服务器连接"));
    20. m_list.AddString(strShow);
    21. UpdateData(FALSE);
    22. }

    服务端

    在断开控件函数里

    1. void CMFCChartServerDlg::OnBnClickedStopBtn()
    2. {
    3. //1.控制控件
    4. GetDlgItem(IDC_START_BTN)->EnableWindow(TRUE);
    5. GetDlgItem(IDC_STOP_BTN)->EnableWindow(FALSE);
    6. GetDlgItem(IDC_SEND_BTN)->EnableWindow(FALSE);
    7. //2.回收资源
    8. m_server->Close();
    9. if (m_server != NULL) {
    10. delete m_server;
    11. m_server = NULL;
    12. }
    13. if (m_chat != NULL) {
    14. delete m_chat;
    15. m_chat = NULL;
    16. }
    17. //3.显示在列表框
    18. CString strShow;
    19. strShow = CatShowString(_T(""), _T("服务器停止"));
    20. m_list.AddString(strShow);
    21. UpdateData(FALSE);
    22. }

    2.6改变字体颜色 

    为控件绑定成员变量,在初始化函数中添加颜色并设置默认选项

    1. m_WordColorCombo.AddString(_T("黑色"));
    2. m_WordColorCombo.AddString(_T("红色"));
    3. m_WordColorCombo.AddString(_T("蓝色"));
    4. m_WordColorCombo.AddString(_T("绿色"));
    5. //设置当前选择为第0个
    6. m_WordColorCombo.SetCurSel(0);
    7. SetDlgItemText(IDC_COLOUR_COMBO, _T("黑色"));

    设置控制颜色响应函数

    1. HBRUSH CMFCChatClientDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    2. {
    3. HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
    4. CString strColor;
    5. m_WordColorCombo.GetWindowTextW(strColor);
    6. //GetDlgCtrlID返回指向给定控件或子窗口的指针,不存在返回NULL
    7. if (IDC_LIST1 == pWnd->GetDlgCtrlID() || IDC_SENDMSG_EDIT == pWnd->GetDlgCtrlID()) {
    8. if (strColor == L"黑色") {
    9. pDC->SetTextColor(RGB(0, 0, 0));
    10. }
    11. else if (strColor == L"红色") {
    12. pDC->SetTextColor(RGB(255, 0, 0));
    13. }
    14. else if (strColor == L"绿色") {
    15. pDC->SetTextColor(RGB(0, 255, 255));
    16. }
    17. else if (strColor == L"蓝色") {
    18. pDC->SetTextColor(RGB(0, 0, 255));
    19. }
    20. }
    21. return hbr;
    22. }

    2.7对话框界面插入背景图 

    在OnPaint函数中 

    1. //确定目标区域→加载资源图片并且转换为内存设备→绘图
    2. //1.定义dc
    3. CPaintDC dc(this); // 用于绘制的设备上下文
    4. //2.确定绘制区域
    5. CRect rect;
    6. GetClientRect(&rect); //拿到对话框区域
    7. //3.创建一个内存设备环境 创建兼容性dc
    8. CDC dcBmp;
    9. dcBmp.CreateCompatibleDC(&dcBmp);
    10. //4.载入资源图片
    11. CBitmap bmpBackGround;
    12. bmpBackGround.LoadBitmap(IDB_BITMAP);
    13. //5.将图片紫云啊载入到位图里面bBitMap位图
    14. BITMAP bBitmap;
    15. bmpBackGround.GetBitmap(&bBitmap);
    16. //6.将位图选入到临时的内存设备环境
    17. CBitmap* pbmpOld = dcBmp.SelectObject(&bmpBackGround);
    18. //7.开始绘制
    19. dc.StretchBlt(0, 0, rect.Width(), rect.Height(), &dcBmp, 0, 0, bBitmap.bmWidth, bBitmap.bmHeight, SRCCOPY);
  • 相关阅读:
    C++ Reference: Standard C++ Library reference: C Library: ctime
    尚硅谷设计模式学习(十一)外观模式
    Java工程师面试题
    文心大模型商业化领跑,百度在自我颠覆中重构生长力
    机器学习 day39(决策树和神经网络的比较)
    关于个人考取PMP认证考试的这些关键问题
    Spring Bean的加载方式
    【论文】撰写小论文用到的资料
    Redis源码与设计剖析 -- 11.哈希对象
    【若依(ruoyi)】Java---如何在Apifox上传params参数--延伸--如何在Apifox上传Map类型参数
  • 原文地址:https://blog.csdn.net/qq_54169998/article/details/125783843