mapwindowpoints

本文详细介绍了MapWindowPoints函数的功能及使用方法。该函数能够实现不同窗口坐标空间间点的映射转换,适用于多种Windows平台版本。文章还提供了函数参数说明、返回值解释及其适用的开发环境。
  name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-5572165936844014&dt=1193665761703&lmt=1193665780&format=336x280_as&output=html&correlator=1193665761687&url=http%3A%2F%2Fwww.codeguru.cn%2Fpublic%2Fiframe%2Fwinapiiframe.htm&color_bg=FFFFFF&color_text=000000&color_link=000000&color_url=FFFFFF&color_border=FFFFFF&ad_type=text&ga_vid=1285758818.1193665762&ga_sid=1193665762&ga_hid=111695597&flash=9&u_h=768&u_w=1024&u_ah=740&u_aw=1024&u_cd=32&u_tz=480&u_his=8&u_java=true" frameborder="0" width="336" scrolling="no" height="280" allowtransparency="allowtransparency">     函数功能:该函数把相对于一个窗口的坐标空间的一组点映射成相对于另一窗口的坐标空 的一组点。

    函数原型:int MapwindowPoints(HWND hWndFrom, HWND hWndTo,LPPOINT lpPoints, UINT cPoints);

    参数:

    hWndfrom:转换点所在窗口的句柄,如果此参数为NULL或HWND_DESETOP则假定这些点在屏幕坐标上。

    hWndTo:转换到的窗口的句柄,如果此参数为NULL或HWND_DESKTOP,这些点被转换为屏幕坐标。

    lpPoints:指向POINT结构数组的指针,此结构数组包含要转换的点,此参数也可指向RECT结构,在此情况下,Cpoints参数应设置为2。

    cPoints:指定LpPoints参数指向的数组中POINT结构的数目。

    返回值:如果函数调用成功,返回值的低位字是每一个源点的水平坐标的像素数目,以便计算每个目标点的水平坐标;高位字是每一个源点的垂直坐标的像素的数目,以便计算每个目标点的垂直坐标,如果函数调用失败,返回值为零。

    Windows NT:若想获得更多错误信息,请调用GetLastError函数。

    速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:1.0及以上版本;头文件:winuser.h;库文件:user32.lib。

