#include<winsock2.h>
#include<ws2tcpip.h>
#include<windows.h>
#include<thread>
#include<queue>
#include"resource.h"
#pragma comment(lib,"ws2_32.lib")
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秒//
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);//释放位图资源//
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;
}
HWND g_hInfoDialog = NULL;//对话框句柄//
std::queue<std::wstring>g_msgQueue;//消息队列//
CRITICAL_SECTION g_csMsgQueue;//线程同步锁//
//消息更新函数//
void UpdateDialogContent(HWND hwndDlg)
{
EnterCriticalSection(&g_csMsgQueue);//加锁//
if (!g_msgQueue.empty())//队列非空//
{
std::wstring msg = g_msgQueue.front();//取队首元素//
g_msgQueue.pop();//将队首元素弹出//
SetDlgItemText(hwndDlg, IDC_INFORMATION, msg.c_str());//更新消息//
}
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;
return (INT_PTR)TRUE;
}
}
return (INT_PTR)FALSE;
}
void HandleClient(SOCKET client_server)
{
WCHAR received[36];
int x = 0;
while(true)
{
int rec = recv(client_server, (char*)received, sizeof(received) - sizeof(WCHAR), 0);
if (rec <= 0)
{
break;
}
received[rec/sizeof(WCHAR)] = L'\0';
EnterCriticalSection(&g_csMsgQueue);//加锁//
g_msgQueue.push(std::wstring(received));//创建副本//
LeaveCriticalSection(&g_csMsgQueue);//解锁//
if (x == 0)
{
MessageBox(NULL, L"服务器已成功接收来自客户端的信息", L"QQ", MB_ICONINFORMATION);//只提示一次//
x = 1;
}
if(g_hInfoDialog == NULL)//创建消息对话框//
{
g_hInfoDialog = CreateDialog(
GetModuleHandle(NULL),
MAKEINTRESOURCE(IDD_MYDIALOG_INFORMATION),
NULL,
Dialog_information
);
ShowWindow(g_hInfoDialog, SW_SHOW);
PostMessage(g_hInfoDialog, WM_APP_UPDATE_MSG, 0, 0);
}
else
{
//通知现有对话框更新内容//
PostMessage(g_hInfoDialog, WM_APP_UPDATE_MSG, 0, 0);
}
}
MessageBox(NULL, L"服务器已无法接收来自客户端的信息", L"QQ", MB_ICONERROR);
closesocket(client_server);
}
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);
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);//开始监听//
while (true)
{
SOCKET client_server = accept(server_socket, NULL, NULL);//创建新的套接字//
if (client_server == INVALID_SOCKET)
{
MessageBox(NULL, L"无法创建新的套接字与客户端进行通信", L"QQ", MB_ICONINFORMATION);
continue;
}
MessageBox(NULL, L"成功创建新的套接字与客户端进行通信", L"QQ", MB_ICONINFORMATION);
std::thread(HandleClient, client_server).detach();//创建线程//
}
}
else if (result_one == IDEND)//一级判断//
{
DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_END), NULL, Dialog_end);//结束框//
}
}
为什么能弹出消息框,但是无法响应,无法加载出内容?