1 //GameServer.cpp: 定义应用程序的入口点。
2 //
3
4 #include "stdafx.h"
5 #include "GameServer.h"
6
7 #define MAX_LOADSTRING 100
8
9 // 全局变量:
10 HINSTANCE hInst; // 当前实例
11 WCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
12 WCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名
13
14 // 此代码模块中包含的函数的前向声明:
15 ATOM MyRegisterClass(HINSTANCE hInstance);
16 BOOL InitInstance(HINSTANCE, int);
17 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
18 INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
19
20 int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
21 _In_opt_ HINSTANCE hPrevInstance,
22 _In_ LPWSTR lpCmdLine,
23 _In_ int nCmdShow)
24 {
25 UNREFERENCED_PARAMETER(hPrevInstance);
26 UNREFERENCED_PARAMETER(lpCmdLine);
27
28 // TODO: 在此放置代码。
29
30 // 初始化全局字符串
31 LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
32 LoadStringW(hInstance, IDC_GAMESERVER, szWindowClass, MAX_LOADSTRING);
33 MyRegisterClass(hInstance);
34
35 // 执行应用程序初始化:
36 if (!InitInstance (hInstance, nCmdShow))
37 {
38 return FALSE;
39 }
40
41 HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_GAMESERVER));
42
43 MSG msg;
44
45 // 主消息循环:
46 while (GetMessage(&msg, nullptr, 0, 0))
47 {
48 if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
49 {
50 TranslateMessage(&msg);
51 DispatchMessage(&msg);
52 }
53 }
54
55 return (int) msg.wParam;
56 }
57
58
59
60 //
61 // 函数: MyRegisterClass()
62 //
63 // 目的: 注册窗口类。
64 //
65 ATOM MyRegisterClass(HINSTANCE hInstance)
66 {
67 WNDCLASSEXW wcex;
68
69 wcex.cbSize = sizeof(WNDCLASSEX);
70
71 wcex.style = CS_HREDRAW | CS_VREDRAW;//从这个窗口类派生的窗口具有的风格
72 wcex.lpfnWndProc = WndProc;//窗口处理函数的指针, 处理主窗口的消息
73 wcex.cbClsExtra = 0;//指定紧跟在窗口类结构后的附加字节数。
74 wcex.cbWndExtra = 0;
75 wcex.hInstance = hInstance;//本模块的实例句柄。
76 wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_GAMESERVER));
77 wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);//光标的句柄
78 wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
79 wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_GAMESERVER);//指向菜单的指针
80 wcex.lpszClassName = szWindowClass;//指向类名称的指针
81 wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));//和窗口类关联的小图标。如果该值为NULL。则把hIcon中的图标转换成大小合适的小图标
82
83 return RegisterClassExW(&wcex);
84 }
85
86 //
87 // 函数: InitInstance(HINSTANCE, int)
88 //
89 // 目的: 保存实例句柄并创建主窗口
90 //
91 // 注释:
92 //
93 // 在此函数中,我们在全局变量中保存实例句柄并
94 // 创建和显示主程序窗口。
95 //
96 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
97 {
98 hInst = hInstance; // 将实例句柄存储在全局变量中
99
100 HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
101 CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);
102
103 if (!hWnd)
104 {
105 return FALSE;
106 }
107
108 ShowWindow(hWnd, nCmdShow);
109 UpdateWindow(hWnd);
110
111 return TRUE;
112 }
113
114 //
115 // 函数: WndProc(HWND, UINT, WPARAM, LPARAM)
116 //
117 // 目的: 处理主窗口的消息。
118 //
119 // WM_COMMAND - 处理应用程序菜单
120 // WM_PAINT - 绘制主窗口
121 // WM_DESTROY - 发送退出消息并返回
122 //
123 //
124 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
125 {
126 switch (message)
127 {
128 case WM_COMMAND:
129 {
130 int wmId = LOWORD(wParam);
131 // 分析菜单选择:
132 switch (wmId)
133 {
134 case IDM_ABOUT:
135 DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
136 break;
137 case IDM_EXIT:
138 DestroyWindow(hWnd);
139 break;
140 default:
141 return DefWindowProc(hWnd, message, wParam, lParam);
142 }
143 }
144 break;
145 case WM_PAINT:
146 {
147 PAINTSTRUCT ps;
148 HDC hdc = BeginPaint(hWnd, &ps);
149 // TODO: 在此处添加使用 hdc 的任何绘图代码...
150 EndPaint(hWnd, &ps);
151 }
152 break;
153 case WM_DESTROY:
154
155 // 退出程序 窗口销毁后(调用DestroyWindow()后),消息队列得到的消息。
156
157 PostQuitMessage(0);
158 break;
159 default:
160
161 // hWnd 指向接收消息的窗口过程的句柄。
162 // Msg:指定消息类型
163 // wParam:指定其余的、消息特定的信息。该参数的内容与Msg参数值有关
164 // IParam:指定其余的、消息特定的信息。该参数的内容与Msg参数值有关
165 // 返回值:返回值就是消息处理结果,它与发送的消息有关。
166 // 当 DefWindowProc 处理 WM_DESTROY 消息时,它不自动调用 PostQuitMessage
167 return DefWindowProc(hWnd, message, wParam, lParam);
168 }
169 return 0;
170 }
171
172 // “关于”框的消息处理程序。
173 INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
174 {
175 UNREFERENCED_PARAMETER(lParam);
176 switch (message)
177 {
178 case WM_INITDIALOG:
179 return (INT_PTR)TRUE;
180
181 case WM_COMMAND:
182 if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
183 {
184 EndDialog(hDlg, LOWORD(wParam));
185 return (INT_PTR)TRUE;
186 }
187 break;
188 }
189 return (INT_PTR)FALSE;
190 }