#include <winsock2.h> #include <ws2tcpip.h> #include<windows.h> #include<commCtrl.h> #include"resource.h" #include <wincrypt.h> #include<atlstr.h> #include<string> #include <gdiplus.h> #include <algorithm> #pragma comment(lib, "gdiplus.lib") #pragma comment(lib,"ws2_32.lib") // 全局变量 SOCKET g_clientSocket = INVALID_SOCKET; // 全局套接字,保持连接 bool g_isConnected = false; // 连接状态标志 WCHAR g_szAccount[32] = { 0 }; // 账号 WCHAR g_szPassword[32] = { 0 }; // 密码 WCHAR g_szNickname[32] = { 0 }; // 昵称 WCHAR g_szGender[16] = { 0 }; // 性别 WCHAR g_szAge[8] = { 0 }; // 年龄 WCHAR g_szSignature[128] = { 0 }; // 个性签名 BYTE* g_pImageData = NULL;//储存头像的二进制数据// DWORD g_dwImageSize = 0;//数据大小// int passwd_back_to_account = 0;//账号是否已产生,防止密码设置时,按下取消键,回到账号生成框后,重新生成账号// INT_PTR CALLBACK Dialog_one(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//初始化对话框// { static UINT_PTR TimeID = 0;//启用定时器// static HBRUSH hBackgroundBrush = NULL;//背景画刷// static HBITMAP hBmp = NULL;//位图句柄// switch (uMsg) { case WM_INITDIALOG: //SetDlgItemText(hwndDlg, IDC_EDIT3, L"Welcome to QQ");//第一个对话框的内容// TimeID = SetTimer(hwndDlg, 1, 4000, NULL);//显示第一个对话框的内容,延迟3秒// hBackgroundBrush = CreateSolidBrush((RGB(200, 230, 255)));//设置背景为淡蓝色// hBmp = (HBITMAP)LoadImage(NULL, L"image_one.bmp", IMAGE_BITMAP, 200, 170, LR_LOADFROMFILE);//加载图片位置// if (hBmp) { SendDlgItemMessage(hwndDlg, IDC_MY_IMAGE_ONE, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBmp); } else { MessageBox(hwndDlg, L"image lost", L"QQ", MB_ICONERROR); } return (INT_PTR)TRUE;//设置焦点// case WM_DRAWITEM: { DRAWITEMSTRUCT* pdis = (DRAWITEMSTRUCT*)lParam; if (pdis->CtlID == IDC_CUSTOM_TEXT) { SetTextColor(pdis->hDC, RGB(255, 0, 0)); DrawText(pdis->hDC, L"Welcome to QQ", -1, &pdis->rcItem,//对话框标题// DT_CENTER | DT_VCENTER); } return (INT_PTR)TRUE; } case WM_CTLCOLORDLG: return (INT_PTR)hBackgroundBrush; case WM_COMMAND: if (LOWORD(wParam) == IDSTART) { EndDialog(hwndDlg, IDOK);//关闭对话框// } return (INT_PTR)TRUE; /*case WM_TIMER: if (wParam == 1) { EndDialog(hwndDlg, IDOK);//关闭对话框// } return (INT_PTR)TRUE; */ case WM_DESTROY: KillTimer(hwndDlg, TimeID);//销毁定时器// DeleteObject(hBackgroundBrush);//释放画刷// DeleteObject(hBmp);//释放位图资源// EndDialog(hwndDlg, IDCANCEL);//关闭对话框// break; case WM_CLOSE: EndDialog(hwndDlg, IDEND);//关闭对话框// break; } return (INT_PTR)FALSE; } INT_PTR CALLBACK Dialog_end(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//结束对话框// { static UINT_PTR TimeID = 0;//启用定时器// static HBRUSH hBackgroundBrush = NULL;//背景画刷// static HBITMAP hBmp = NULL;//位图句柄// switch (uMsg) { case WM_INITDIALOG: TimeID = SetTimer(hwndDlg, 1, 4000, NULL);//显示第一个对话框的内容,延迟3秒// hBackgroundBrush = CreateSolidBrush((RGB(200, 230, 255)));//设置背景为淡蓝色// return (INT_PTR)TRUE;//设置焦点// case WM_DRAWITEM: { DRAWITEMSTRUCT* pdis = (DRAWITEMSTRUCT*)lParam; if (pdis->CtlID == IDC_CUSTOM_TEXT_TWO) { SetTextColor(pdis->hDC, RGB(255, 0, 0)); DrawText(pdis->hDC, L"Goodbye", -1, &pdis->rcItem,//对话框标题// DT_CENTER | DT_VCENTER); } return (INT_PTR)TRUE; } case WM_CTLCOLORDLG: return (INT_PTR)hBackgroundBrush; case WM_TIMER: if (wParam == 1) { KillTimer(hwndDlg, TimeID);//销毁定时器// DeleteObject(hBackgroundBrush);//释放画刷// EndDialog(hwndDlg, IDOK);//关闭对话框// } return (INT_PTR)TRUE; case WM_CLOSE: EndDialog(hwndDlg, IDEND);//关闭对话框// break; } return (INT_PTR)FALSE; } INT_PTR CALLBACK Dialog_two(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//登录和注册选择框// { passwd_back_to_account = 0; switch (uMsg) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDLOGIN: EndDialog(hwndDlg, IDLOGIN); return (INT_PTR)TRUE; case IDREGISTER: EndDialog(hwndDlg, IDREGISTER); return (INT_PTR)TRUE; }break; case WM_CLOSE: EndDialog(hwndDlg, IDCANCEL); return (INT_PTR)TRUE; } return (INT_PTR)FALSE; } INT_PTR CALLBACK Dialog_three(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//登录框// { static bool EDIT1 = FALSE; static bool EDIT2 = FALSE; HWND hEdit = NULL; switch (uMsg) { case WM_INITDIALOG: SetDlgItemText(hwndDlg, IDC_EDIT3, L"账号"); SetDlgItemText(hwndDlg, IDC_EDIT4, L"密码"); SetDlgItemText(hwndDlg, IDC_EDIT1, L"账号"); SetDlgItemText(hwndDlg, IDC_EDIT2, L"密码"); SendMessage(GetDlgItem(hwndDlg, IDC_EDIT1), WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), TRUE); SendMessage(GetDlgItem(hwndDlg, IDC_EDIT2), WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), TRUE); return (INT_PTR)TRUE; case WM_CTLCOLOREDIT://设置水印文字// hEdit = (HWND)lParam; if (!EDIT1 && hEdit == GetDlgItem(hwndDlg, IDC_EDIT1)) { SetTextColor((HDC)wParam,RGB(200,200,200)); return (LRESULT)GetSysColorBrush(COLOR_WINDOW); } if (!EDIT2 && hEdit == GetDlgItem(hwndDlg, IDC_EDIT2)) { SetTextColor((HDC)wParam, RGB(200, 200, 200)); return (LRESULT)GetSysColorBrush(COLOR_WINDOW); }break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_EDIT1: if (HIWORD(wParam) == EN_SETFOCUS && !EDIT1) { SetDlgItemText(hwndDlg, IDC_EDIT1, L""); EDIT1 = TRUE; } else if (HIWORD(wParam) == EN_KILLFOCUS) { if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_EDIT1)) == 0) { SetDlgItemText(hwndDlg, IDC_EDIT1, L"账号"); EDIT1 = FALSE; } }break; case IDC_EDIT2: if (HIWORD(wParam) == EN_SETFOCUS && !EDIT2) { SetDlgItemText(hwndDlg, IDC_EDIT2, L""); EDIT2 = TRUE; } else if (HIWORD(wParam) == EN_KILLFOCUS) { if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_EDIT2)) == 0) { SetDlgItemText(hwndDlg, IDC_EDIT2, L"账号"); EDIT2 = FALSE; } }break; case IDOK: //服务器验证账号密码的有效性// MessageBox(hwndDlg, L"服务器正在验证账号密码的有效性", L"QQ", MB_ICONINFORMATION); MessageBox(hwndDlg, L"登录成功", L"QQ", MB_ICONINFORMATION); EndDialog(hwndDlg, IDOK); return (INT_PTR)TRUE; case IDCANCEL: EndDialog(hwndDlg, IDCANCEL); return (INT_PTR)TRUE; } } return (INT_PTR)FALSE; } int Generate_register_number()//产生账号// { HCRYPTPROV hProvider = 0; CryptAcquireContext(&hProvider, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT); long long randomNum = 0; CryptGenRandom(hProvider, sizeof(randomNum), (BYTE*)&randomNum);//randomNum接收产生的随机数// CryptReleaseContext(hProvider, 0); int num=abs(randomNum % 9000000000) + 1000000000; // 转换为10位数 if (num > 0) return num; else if (num <= 0) return -num; } INT_PTR CALLBACK Dialog_four(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//注册框// { static long long num = 0; DRAWITEMSTRUCT* pdis = NULL; CString str; switch (uMsg) { case WM_INITDIALOG: SetDlgItemText(hwndDlg, IDC_EDIT5, L"服务器分配给你的账号"); if (passwd_back_to_account == 0) { num = Generate_register_number(); } str.Format(L"%lld", num); wcscpy_s(g_szAccount,32,str);//将账号保存到全局变量g_szAccount// SetDlgItemText(hwndDlg, IDC_EDIT6,str); return (INT_PTR)TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDGOON: EndDialog(hwndDlg, IDGOON); return (INT_PTR)TRUE; case IDCANCEL: EndDialog(hwndDlg, IDCANCEL); return (INT_PTR)TRUE; } } return (INT_PTR)FALSE; } INT_PTR CALLBACK Dialog_five(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//密码设置框// { switch (uMsg) { case WM_INITDIALOG: SetDlgItemText(hwndDlg, IDC_EDIT9, L"密码设置"); SetDlgItemText(hwndDlg, IDC_EDIT10, L"密码确认"); return (INT_PTR)TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDFINISH: // 获取密码并验证 WCHAR szPassword1[32], szPassword2[32]; GetDlgItemText(hwndDlg, IDC_EDIT7, szPassword1, 32); GetDlgItemText(hwndDlg, IDC_EDIT8, szPassword2, 32); if (szPassword1[0] == '\0') { MessageBox(NULL, L"密码不能为空", L"QQ", MB_ICONERROR); SetFocus(GetDlgItem(hwndDlg, IDC_EDIT7)); return (INT_PTR)TRUE; } if (wcscmp(szPassword1, szPassword2) != 0)//比较前后两次设置的密码是否相同// { MessageBox(hwndDlg, L"两次输入的密码不一致,请重新输入", L"QQ", MB_ICONERROR); SetDlgItemText(hwndDlg, IDC_EDIT8, L"");//清除密码// SetFocus(GetDlgItem(hwndDlg, IDC_EDIT8)); return (INT_PTR)TRUE; } // 保存密码到全局变量 wcscpy_s(g_szPassword, szPassword1); MessageBox(hwndDlg, L"密码已成功设置", L"QQ", MB_ICONINFORMATION); EndDialog(hwndDlg, IDFINISH); return (INT_PTR)TRUE; case IDCANCEL: passwd_back_to_account = 1;//账号已生成标志// EndDialog(hwndDlg, IDCANCEL); return (INT_PTR)TRUE; } } return (INT_PTR)FALSE; } INT_PTR CALLBACK Dialog_six(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//注册成功框// { switch (uMsg) { case WM_INITDIALOG: SetDlgItemText(hwndDlg, IDC_EDIT11, L"注册成功,按下“确认”即可跳转到到登录界面."); return (INT_PTR)TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: EndDialog(hwndDlg, IDOK); return (INT_PTR)TRUE; case IDCANCEL: EndDialog(hwndDlg, IDCANCEL); return (INT_PTR)TRUE; } } return (INT_PTR)FALSE; } INT_PTR CALLBACK Dialog_seven(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//注册时个人信息框// { switch (uMsg) { case WM_INITDIALOG: SetDlgItemText(hwndDlg, IDC_EDIT19, L"昵称"); SetDlgItemText(hwndDlg, IDC_EDIT12, L"性别"); SetDlgItemText(hwndDlg, IDC_EDIT13, L"年龄"); SetDlgItemText(hwndDlg, IDC_EDIT14, L"个性签名"); return (INT_PTR)TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: // 获取所有个人信息 GetDlgItemText(hwndDlg, IDC_EDIT15, g_szNickname, 32);//将昵称保存到全局变量g_szNickname// GetDlgItemText(hwndDlg, IDC_EDIT16, g_szGender, 16);//将性别保存到全局变量g_szGender// GetDlgItemText(hwndDlg, IDC_EDIT17, g_szAge, 8);//将年龄保存到全局变量g_szAge// GetDlgItemText(hwndDlg, IDC_EDIT18, g_szSignature, 128);//将个性签名保存到全局变量g_szNickname// if (g_szNickname[0] == '\0') { MessageBox(NULL, L"昵称未设置", L"QQ", MB_ICONERROR); SetFocus(GetDlgItem(hwndDlg, IDC_EDIT19)); return (INT_PTR)TRUE; } if (g_szGender[0] == '\0'||(wcscmp(g_szGender,L"男")!=0)&&(wcscmp(g_szGender, L"女")!=0)) { if(g_szGender[0] == '\0') MessageBox(NULL, L"性别未设置", L"QQ", MB_ICONERROR); else if(wcscmp(g_szGender,L"男")!=0 && wcscmp(g_szGender, L"女")!=0) MessageBox(NULL, L"性别设置错误,性别只能是‘男’或者‘女'", L"QQ", MB_ICONERROR); SetFocus(GetDlgItem(hwndDlg, IDC_EDIT12)); return (INT_PTR)TRUE; } if (g_szAge[0] == '\0') { MessageBox(NULL, L"年龄未设置", L"QQ", MB_ICONERROR); SetFocus(GetDlgItem(hwndDlg, IDC_EDIT13)); return (INT_PTR)TRUE; } if (g_szSignature[0] == '\0') { MessageBox(NULL, L"个性签名未设置", L"QQ", MB_ICONERROR); SetFocus(GetDlgItem(hwndDlg, IDC_EDIT14)); return (INT_PTR)TRUE; } // 再次获取所有个人信息 GetDlgItemText(hwndDlg, IDC_EDIT15, g_szNickname, 32);//将昵称保存到全局变量g_szNickname// GetDlgItemText(hwndDlg, IDC_EDIT16, g_szGender, 16);//将性别保存到全局变量g_szGender// GetDlgItemText(hwndDlg, IDC_EDIT17, g_szAge, 8);//将年龄保存到全局变量g_szAge// GetDlgItemText(hwndDlg, IDC_EDIT18, g_szSignature, 128);//将个性签名保存到全局变量g_szNickname// EndDialog(hwndDlg, IDOK); return (INT_PTR)TRUE; case IDCANCEL: EndDialog(hwndDlg, IDCANCEL); return (INT_PTR)TRUE; } } return (INT_PTR)FALSE; } WCHAR g_szPhotoPath[MAX_PATH] = L""; HBITMAP g_hBitmap = NULL;//HBITMAP 是位图的句柄类型// HBITMAP LoadImageFileToBitmap(HWND hwnd, LPCWSTR path, int width, int height)//加载头像,LPCWSTR指向常量宽字符字符串的长指针// { using namespace Gdiplus; static ULONG_PTR gdiplusToken = 0; if (!gdiplusToken) //检查GDI+是否初始化// { GdiplusStartupInput gdiplusStartupInput; GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); } Bitmap bmp(path);//加载图片// if (bmp.GetLastStatus() != Ok) //检查bmp最近最后一次的操作状态是否成功,即加载图片是否成功// return NULL; // 缩放到控件大小 Bitmap* pThumb = new Bitmap(width, height, bmp.GetPixelFormat());//bmp.GetPixelFormat获取位图的像素格式// Graphics g(pThumb);//Graphics是GDI+的核心绘图类,封装了所有绘图操作;g是定义的Graphics的对象名;pThumb:指向Bitmap对象的指针// g.DrawImage(&bmp, 0, 0, width, height);//进行图像绘制// HBITMAP hBmp = NULL; pThumb->GetHBITMAP(Color(200,230,255), &hBmp); delete pThumb; //读取文件// HANDLE hFile = CreateFile(path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { MessageBox(NULL, L"读取头像文件失败", L"QQ",MB_ICONERROR); return hBmp; } else { g_dwImageSize = GetFileSize(hFile, NULL);//获取数据大小// g_pImageData = new BYTE[g_dwImageSize]; DWORD dwREAD; ReadFile(hFile, g_pImageData, g_dwImageSize, &dwREAD, NULL);//将图片文件存储在g_pImageData中// CloseHandle(hFile);//释放文件句柄// } return hBmp; } INT_PTR CALLBACK Dialog_eight(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//头像上传框// { OPENFILENAME ofn = { 0 };//初始化文件对话框// WCHAR szFile[MAX_PATH] = L"";//头文件<windows.h>包含了MAX_PATH的定义// switch (uMsg) { case WM_INITDIALOG: g_szPhotoPath[0] = 0; if (g_hBitmap) { DeleteObject(g_hBitmap); g_hBitmap = NULL; } return (INT_PTR)TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDPHOTO: ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hwndDlg; ofn.lpstrFilter = L"图片文件 (*.jpg;*.png)\0*.jpg;*.png\0所有文件 (*.*)\0*.*\0"; ofn.lpstrFile = szFile;//保存图片路径// ofn.nMaxFile = MAX_PATH; ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST; if (GetOpenFileName(&ofn)) { // 检查扩展名 std::wstring path = szFile;//获取图片了路径// auto pos = path.find_last_of(L'.');//在字符串中从后向前查找最后一个.字符的位置// if (pos == std::wstring::npos) { MessageBox(hwndDlg, L"文件无扩展名,无法识别", L"QQ", MB_OK | MB_ICONERROR); break; } std::wstring ext = path.substr(pos);//获取扩展名// std::transform(ext.begin(), ext.end(), ext.begin(), ::towlower);//将扩展名的字符转化为小写,towlower所要进行的操作// if (ext != L".jpg" && ext != L".png") { MessageBox(hwndDlg, L"仅支持jpg和png", L"QQ", MB_OK | MB_ICONWARNING); break; } // 保存路径 wcsncpy_s(g_szPhotoPath, szFile, _TRUNCATE);//将szFile里的路径保存到g_szPhotoPath,_TRUNCATE允许截断路径,防止溢出目标缓冲区// // 加载并显示到静态控件 if (g_hBitmap) { DeleteObject(g_hBitmap); g_hBitmap = NULL; } RECT rc;//rc的坐标是屏幕坐标// GetWindowRect(GetDlgItem(hwndDlg, IDC_MY_IMAGE_TWO), &rc);//获取图片控件的位置和尺寸,并保存到rc中// MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rc, 2);//将rc的坐标转换为窗口坐标// int w = rc.right - rc.left, h = rc.bottom - rc.top;//获取图片的宽和高// g_hBitmap = LoadImageFileToBitmap(hwndDlg, g_szPhotoPath, w, h); if (g_hBitmap) SendDlgItemMessage(hwndDlg, IDC_MY_IMAGE_TWO, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)g_hBitmap);//向对话框指定控件发送消息,这里是更新图片控件// else MessageBox(hwndDlg, L"图片加载失败", L"QQ", MB_OK | MB_ICONERROR); } return (INT_PTR)TRUE; case IDOK: if (wcslen(g_szPhotoPath) == 0) { MessageBox(hwndDlg, L"请先上传头像", L"QQ", MB_OK | MB_ICONWARNING); break; } EndDialog(hwndDlg, IDOK); return (INT_PTR)TRUE; case IDCANCEL: EndDialog(hwndDlg, IDCANCEL); return (INT_PTR)TRUE; } case WM_DESTROY: if (g_hBitmap) { DeleteObject(g_hBitmap); g_hBitmap = NULL; } return (INT_PTR)TRUE; } return (INT_PTR)FALSE; } //IP格式验证// bool IsValidIP(const WCHAR* ip) { char ipAnsi[16]; // 将宽字符转换为ANSI WideCharToMultiByte(CP_ACP, 0, ip, -1, ipAnsi, 16, NULL, NULL); struct in_addr addr; // 尝试转换IP地址 return (inet_pton(AF_INET, ipAnsi, &addr) == 1); } INT_PTR CALLBACK Dialog_nine(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//IP输入框// { HANDLE hThread = NULL; switch (uMsg) { case WM_INITDIALOG: SetDlgItemText(hwndDlg, IDC_EDIT20, L"服务器IP"); return (INT_PTR)TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: WCHAR IP[16]; GetDlgItemText(hwndDlg, IDC_EDIT21, IP, 16);//获取IP地址,存储在IP数组里面// if (!IsValidIP(IP))//IP格式验证// { MessageBox(hwndDlg, L"IP格式错误", L"QQ", MB_ICONERROR); SetDlgItemText(hwndDlg, IDC_EDIT21, L"");//清除错误IP// SetFocus(GetDlgItem(hwndDlg, IDC_EDIT21)); return (INT_PTR)TRUE; } MessageBox(hwndDlg, L"IP格式正确", L"QQ", MB_ICONINFORMATION); // 禁用确定按钮,防止重复点击 EnableWindow(GetDlgItem(hwndDlg, IDOK), FALSE); //创建工作线程,执行网络连接// DWORD threadId; hThread = CreateThread( NULL, 0, [](LPVOID param)->DWORD { HWND hwnd = (HWND)param; g_clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建套接字// if (g_clientSocket == INVALID_SOCKET) { MessageBox(hwnd, L"创建套接字失败", L"QQ", MB_ICONERROR); return 1; } MessageBox(hwnd, L"创建套接字成功", L"QQ", MB_ICONINFORMATION); //设置服务器地址// sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(8080);//服务器端口// WCHAR IP[16]; GetDlgItemText(hwnd, IDC_EDIT21, IP, 16);//从对话框获取IP地址// char ipAnsi[16]; WideCharToMultiByte(CP_UTF8, 0, IP, -1, ipAnsi, 16, NULL, NULL);//IP地址转化为char类型// inet_pton(AF_INET, ipAnsi, &serverAddr.sin_addr); if (connect(g_clientSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) //连接服务器// { int error = WSAGetLastError(); switch (error) { case WSAECONNREFUSED: MessageBox(hwnd, L"连接被拒绝", L"QQ", MB_ICONERROR); break; case WSAENETUNREACH: MessageBox(hwnd, L"网络不可达", L"QQ", MB_ICONERROR); break; case WSAEHOSTDOWN: MessageBox(hwnd, L"主机不可达", L"QQ", MB_ICONERROR); break; case WSAETIMEDOUT: MessageBox(hwnd, L"连接超时", L"QQ", MB_ICONERROR); break; default: MessageBox(hwnd, L"连接服务器失败", L"QQ", MB_ICONERROR); break; } closesocket(g_clientSocket); g_clientSocket = INVALID_SOCKET; PostMessage(hwnd, WM_CONNECT_FAILED, 0, 0); return 1; } g_isConnected = true; PostMessage(hwnd, WM_CONNECT_SUCCESS, 0, 0); return 0; }, hwndDlg, 0, &threadId ); if (hThread) { CloseHandle(hThread);//释放线程句柄// } return (INT_PTR)TRUE; case IDCANCEL: EndDialog(hwndDlg, IDCANCEL); return (INT_PTR)TRUE; }break; case WM_CONNECT_SUCCESS: { MessageBox(hwndDlg, L"服务器连接成功", L"QQ", MB_ICONINFORMATION); //发送字符// std::wstring msg = L"你好,服务器。"; send(g_clientSocket, (const char*)msg.c_str(), msg.size()*sizeof(WCHAR), 0); EndDialog(hwndDlg, IDOK); return (INT_PTR)TRUE; } case WM_CONNECT_FAILED: EnableWindow(GetDlgItem(hwndDlg, IDOK), TRUE); // 重新启用确定按钮 return (INT_PTR)TRUE; } return (INT_PTR)FALSE; } INT_PTR CALLBACK Dialog_ten(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//登录界面首页框// { switch (uMsg) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_EDIT22: EndDialog(hwndDlg, IDC_EDIT22); return (INT_PTR)TRUE; case IDC_EDIT23: EndDialog(hwndDlg, IDC_EDIT23); return (INT_PTR)TRUE; case IDC_EDIT24: EndDialog(hwndDlg, IDC_EDIT24); return (INT_PTR)TRUE; case IDC_EDIT25: EndDialog(hwndDlg, IDC_EDIT25); return (INT_PTR)TRUE; case IDC_EDIT26: EndDialog(hwndDlg, IDC_EDIT26); return (INT_PTR)TRUE; case IDCANCEL: EndDialog(hwndDlg, IDCANCEL); return (INT_PTR)TRUE; case IDC_EDIT43: EndDialog(hwndDlg, IDC_EDIT43); return (INT_PTR)TRUE; } } return (INT_PTR)FALSE; } INT_PTR CALLBACK Dialog_eleven(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//服务器对话框// { switch (uMsg) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: EndDialog(hwndDlg, IDOK); return (INT_PTR)TRUE; case IDCANCEL: EndDialog(hwndDlg, IDCANCEL); return (INT_PTR)TRUE; } } return (INT_PTR)FALSE; } INT_PTR CALLBACK Dialog_twelve(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//聊天室对话框// { switch (uMsg) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: EndDialog(hwndDlg, IDOK); return (INT_PTR)TRUE; case IDCANCEL: EndDialog(hwndDlg, IDCANCEL); return (INT_PTR)TRUE; } } return (INT_PTR)FALSE; } INT_PTR CALLBACK Dialog_thirdteen(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//好友列表框// { switch (uMsg) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: EndDialog(hwndDlg, IDOK); return (INT_PTR)TRUE; case IDCANCEL: EndDialog(hwndDlg, IDCANCEL); return (INT_PTR)TRUE; } } return (INT_PTR)FALSE; } INT_PTR CALLBACK Dialog_fourteen(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//登录后个人信息框// { switch (uMsg) { case WM_INITDIALOG: SetDlgItemText(hwndDlg, IDC_EDIT31, L"账号"); SetDlgItemText(hwndDlg, IDC_EDIT32, L"密码"); SetDlgItemText(hwndDlg, IDC_EDIT33, L"昵称"); SetDlgItemText(hwndDlg, IDC_EDIT34, L"性别"); SetDlgItemText(hwndDlg, IDC_EDIT35, L"年龄"); SetDlgItemText(hwndDlg, IDC_EDIT36, L"个性签名"); return (INT_PTR)TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: EndDialog(hwndDlg, IDOK); return (INT_PTR)TRUE; case IDCANCEL: EndDialog(hwndDlg, IDCANCEL); return (INT_PTR)TRUE; } } return (INT_PTR)FALSE; } //宽字符串文本发送函数// void send_wchar(WCHAR wstr[],int wchar_size,SOCKET socket) { //计算转换所需要的空间长度// int len = WideCharToMultiByte(CP_UTF8,0,wstr,wchar_size*sizeof(WCHAR), NULL, 0, NULL, NULL);//发送注册数据到客户端,使用UTF-8进行网络传输,它是国际通用的编码方式// std::wstring target;//存储格式转换后的文本// target.resize(len);//分配空间// //实际转换// WideCharToMultiByte(CP_UTF8, 0, wstr, wchar_size,(char*) & target[0], len, NULL, NULL); send(socket,(const char*)target.c_str(),target.size()*sizeof(WCHAR), 0);//再发内容// } int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE, LPSTR, int nCmdShow)//Winmain主函数// { int result_one=DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_ONE), NULL, Dialog_one); if (result_one == IDEND)//退出// //一级判断// { DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_END), NULL, Dialog_end);//退出框// } else if(result_one == IDOK)//一级判断// { WSADATA wsaData; int result = WSAStartup(MAKEWORD(2, 2), &wsaData); if (result) { MessageBox(NULL, L"Winsock初始化失败", L"QQ", MB_ICONERROR); WSACleanup(); } if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) { MessageBox(NULL, L"不支持Winsock2.2", L"QQ", MB_ICONERROR); WSACleanup(); } MessageBox(NULL, L"Winsock初始化成功", L"QQ", MB_ICONINFORMATION); INT_PTR result_nine = DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_NINE), NULL, Dialog_nine);//IP输入框// if (result_nine == IDCANCEL)//退出// //二级判断// { DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_END), NULL, Dialog_end);//退出框// } else if (result_nine == IDOK)//二级判断// { door_one: INT_PTR result_two = DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_TWO), NULL, Dialog_two);//登录和注册选择框// if (result_two == IDLOGIN)//登录// //三级判断// { INT_PTR result_three = DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_THREE), NULL, Dialog_three);//登录对话框(需账号和密码验证)// if (result_three == IDOK) //四级判断// { door_two: int result_ten = DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_TEN), NULL, Dialog_ten);//登陆界面首页框// int result_fifteen = 0; int result_eleven = 0; int result_twelve = 0; int result_thirdteen = 0; int result_fourteen= 0; switch (result_ten) { case IDC_EDIT22: result_twelve=DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_TWELVE), NULL, Dialog_twelve);//聊天室对话框// switch (result_twelve) { case IDOK: MessageBox(NULL, L"还未开发", L"QQ", MB_ICONINFORMATION); break; case IDCANCEL: goto door_two;//登陆界面首页框// break; }break; case IDC_EDIT23: result_thirdteen=DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_THIRDTEEN), NULL, Dialog_thirdteen);//好友框// switch (result_thirdteen) { case IDOK: MessageBox(NULL, L"还未开发", L"QQ", MB_ICONINFORMATION); break; case IDCANCEL: goto door_two;//登陆界面首页框// break; }break; case IDC_EDIT24: result_fourteen=DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_FOURTEEN), NULL, Dialog_fourteen);//个人信息框// switch (result_fourteen) { case IDOK: MessageBox(NULL, L"还未开发", L"QQ", MB_ICONINFORMATION); break; case IDCANCEL: goto door_two;//登陆界面首页框// break; }break; case IDC_EDIT25: result_fifteen=DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_EIGHT), NULL, Dialog_eight);//更换头像框// switch (result_fifteen) { case IDOK: MessageBox(NULL, L"还未开发", L"QQ", MB_ICONINFORMATION); break; case IDCANCEL: goto door_two;//登陆界面首页框// break; }break; case IDC_EDIT26: result_eleven=DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_ELEVEN), NULL, Dialog_eleven);//服务器框// switch (result_eleven) { case IDOK: MessageBox(NULL, L"还未开发", L"QQ", MB_ICONINFORMATION); break; case IDCANCEL: goto door_two;//登陆界面首页框// break; }break; case IDCANCEL: DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_END), NULL, Dialog_end);//退出框// break; case IDC_EDIT43: goto door_one;//登陆界面首页框// break; } } else if (result_three == IDCANCEL)//四级判断// { goto door_one;//登录和注册选择框// } } else if (result_two == IDREGISTER)//注册// //三级判断// { door_three: INT_PTR result_four = DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_FOUR), NULL, Dialog_four);//注册对话框// if (result_four == IDGOON)//四级判断// { door_four: INT_PTR result_five = DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_FIVE), NULL, Dialog_five);//密码设置框// { if (result_five == IDFINISH)//五级判断// { door_five: int result_seven=DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_SEVEN), NULL, Dialog_seven);//个人信息框// if (result_seven==IDCANCEL)//六级判断// { goto door_four; } else if (result_seven == IDOK)//六级判断// { door_six: int result_eight=DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_EIGHT), NULL, Dialog_eight);//头像上传框// if (result_eight == IDCANCEL)//七级判断// { goto door_five; } else if (result_eight == IDOK)//七级判断// { INT_PTR result_six = DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_SIX), NULL, Dialog_six);//注册成功框// if (result_six == IDOK)//八级判断// { //获取数组大小(元素个数)// int g_szAccount_len = sizeof(g_szAccount); int g_szPassword_len = sizeof(g_szPassword); int g_szNickname_len = sizeof(g_szNickname); int g_szGender_len = sizeof(g_szGender); int g_szAge_len = sizeof(g_szAge); int g_szSignature_len = sizeof(g_szSignature); //开始发送// //send_wchar(g_szAccount,g_szAccount_len,g_clientSocket);//账号// //send_wchar(g_szPassword,g_szPassword_len,g_clientSocket);//密码// //send_wchar(g_szNickname,g_szNickname_len,g_clientSocket);//昵称// //send_wchar(g_szGender,g_szGender_len, g_clientSocket);//性别// //send_wchar(g_szAge,g_szAge_len, g_clientSocket);//年龄// send_wchar(g_szSignature,g_szSignature_len,g_clientSocket);//个性签名// //send(g_clientSocket, (char*)g_pImageData, g_dwImageSize, 0);//头像// /* send(g_clientSocket, (const char*)g_szAccount, g_szAccount_len, 0);//账号// send(g_clientSocket, (const char*)g_szPassword, g_szPassword_len, 0);//密码// send(g_clientSocket, (const char*)g_szNickname, g_szNickname_len, 0);//昵称// send(g_clientSocket, (const char*)g_szGender, g_szGender_len, 0);//性别// send(g_clientSocket, (const char*)g_szAge, g_szAge_len, 0);//年龄// send(g_clientSocket, (const char*)g_szSignature, g_szSignature_len, 0);//个性签名// */ MessageBox(NULL, L"已将您的注册数据保存到服务器", L"QQ", MB_ICONINFORMATION); goto door_one;//返回登录和注册选择框// } else if (IDCANCEL)//八级判断// { goto door_six; } } } } else if (result_five == IDCANCEL)//五级判断// { goto door_three;//注册对话框// } } } else if (result_four == IDCANCEL)//四级判断// { goto door_one;//返回登录和注册选择框// } } else if (result_two == IDCANCEL)//退出// //三级判断// { DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_END), NULL, Dialog_end);//退出框// } } } return 0; }为什么你好,服务器。可以被服务器正常接收并显示,而昵称等显示乱码
07-11
#include<winsock2.h> #include<ws2tcpip.h> #include<windows.h> #include<thread> #include<queue> #include"resource.h" #pragma comment(lib,"ws2_32.lib") HWND g_hInfoDialog = NULL;//对话框句柄// std::queue<std::wstring>g_msgQueue;//消息队列// CRITICAL_SECTION g_csMsgQueue;//线程同步锁// int z = 0; INT_PTR CALLBACK Dialog_one(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//开始对话框// { static UINT_PTR TimeID = 0;//启用定时器// static HBRUSH hBackgroundBrush = NULL;//背景画刷// static HBITMAP hBmp = NULL;//位图句柄// switch (uMsg) { case WM_INITDIALOG: TimeID = SetTimer(hwndDlg, 1, 4000, NULL);//显示第一个对话框的内容,延迟4秒;1为定时器的ID,当定时结束后,传递给wParam的参数为其ID,即1.// hBackgroundBrush = CreateSolidBrush((RGB(200, 230, 255)));//设置背景为淡蓝色// hBmp = (HBITMAP)LoadImage(NULL, L"image_one.bmp", IMAGE_BITMAP, 200, 170, LR_LOADFROMFILE);//加载图片位置// if (hBmp) { SendDlgItemMessage(hwndDlg, IDC_MY_IMAGE_ONE, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBmp); } else { MessageBox(hwndDlg, L"image lost", L"QQ", MB_ICONERROR); } return (INT_PTR)TRUE;//设置焦点// case WM_DRAWITEM: { DRAWITEMSTRUCT* pdis = (DRAWITEMSTRUCT*)lParam; if (pdis->CtlID == IDC_CUSTOM_TEXT) { SetTextColor(pdis->hDC, RGB(255, 0, 0)); DrawText(pdis->hDC, L"Welcome to QQ's server", -1, &pdis->rcItem,//对话框标题// DT_CENTER | DT_VCENTER); } return (INT_PTR)TRUE; } case WM_CTLCOLORDLG: return (INT_PTR)hBackgroundBrush; case WM_COMMAND: if (LOWORD(wParam) == IDSTART) { EndDialog(hwndDlg, IDOK);//关闭对话框// } return (INT_PTR)TRUE; case WM_TIMER: if (wParam == 1) { EndDialog(hwndDlg, IDOK);//关闭对话框// } return (INT_PTR)TRUE; case WM_DESTROY: KillTimer(hwndDlg, TimeID);//销毁定时器// DeleteObject(hBackgroundBrush);//释放画刷// DeleteObject(hBmp);//释放位图资源// break; case WM_CLOSE: EndDialog(hwndDlg, IDEND);//关闭对话框// break; } return (INT_PTR)FALSE; } INT_PTR CALLBACK Dialog_end(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//结束对话框// { static UINT_PTR TimeID = 0;//启用定时器// static HBRUSH hBackgroundBrush = NULL;//背景画刷// static HBITMAP hBmp = NULL;//位图句柄// switch (uMsg) { case WM_INITDIALOG: TimeID = SetTimer(hwndDlg, 1, 4000, NULL);//显示第一个对话框的内容,延迟3秒// hBackgroundBrush = CreateSolidBrush((RGB(200, 230, 255)));//设置背景为淡蓝色// return (INT_PTR)TRUE;//设置焦点// case WM_DRAWITEM: { DRAWITEMSTRUCT* pdis = (DRAWITEMSTRUCT*)lParam; if (pdis->CtlID == IDC_CUSTOM_TEXT_TWO) { SetTextColor(pdis->hDC, RGB(255, 0, 0)); DrawText(pdis->hDC, L"Goodbye", -1, &pdis->rcItem,//对话框标题// DT_CENTER | DT_VCENTER); } return (INT_PTR)TRUE; } case WM_CTLCOLORDLG: return (INT_PTR)hBackgroundBrush; case WM_TIMER: if (wParam == 1) { KillTimer(hwndDlg, TimeID);//销毁定时器// DeleteObject(hBackgroundBrush);//释放画刷// EndDialog(hwndDlg, IDOK);//关闭对话框// } return (INT_PTR)TRUE; case WM_CLOSE: EndDialog(hwndDlg, IDEND);//关闭对话框// break; } return (INT_PTR)FALSE; } //消息更新函数// void UpdateDialogContent(HWND hwndDlg) { EnterCriticalSection(&g_csMsgQueue);//加锁// if (!g_msgQueue.empty())//队列非空// { std::wstring msg = g_msgQueue.front();//取队首元素// g_msgQueue.pop();//将队首元素弹出// int len = GetWindowTextLength(GetDlgItem(hwndDlg, IDC_INFORMATION));//获取当前控件文本长度// wchar_t* currentText = new wchar_t[len + 1]; GetWindowText(GetDlgItem(hwndDlg, IDC_INFORMATION), currentText, len + 1);//获取当前控件文本// std::wstring combined=L""; if (len > 0) { if (z)//第一次接收消息时,去除对话框的“等待消息...”// { combined = currentText; combined += L"\r\n"; } z = 1; } combined += msg; SetDlgItemText(hwndDlg, IDC_INFORMATION, combined.c_str());//更新消息// delete[] currentText; } LeaveCriticalSection(&g_csMsgQueue);//解锁// } INT_PTR CALLBACK Dialog_information(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//消息对话框// { switch (uMsg) { case WM_INITDIALOG: SetDlgItemText(hwndDlg, IDC_INFORMATION, L"等待消息...");//更新消息// return (INT_PTR)TRUE; case WM_APP_UPDATE_MSG: UpdateDialogContent(hwndDlg); return (INT_PTR)TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDCANCEL) { DestroyWindow(hwndDlg); g_hInfoDialog = NULL; DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_MYDIALOG_END), NULL, Dialog_end);//结束框// return (INT_PTR)TRUE; } } return (INT_PTR)FALSE; } void HandleClient(SOCKET client_server) { char received[1024]; sockaddr_in clientAddr; int addrlen = sizeof(clientAddr); //获取客户端地址// getpeername(client_server, (sockaddr*)&clientAddr, &addrlen); char ipStr[INET_ADDRSTRLEN]; inet_ntop(AF_INET, &(clientAddr.sin_addr), ipStr, INET_ADDRSTRLEN); //转换为Unicode字符串(WCHAR) wchar_t wIP[20]; MultiByteToWideChar(CP_UTF8,0,ipStr,-1,wIP,sizeof(wIP)/sizeof(wchar_t)); int x = 0; while (true) { int rec = recv(client_server, received, sizeof(received) - sizeof(char), 0); if (rec <= 0) { break; } received[rec / sizeof(char)] = L'\0'; int len = MultiByteToWideChar(CP_UTF8,0,received,-1,NULL,0); WCHAR*received_pro = new WCHAR[len]; MultiByteToWideChar(CP_UTF8, 0, received, -1, received_pro,len); //获取当前时间// time_t now = time(0); tm tm; localtime_s(&tm, &now); wchar_t timeBuffer[64]; wcsftime(timeBuffer,sizeof(timeBuffer)/sizeof(wchar_t),L"%Y-%m-%d %H:%M:%S",&tm); std::wstring fullMessage = L"["; fullMessage += timeBuffer; fullMessage += L"]["; fullMessage +=wIP; fullMessage += L"]"; fullMessage += received_pro; EnterCriticalSection(&g_csMsgQueue);//加锁// delete[]received_pro; g_msgQueue.push(std::wstring(fullMessage));//创建副本// LeaveCriticalSection(&g_csMsgQueue);//解锁// if (x == 0) { MessageBox(NULL, L"服务器已成功接收来自客户端的信息", L"QQ", MB_ICONINFORMATION);//只提示一次// x = 1; } //通知现有对话框更新内容// PostMessage(g_hInfoDialog, WM_APP_UPDATE_MSG, 0, 0); } MessageBox(NULL, L"服务器已无法接收来自客户端的信息", L"QQ", MB_ICONERROR); closesocket(client_server); } DWORD WINAPI StartServer(LPVOID lpParam)//服务器线程函数// { SOCKET server_socket = INVALID_SOCKET; server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建套接字// if (server_socket == INVALID_SOCKET) { MessageBox(NULL, L"服务器套接字创建失败", L"QQ", MB_ICONERROR); exit(1); } else { MessageBox(NULL, L"服务器套接字创建成功", L"QQ", MB_ICONINFORMATION); } //设置服务器地址// sockaddr_in serverAddr; serverAddr.sin_family = AF_INET;//设置为IPv4// serverAddr.sin_port = htons(8080);//端口号// serverAddr.sin_addr.s_addr = INADDR_ANY;//监听所有网卡,即本机的所有IP地址// bind(server_socket, (sockaddr*)&serverAddr, sizeof(serverAddr));//将套接字与指定的IP地址和端口号关联// listen(server_socket, 50);//开始监听// int y = 0; while (true&&y<=3) { SOCKET client_server = accept(server_socket, NULL, NULL);//创建新的套接字// if (client_server == INVALID_SOCKET) { MessageBox(NULL, L"无法创建新的套接字与客户端进行通信", L"QQ", MB_ICONINFORMATION); y++; continue; } MessageBox(NULL, L"成功创建新的套接字与客户端进行通信", L"QQ", MB_ICONINFORMATION); std::thread(HandleClient, client_server).detach();//创建线程// } exit(1); } int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE, LPSTR, int nCmdShow) { InitializeCriticalSection(&g_csMsgQueue);//初始化// INT_PTR result_one = DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_ONE), NULL, Dialog_one);//开始框// if (result_one == IDOK)//一级判断// { WSADATA wsaData; int result = WSAStartup(MAKEWORD(2, 2), &wsaData); if (result) { MessageBox(NULL, L"Winsock初始化失败", L"QQ", MB_ICONERROR); WSACleanup(); exit(1); } if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) { MessageBox(NULL, L"不支持Winsock2.2", L"QQ", MB_ICONERROR); WSACleanup(); exit(1); } MessageBox(NULL, L"Winsock初始化成功", L"QQ", MB_ICONINFORMATION); if (g_hInfoDialog == NULL)//创建消息对话框// { g_hInfoDialog = CreateDialog( GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_MYDIALOG_INFORMATION), NULL, Dialog_information ); ShowWindow(g_hInfoDialog, SW_SHOW); } CreateThread(NULL, 0, StartServer, NULL, 0, NULL); } else if (result_one == IDEND)//一级判断// { DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_END), NULL, Dialog_end);//结束框// } // 主消息循环 MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { if (!IsDialogMessage(g_hInfoDialog, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } WSACleanup(); DeleteCriticalSection(&g_csMsgQueue); return 0; } #include <winsock2.h> #include <ws2tcpip.h> #include<windows.h> #include<commCtrl.h> #include"resource.h" #include <wincrypt.h> #include<atlstr.h> #include<string> #include <gdiplus.h> #include <algorithm> #pragma comment(lib, "gdiplus.lib") #pragma comment(lib,"ws2_32.lib") // 全局变量 SOCKET g_clientSocket = INVALID_SOCKET; // 全局套接字,保持连接 bool g_isConnected = false; // 连接状态标志 WCHAR g_szAccount[32] = { 0 }; // 账号 WCHAR g_szPassword[32] = { 0 }; // 密码 WCHAR g_szNickname[32] = { 0 }; // 昵称 WCHAR g_szGender[16] = { 0 }; // 性别 WCHAR g_szAge[8] = { 0 }; // 年龄 WCHAR g_szSignature[128] = { 0 }; // 个性签名 BYTE* g_pImageData = NULL;//储存头像的二进制数据// DWORD g_dwImageSize = 0;//数据大小// int passwd_back_to_account = 0;//账号是否已产生,防止密码设置时,按下取消键,回到账号生成框后,重新生成账号// INT_PTR CALLBACK Dialog_one(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//初始化对话框// { static UINT_PTR TimeID = 0;//启用定时器// static HBRUSH hBackgroundBrush = NULL;//背景画刷// static HBITMAP hBmp = NULL;//位图句柄// switch (uMsg) { case WM_INITDIALOG: //SetDlgItemText(hwndDlg, IDC_EDIT3, L"Welcome to QQ");//第一个对话框的内容// TimeID = SetTimer(hwndDlg, 1, 4000, NULL);//显示第一个对话框的内容,延迟3秒// hBackgroundBrush = CreateSolidBrush((RGB(200, 230, 255)));//设置背景为淡蓝色// hBmp = (HBITMAP)LoadImage(NULL, L"image_one.bmp", IMAGE_BITMAP, 200, 170, LR_LOADFROMFILE);//加载图片位置// if (hBmp) { SendDlgItemMessage(hwndDlg, IDC_MY_IMAGE_ONE, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBmp); } else { MessageBox(hwndDlg, L"image lost", L"QQ", MB_ICONERROR); } return (INT_PTR)TRUE;//设置焦点// case WM_DRAWITEM: { DRAWITEMSTRUCT* pdis = (DRAWITEMSTRUCT*)lParam; if (pdis->CtlID == IDC_CUSTOM_TEXT) { SetTextColor(pdis->hDC, RGB(255, 0, 0)); DrawText(pdis->hDC, L"Welcome to QQ", -1, &pdis->rcItem,//对话框标题// DT_CENTER | DT_VCENTER); } return (INT_PTR)TRUE; } case WM_CTLCOLORDLG: return (INT_PTR)hBackgroundBrush; case WM_COMMAND: if (LOWORD(wParam) == IDSTART) { EndDialog(hwndDlg, IDOK);//关闭对话框// } return (INT_PTR)TRUE; /*case WM_TIMER: if (wParam == 1) { EndDialog(hwndDlg, IDOK);//关闭对话框// } return (INT_PTR)TRUE; */ case WM_DESTROY: KillTimer(hwndDlg, TimeID);//销毁定时器// DeleteObject(hBackgroundBrush);//释放画刷// DeleteObject(hBmp);//释放位图资源// EndDialog(hwndDlg, IDCANCEL);//关闭对话框// break; case WM_CLOSE: EndDialog(hwndDlg, IDEND);//关闭对话框// break; } return (INT_PTR)FALSE; } INT_PTR CALLBACK Dialog_end(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//结束对话框// { static UINT_PTR TimeID = 0;//启用定时器// static HBRUSH hBackgroundBrush = NULL;//背景画刷// static HBITMAP hBmp = NULL;//位图句柄// switch (uMsg) { case WM_INITDIALOG: TimeID = SetTimer(hwndDlg, 1, 4000, NULL);//显示第一个对话框的内容,延迟3秒// hBackgroundBrush = CreateSolidBrush((RGB(200, 230, 255)));//设置背景为淡蓝色// return (INT_PTR)TRUE;//设置焦点// case WM_DRAWITEM: { DRAWITEMSTRUCT* pdis = (DRAWITEMSTRUCT*)lParam; if (pdis->CtlID == IDC_CUSTOM_TEXT_TWO) { SetTextColor(pdis->hDC, RGB(255, 0, 0)); DrawText(pdis->hDC, L"Goodbye", -1, &pdis->rcItem,//对话框标题// DT_CENTER | DT_VCENTER); } return (INT_PTR)TRUE; } case WM_CTLCOLORDLG: return (INT_PTR)hBackgroundBrush; case WM_TIMER: if (wParam == 1) { KillTimer(hwndDlg, TimeID);//销毁定时器// DeleteObject(hBackgroundBrush);//释放画刷// EndDialog(hwndDlg, IDOK);//关闭对话框// } return (INT_PTR)TRUE; case WM_CLOSE: EndDialog(hwndDlg, IDEND);//关闭对话框// break; } return (INT_PTR)FALSE; } INT_PTR CALLBACK Dialog_two(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//登录和注册选择框// { passwd_back_to_account = 0; switch (uMsg) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDLOGIN: EndDialog(hwndDlg, IDLOGIN); return (INT_PTR)TRUE; case IDREGISTER: EndDialog(hwndDlg, IDREGISTER); return (INT_PTR)TRUE; }break; case WM_CLOSE: EndDialog(hwndDlg, IDCANCEL); return (INT_PTR)TRUE; } return (INT_PTR)FALSE; } INT_PTR CALLBACK Dialog_three(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//登录框// { static bool EDIT1 = FALSE; static bool EDIT2 = FALSE; HWND hEdit = NULL; switch (uMsg) { case WM_INITDIALOG: SetDlgItemText(hwndDlg, IDC_EDIT3, L"账号"); SetDlgItemText(hwndDlg, IDC_EDIT4, L"密码"); SetDlgItemText(hwndDlg, IDC_EDIT1, L"账号"); SetDlgItemText(hwndDlg, IDC_EDIT2, L"密码"); SendMessage(GetDlgItem(hwndDlg, IDC_EDIT1), WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), TRUE); SendMessage(GetDlgItem(hwndDlg, IDC_EDIT2), WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), TRUE); return (INT_PTR)TRUE; case WM_CTLCOLOREDIT://设置水印文字// hEdit = (HWND)lParam; if (!EDIT1 && hEdit == GetDlgItem(hwndDlg, IDC_EDIT1)) { SetTextColor((HDC)wParam,RGB(200,200,200)); return (LRESULT)GetSysColorBrush(COLOR_WINDOW); } if (!EDIT2 && hEdit == GetDlgItem(hwndDlg, IDC_EDIT2)) { SetTextColor((HDC)wParam, RGB(200, 200, 200)); return (LRESULT)GetSysColorBrush(COLOR_WINDOW); }break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_EDIT1: if (HIWORD(wParam) == EN_SETFOCUS && !EDIT1) { SetDlgItemText(hwndDlg, IDC_EDIT1, L""); EDIT1 = TRUE; } else if (HIWORD(wParam) == EN_KILLFOCUS) { if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_EDIT1)) == 0) { SetDlgItemText(hwndDlg, IDC_EDIT1, L"账号"); EDIT1 = FALSE; } }break; case IDC_EDIT2: if (HIWORD(wParam) == EN_SETFOCUS && !EDIT2) { SetDlgItemText(hwndDlg, IDC_EDIT2, L""); EDIT2 = TRUE; } else if (HIWORD(wParam) == EN_KILLFOCUS) { if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_EDIT2)) == 0) { SetDlgItemText(hwndDlg, IDC_EDIT2, L"账号"); EDIT2 = FALSE; } }break; case IDOK: //服务器验证账号密码的有效性// MessageBox(hwndDlg, L"服务器正在验证账号密码的有效性", L"QQ", MB_ICONINFORMATION); MessageBox(hwndDlg, L"登录成功", L"QQ", MB_ICONINFORMATION); EndDialog(hwndDlg, IDOK); return (INT_PTR)TRUE; case IDCANCEL: EndDialog(hwndDlg, IDCANCEL); return (INT_PTR)TRUE; } } return (INT_PTR)FALSE; } int Generate_register_number()//产生账号// { HCRYPTPROV hProvider = 0; CryptAcquireContext(&hProvider, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT); long long randomNum = 0; CryptGenRandom(hProvider, sizeof(randomNum), (BYTE*)&randomNum);//randomNum接收产生的随机数// CryptReleaseContext(hProvider, 0); int num=abs(randomNum % 9000000000) + 1000000000; // 转换为10位数 if (num > 0) return num; else if (num <= 0) return -num; } INT_PTR CALLBACK Dialog_four(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//注册框// { static long long num = 0; DRAWITEMSTRUCT* pdis = NULL; CString str; switch (uMsg) { case WM_INITDIALOG: SetDlgItemText(hwndDlg, IDC_EDIT5, L"服务器分配给你的账号"); if (passwd_back_to_account == 0) { num = Generate_register_number(); } str.Format(L"%lld", num); wcscpy_s(g_szAccount,32,str);//将账号保存到全局变量g_szAccount// SetDlgItemText(hwndDlg, IDC_EDIT6,str); return (INT_PTR)TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDGOON: EndDialog(hwndDlg, IDGOON); return (INT_PTR)TRUE; case IDCANCEL: EndDialog(hwndDlg, IDCANCEL); return (INT_PTR)TRUE; } } return (INT_PTR)FALSE; } INT_PTR CALLBACK Dialog_five(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//密码设置框// { switch (uMsg) { case WM_INITDIALOG: SetDlgItemText(hwndDlg, IDC_EDIT9, L"密码设置"); SetDlgItemText(hwndDlg, IDC_EDIT10, L"密码确认"); return (INT_PTR)TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDFINISH: // 获取密码并验证 WCHAR szPassword1[32], szPassword2[32]; GetDlgItemText(hwndDlg, IDC_EDIT7, szPassword1, 32); GetDlgItemText(hwndDlg, IDC_EDIT8, szPassword2, 32); if (szPassword1[0] == '\0') { MessageBox(NULL, L"密码不能为空", L"QQ", MB_ICONERROR); SetFocus(GetDlgItem(hwndDlg, IDC_EDIT7)); return (INT_PTR)TRUE; } if (wcscmp(szPassword1, szPassword2) != 0)//比较前后两次设置的密码是否相同// { MessageBox(hwndDlg, L"两次输入的密码不一致,请重新输入", L"QQ", MB_ICONERROR); SetDlgItemText(hwndDlg, IDC_EDIT8, L"");//清除密码// SetFocus(GetDlgItem(hwndDlg, IDC_EDIT8)); return (INT_PTR)TRUE; } // 保存密码到全局变量 wcscpy_s(g_szPassword, szPassword1); MessageBox(hwndDlg, L"密码已成功设置", L"QQ", MB_ICONINFORMATION); EndDialog(hwndDlg, IDFINISH); return (INT_PTR)TRUE; case IDCANCEL: passwd_back_to_account = 1;//账号已生成标志// EndDialog(hwndDlg, IDCANCEL); return (INT_PTR)TRUE; } } return (INT_PTR)FALSE; } INT_PTR CALLBACK Dialog_six(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//注册成功框// { switch (uMsg) { case WM_INITDIALOG: SetDlgItemText(hwndDlg, IDC_EDIT11, L"注册成功,按下“确认”即可跳转到到登录界面."); return (INT_PTR)TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: EndDialog(hwndDlg, IDOK); return (INT_PTR)TRUE; case IDCANCEL: EndDialog(hwndDlg, IDCANCEL); return (INT_PTR)TRUE; } } return (INT_PTR)FALSE; } INT_PTR CALLBACK Dialog_seven(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//注册时个人信息框// { switch (uMsg) { case WM_INITDIALOG: SetDlgItemText(hwndDlg, IDC_EDIT19, L"昵称"); SetDlgItemText(hwndDlg, IDC_EDIT12, L"性别"); SetDlgItemText(hwndDlg, IDC_EDIT13, L"年龄"); SetDlgItemText(hwndDlg, IDC_EDIT14, L"个性签名"); return (INT_PTR)TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: // 获取所有个人信息 GetDlgItemText(hwndDlg, IDC_EDIT15, g_szNickname, 32);//将昵称保存到全局变量g_szNickname// GetDlgItemText(hwndDlg, IDC_EDIT16, g_szGender, 16);//将性别保存到全局变量g_szGender// GetDlgItemText(hwndDlg, IDC_EDIT17, g_szAge, 8);//将年龄保存到全局变量g_szAge// GetDlgItemText(hwndDlg, IDC_EDIT18, g_szSignature, 128);//将个性签名保存到全局变量g_szNickname// if (g_szNickname[0] == '\0') { MessageBox(NULL, L"昵称未设置", L"QQ", MB_ICONERROR); SetFocus(GetDlgItem(hwndDlg, IDC_EDIT19)); return (INT_PTR)TRUE; } if (g_szGender[0] == '\0'||(wcscmp(g_szGender,L"男")!=0)&&(wcscmp(g_szGender, L"女")!=0)) { if(g_szGender[0] == '\0') MessageBox(NULL, L"性别未设置", L"QQ", MB_ICONERROR); else if(wcscmp(g_szGender,L"男")!=0 && wcscmp(g_szGender, L"女")!=0) MessageBox(NULL, L"性别设置错误,性别只能是‘男’或者‘女'", L"QQ", MB_ICONERROR); SetFocus(GetDlgItem(hwndDlg, IDC_EDIT12)); return (INT_PTR)TRUE; } if (g_szAge[0] == '\0') { MessageBox(NULL, L"年龄未设置", L"QQ", MB_ICONERROR); SetFocus(GetDlgItem(hwndDlg, IDC_EDIT13)); return (INT_PTR)TRUE; } if (g_szSignature[0] == '\0') { MessageBox(NULL, L"个性签名未设置", L"QQ", MB_ICONERROR); SetFocus(GetDlgItem(hwndDlg, IDC_EDIT14)); return (INT_PTR)TRUE; } // 再次获取所有个人信息 GetDlgItemText(hwndDlg, IDC_EDIT15, g_szNickname, 32);//将昵称保存到全局变量g_szNickname// GetDlgItemText(hwndDlg, IDC_EDIT16, g_szGender, 16);//将性别保存到全局变量g_szGender// GetDlgItemText(hwndDlg, IDC_EDIT17, g_szAge, 8);//将年龄保存到全局变量g_szAge// GetDlgItemText(hwndDlg, IDC_EDIT18, g_szSignature, 128);//将个性签名保存到全局变量g_szNickname// EndDialog(hwndDlg, IDOK); return (INT_PTR)TRUE; case IDCANCEL: EndDialog(hwndDlg, IDCANCEL); return (INT_PTR)TRUE; } } return (INT_PTR)FALSE; } WCHAR g_szPhotoPath[MAX_PATH] = L""; HBITMAP g_hBitmap = NULL;//HBITMAP 是位图的句柄类型// HBITMAP LoadImageFileToBitmap(HWND hwnd, LPCWSTR path, int width, int height)//加载头像,LPCWSTR指向常量宽字符字符串的长指针// { using namespace Gdiplus; static ULONG_PTR gdiplusToken = 0; if (!gdiplusToken) //检查GDI+是否初始化// { GdiplusStartupInput gdiplusStartupInput; GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); } Bitmap bmp(path);//加载图片// if (bmp.GetLastStatus() != Ok) //检查bmp最近最后一次的操作状态是否成功,即加载图片是否成功// return NULL; // 缩放到控件大小 Bitmap* pThumb = new Bitmap(width, height, bmp.GetPixelFormat());//bmp.GetPixelFormat获取位图的像素格式// Graphics g(pThumb);//Graphics是GDI+的核心绘图类,封装了所有绘图操作;g是定义的Graphics的对象名;pThumb:指向Bitmap对象的指针// g.DrawImage(&bmp, 0, 0, width, height);//进行图像绘制// HBITMAP hBmp = NULL; pThumb->GetHBITMAP(Color(200,230,255), &hBmp); delete pThumb; //读取文件// HANDLE hFile = CreateFile(path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { MessageBox(NULL, L"读取头像文件失败", L"QQ",MB_ICONERROR); return hBmp; } else { g_dwImageSize = GetFileSize(hFile, NULL);//获取数据大小// g_pImageData = new BYTE[g_dwImageSize]; DWORD dwREAD; ReadFile(hFile, g_pImageData, g_dwImageSize, &dwREAD, NULL);//将图片文件存储在g_pImageData中// CloseHandle(hFile);//释放文件句柄// } return hBmp; } INT_PTR CALLBACK Dialog_eight(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//头像上传框// { OPENFILENAME ofn = { 0 };//初始化文件对话框// WCHAR szFile[MAX_PATH] = L"";//头文件<windows.h>包含了MAX_PATH的定义// switch (uMsg) { case WM_INITDIALOG: g_szPhotoPath[0] = 0; if (g_hBitmap) { DeleteObject(g_hBitmap); g_hBitmap = NULL; } return (INT_PTR)TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDPHOTO: ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hwndDlg; ofn.lpstrFilter = L"图片文件 (*.jpg;*.png)\0*.jpg;*.png\0所有文件 (*.*)\0*.*\0"; ofn.lpstrFile = szFile;//保存图片路径// ofn.nMaxFile = MAX_PATH; ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST; if (GetOpenFileName(&ofn)) { // 检查扩展名 std::wstring path = szFile;//获取图片了路径// auto pos = path.find_last_of(L'.');//在字符串中从后向前查找最后一个.字符的位置// if (pos == std::wstring::npos) { MessageBox(hwndDlg, L"文件无扩展名,无法识别", L"QQ", MB_OK | MB_ICONERROR); break; } std::wstring ext = path.substr(pos);//获取扩展名// std::transform(ext.begin(), ext.end(), ext.begin(), ::towlower);//将扩展名的字符转化为小写,towlower所要进行的操作// if (ext != L".jpg" && ext != L".png") { MessageBox(hwndDlg, L"仅支持jpg和png", L"QQ", MB_OK | MB_ICONWARNING); break; } // 保存路径 wcsncpy_s(g_szPhotoPath, szFile, _TRUNCATE);//将szFile里的路径保存到g_szPhotoPath,_TRUNCATE允许截断路径,防止溢出目标缓冲区// // 加载并显示到静态控件 if (g_hBitmap) { DeleteObject(g_hBitmap); g_hBitmap = NULL; } RECT rc;//rc的坐标是屏幕坐标// GetWindowRect(GetDlgItem(hwndDlg, IDC_MY_IMAGE_TWO), &rc);//获取图片控件的位置和尺寸,并保存到rc中// MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rc, 2);//将rc的坐标转换为窗口坐标// int w = rc.right - rc.left, h = rc.bottom - rc.top;//获取图片的宽和高// g_hBitmap = LoadImageFileToBitmap(hwndDlg, g_szPhotoPath, w, h); if (g_hBitmap) SendDlgItemMessage(hwndDlg, IDC_MY_IMAGE_TWO, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)g_hBitmap);//向对话框指定控件发送消息,这里是更新图片控件// else MessageBox(hwndDlg, L"图片加载失败", L"QQ", MB_OK | MB_ICONERROR); } return (INT_PTR)TRUE; case IDOK: if (wcslen(g_szPhotoPath) == 0) { MessageBox(hwndDlg, L"请先上传头像", L"QQ", MB_OK | MB_ICONWARNING); break; } EndDialog(hwndDlg, IDOK); return (INT_PTR)TRUE; case IDCANCEL: EndDialog(hwndDlg, IDCANCEL); return (INT_PTR)TRUE; } case WM_DESTROY: if (g_hBitmap) { DeleteObject(g_hBitmap); g_hBitmap = NULL; } return (INT_PTR)TRUE; } return (INT_PTR)FALSE; } //IP格式验证// bool IsValidIP(const WCHAR* ip) { char ipAnsi[16]; // 将宽字符转换为ANSI WideCharToMultiByte(CP_ACP, 0, ip, -1, ipAnsi, 16, NULL, NULL); struct in_addr addr; // 尝试转换IP地址 return (inet_pton(AF_INET, ipAnsi, &addr) == 1); } INT_PTR CALLBACK Dialog_nine(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//IP输入框// { HANDLE hThread = NULL; switch (uMsg) { case WM_INITDIALOG: SetDlgItemText(hwndDlg, IDC_EDIT20, L"服务器IP"); return (INT_PTR)TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: WCHAR IP[16]; GetDlgItemText(hwndDlg, IDC_EDIT21, IP, 16);//获取IP地址,存储在IP数组里面// if (!IsValidIP(IP))//IP格式验证// { MessageBox(hwndDlg, L"IP格式错误", L"QQ", MB_ICONERROR); SetDlgItemText(hwndDlg, IDC_EDIT21, L"");//清除错误IP// SetFocus(GetDlgItem(hwndDlg, IDC_EDIT21)); return (INT_PTR)TRUE; } MessageBox(hwndDlg, L"IP格式正确", L"QQ", MB_ICONINFORMATION); // 禁用确定按钮,防止重复点击 EnableWindow(GetDlgItem(hwndDlg, IDOK), FALSE); //创建工作线程,执行网络连接// DWORD threadId; hThread = CreateThread( NULL, 0, [](LPVOID param)->DWORD { HWND hwnd = (HWND)param; g_clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建套接字// if (g_clientSocket == INVALID_SOCKET) { MessageBox(hwnd, L"创建套接字失败", L"QQ", MB_ICONERROR); return 1; } MessageBox(hwnd, L"创建套接字成功", L"QQ", MB_ICONINFORMATION); //设置服务器地址// sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(8080);//服务器端口// WCHAR IP[16]; GetDlgItemText(hwnd, IDC_EDIT21, IP, 16);//从对话框获取IP地址// char ipAnsi[16]; WideCharToMultiByte(CP_ACP, 0, IP, -1, ipAnsi, 16, NULL, NULL);//IP地址转化为char类型// inet_pton(AF_INET, ipAnsi, &serverAddr.sin_addr); if (connect(g_clientSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) //连接服务器// { int error = WSAGetLastError(); switch (error) { case WSAECONNREFUSED: MessageBox(hwnd, L"连接被拒绝", L"QQ", MB_ICONERROR); break; case WSAENETUNREACH: MessageBox(hwnd, L"网络不可达", L"QQ", MB_ICONERROR); break; case WSAEHOSTDOWN: MessageBox(hwnd, L"主机不可达", L"QQ", MB_ICONERROR); break; case WSAETIMEDOUT: MessageBox(hwnd, L"连接超时", L"QQ", MB_ICONERROR); break; default: MessageBox(hwnd, L"连接服务器失败", L"QQ", MB_ICONERROR); break; } closesocket(g_clientSocket); g_clientSocket = INVALID_SOCKET; PostMessage(hwnd, WM_CONNECT_FAILED, 0, 0); return 1; } g_isConnected = true; PostMessage(hwnd, WM_CONNECT_SUCCESS, 0, 0); return 0; }, hwndDlg, 0, &threadId ); if (hThread) { CloseHandle(hThread);//释放线程句柄// } return (INT_PTR)TRUE; case IDCANCEL: EndDialog(hwndDlg, IDCANCEL); return (INT_PTR)TRUE; }break; case WM_CONNECT_SUCCESS: { MessageBox(hwndDlg, L"服务器连接成功", L"QQ", MB_ICONINFORMATION); //发送字符// std::wstring msg = L"你好啊,世界!"; int bytesSent = send(g_clientSocket, (const char*)msg.c_str(), msg.size() * sizeof(wchar_t), 0); EndDialog(hwndDlg, IDOK); return (INT_PTR)TRUE; } case WM_CONNECT_FAILED: EnableWindow(GetDlgItem(hwndDlg, IDOK), TRUE); // 重新启用确定按钮 return (INT_PTR)TRUE; } return (INT_PTR)FALSE; } INT_PTR CALLBACK Dialog_ten(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//登录界面首页框// { switch (uMsg) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_EDIT22: EndDialog(hwndDlg, IDC_EDIT22); return (INT_PTR)TRUE; case IDC_EDIT23: EndDialog(hwndDlg, IDC_EDIT23); return (INT_PTR)TRUE; case IDC_EDIT24: EndDialog(hwndDlg, IDC_EDIT24); return (INT_PTR)TRUE; case IDC_EDIT25: EndDialog(hwndDlg, IDC_EDIT25); return (INT_PTR)TRUE; case IDC_EDIT26: EndDialog(hwndDlg, IDC_EDIT26); return (INT_PTR)TRUE; case IDCANCEL: EndDialog(hwndDlg, IDCANCEL); return (INT_PTR)TRUE; case IDC_EDIT43: EndDialog(hwndDlg, IDC_EDIT43); return (INT_PTR)TRUE; } } return (INT_PTR)FALSE; } INT_PTR CALLBACK Dialog_eleven(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//服务器对话框// { switch (uMsg) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: EndDialog(hwndDlg, IDOK); return (INT_PTR)TRUE; case IDCANCEL: EndDialog(hwndDlg, IDCANCEL); return (INT_PTR)TRUE; } } return (INT_PTR)FALSE; } INT_PTR CALLBACK Dialog_twelve(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//聊天室对话框// { switch (uMsg) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: EndDialog(hwndDlg, IDOK); return (INT_PTR)TRUE; case IDCANCEL: EndDialog(hwndDlg, IDCANCEL); return (INT_PTR)TRUE; } } return (INT_PTR)FALSE; } INT_PTR CALLBACK Dialog_thirdteen(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//好友列表框// { switch (uMsg) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: EndDialog(hwndDlg, IDOK); return (INT_PTR)TRUE; case IDCANCEL: EndDialog(hwndDlg, IDCANCEL); return (INT_PTR)TRUE; } } return (INT_PTR)FALSE; } INT_PTR CALLBACK Dialog_fourteen(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//登录后个人信息框// { switch (uMsg) { case WM_INITDIALOG: SetDlgItemText(hwndDlg, IDC_EDIT31, L"账号"); SetDlgItemText(hwndDlg, IDC_EDIT32, L"密码"); SetDlgItemText(hwndDlg, IDC_EDIT33, L"昵称"); SetDlgItemText(hwndDlg, IDC_EDIT34, L"性别"); SetDlgItemText(hwndDlg, IDC_EDIT35, L"年龄"); SetDlgItemText(hwndDlg, IDC_EDIT36, L"个性签名"); return (INT_PTR)TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: EndDialog(hwndDlg, IDOK); return (INT_PTR)TRUE; case IDCANCEL: EndDialog(hwndDlg, IDCANCEL); return (INT_PTR)TRUE; } } return (INT_PTR)FALSE; } //宽字符串文本发送函数// void send_wchar(WCHAR wstr[],int wchar_size,SOCKET socket) { int char_size = wchar_size * sizeof(WCHAR); //计算转换所需要的空间长度// int len = WideCharToMultiByte(CP_UTF8,0,wstr,wchar_size,NULL,0,NULL,NULL);//发送注册数据到客户端,使用UTF-8进行网络传输,它是国际通用的编码方式// char* target=new char[len];//存储格式转换后的文本// //实际转换// WideCharToMultiByte(CP_UTF8, 0, wstr, wchar_size, target, len, NULL, NULL); send(socket, target, len, 0); delete[]target; } int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE, LPSTR, int nCmdShow)//Winmain主函数// { int result_one=DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_ONE), NULL, Dialog_one); if (result_one == IDEND)//退出// //一级判断// { DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_END), NULL, Dialog_end);//退出框// } else if(result_one == IDOK)//一级判断// { WSADATA wsaData; int result = WSAStartup(MAKEWORD(2, 2), &wsaData); if (result) { MessageBox(NULL, L"Winsock初始化失败", L"QQ", MB_ICONERROR); WSACleanup(); } if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) { MessageBox(NULL, L"不支持Winsock2.2", L"QQ", MB_ICONERROR); WSACleanup(); } MessageBox(NULL, L"Winsock初始化成功", L"QQ", MB_ICONINFORMATION); INT_PTR result_nine = DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_NINE), NULL, Dialog_nine);//IP输入框// if (result_nine == IDCANCEL)//退出// //二级判断// { DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_END), NULL, Dialog_end);//退出框// } else if (result_nine == IDOK)//二级判断// { door_one: INT_PTR result_two = DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_TWO), NULL, Dialog_two);//登录和注册选择框// if (result_two == IDLOGIN)//登录// //三级判断// { INT_PTR result_three = DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_THREE), NULL, Dialog_three);//登录对话框(需账号和密码验证)// if (result_three == IDOK) //四级判断// { door_two: int result_ten = DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_TEN), NULL, Dialog_ten);//登陆界面首页框// int result_fifteen = 0; int result_eleven = 0; int result_twelve = 0; int result_thirdteen = 0; int result_fourteen= 0; switch (result_ten) { case IDC_EDIT22: result_twelve=DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_TWELVE), NULL, Dialog_twelve);//聊天室对话框// switch (result_twelve) { case IDOK: MessageBox(NULL, L"还未开发", L"QQ", MB_ICONINFORMATION); break; case IDCANCEL: goto door_two;//登陆界面首页框// break; }break; case IDC_EDIT23: result_thirdteen=DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_THIRDTEEN), NULL, Dialog_thirdteen);//好友框// switch (result_thirdteen) { case IDOK: MessageBox(NULL, L"还未开发", L"QQ", MB_ICONINFORMATION); break; case IDCANCEL: goto door_two;//登陆界面首页框// break; }break; case IDC_EDIT24: result_fourteen=DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_FOURTEEN), NULL, Dialog_fourteen);//个人信息框// switch (result_fourteen) { case IDOK: MessageBox(NULL, L"还未开发", L"QQ", MB_ICONINFORMATION); break; case IDCANCEL: goto door_two;//登陆界面首页框// break; }break; case IDC_EDIT25: result_fifteen=DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_EIGHT), NULL, Dialog_eight);//更换头像框// switch (result_fifteen) { case IDOK: MessageBox(NULL, L"还未开发", L"QQ", MB_ICONINFORMATION); break; case IDCANCEL: goto door_two;//登陆界面首页框// break; }break; case IDC_EDIT26: result_eleven=DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_ELEVEN), NULL, Dialog_eleven);//服务器框// switch (result_eleven) { case IDOK: MessageBox(NULL, L"还未开发", L"QQ", MB_ICONINFORMATION); break; case IDCANCEL: goto door_two;//登陆界面首页框// break; }break; case IDCANCEL: DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_END), NULL, Dialog_end);//退出框// break; case IDC_EDIT43: goto door_one;//登陆界面首页框// break; } } else if (result_three == IDCANCEL)//四级判断// { goto door_one;//登录和注册选择框// } } else if (result_two == IDREGISTER)//注册// //三级判断// { door_three: INT_PTR result_four = DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_FOUR), NULL, Dialog_four);//注册对话框// if (result_four == IDGOON)//四级判断// { door_four: INT_PTR result_five = DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_FIVE), NULL, Dialog_five);//密码设置框// { if (result_five == IDFINISH)//五级判断// { door_five: int result_seven=DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_SEVEN), NULL, Dialog_seven);//个人信息框// if (result_seven==IDCANCEL)//六级判断// { goto door_four; } else if (result_seven == IDOK)//六级判断// { door_six: int result_eight=DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_EIGHT), NULL, Dialog_eight);//头像上传框// if (result_eight == IDCANCEL)//七级判断// { goto door_five; } else if (result_eight == IDOK)//七级判断// { INT_PTR result_six = DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_SIX), NULL, Dialog_six);//注册成功框// if (result_six == IDOK)//八级判断// { //获取数组大小// int g_szAccount_len = sizeof(g_szAccount)*sizeof(WCHAR); int g_szPassword_len = sizeof(g_szPassword)*sizeof(WCHAR); int g_szNickname_len = sizeof(g_szNickname)*sizeof(WCHAR); int g_szGender_len = sizeof(g_szGender)*sizeof(WCHAR); int g_szAge_len = sizeof(g_szAge)*sizeof(WCHAR); int g_szSignature_len = sizeof(g_szSignature)*sizeof(WCHAR); //开始发送// send_wchar(g_szAccount,g_szAccount_len,g_clientSocket);//账号// send_wchar(g_szPassword,g_szPassword_len,g_clientSocket);//密码// send_wchar(g_szNickname,g_szNickname_len,g_clientSocket);//昵称// send_wchar(g_szGender,g_szGender_len, g_clientSocket);//性别// send_wchar(g_szAge,g_szAge_len, g_clientSocket);//年龄// send_wchar(g_szSignature,g_szSignature_len,g_clientSocket);//个性签名// //send(g_clientSocket, (char*)g_pImageData, g_dwImageSize, 0);//头像// /* send(g_clientSocket, (const char*)g_szAccount, g_szAccount_len, 0);//账号// send(g_clientSocket, (const char*)g_szPassword, g_szPassword_len, 0);//密码// send(g_clientSocket, (const char*)g_szNickname, g_szNickname_len, 0);//昵称// send(g_clientSocket, (const char*)g_szGender, g_szGender_len, 0);//性别// send(g_clientSocket, (const char*)g_szAge, g_szAge_len, 0);//年龄// send(g_clientSocket, (const char*)g_szSignature, g_szSignature_len, 0);//个性签名// */ MessageBox(NULL, L"已将您的注册数据保存到服务器", L"QQ", MB_ICONINFORMATION); goto door_one;//返回登录和注册选择框// } else if (IDCANCEL)//八级判断// { goto door_six; } } } } else if (result_five == IDCANCEL)//五级判断// { goto door_three;//注册对话框// } } } else if (result_four == IDCANCEL)//四级判断// { goto door_one;//返回登录和注册选择框// } } else if (result_two == IDCANCEL)//退出// //三级判断// { DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_END), NULL, Dialog_end);//退出框// } } } return 0; }服务器接收昵称等仍为乱码的
07-11
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值