HelloWin
1 /*
2 HELLOWIN.C -- Displays "Hello, Windows 98!" in client area
3 (c) Louis Lu, 2008
4 */
5
6 #include <windows.h>
7
8 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
9
10 // 程序入口函数,主函数
11 // HINSTANCE 执行实体(程序自身)句柄
12 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
13 {
14 static TCHAR szAppName[] = TEXT("HelloWin");
15 HWND hwnd; //窗口句柄
16 MSG msg; //消息结构
17 WNDCLASS wndclass; //窗口类别结构
18
19 wndclass.style = CS_HREDRAW | CS_VREDRAW; //窗口类别样式
20 wndclass.lpfnWndProc = WndProc; //窗口类别的消息处理程序
21 wndclass.cbClsExtra = 0; //窗口类别结构预留额外空间
22 wndclass.cbWndExtra = 0; //窗口结构中预留额外空间
23 wndclass.hInstance = hInstance; //程序的执行实体句柄(WinMain的参数之一)
24 // LoadIcon 加载图标供程序使用
25 wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); //图标(显示在窗口标题列的左端)
26 // LoadCursor 加载鼠标光标供程序使用
27 wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); //鼠标光标
28 // GetStockObject 取得一个图形对象
29 wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //设置窗口背景颜色
30 wndclass.lpszMenuName = NULL; //指定窗口类别菜单,NULL表示没有应用程序菜单
31 wndclass.lpszClassName = szAppName; //必须给出一个类别名称,对于小程序,类别名称可以与程序名相同
32
33 if (!RegisterClass(&wndclass)) //为程序窗口注册窗口类别
34 {
35 MessageBox(NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR);
36
37 return 0;
38 }
39
40 //根据窗口类别建立一个窗口
41 hwnd = CreateWindow(szAppName, // window class name
42 TEXT("The Hello Program"), // window caption
43 WS_OVERLAPPEDWINDOW, // window style
44 CW_USEDEFAULT, // initial x position
45 CW_USEDEFAULT, // initial y position
46 CW_USEDEFAULT, // initial x size
47 CW_USEDEFAULT, // initial y size
48 NULL, // parent window handle
49 NULL, // window menu handle
50 hInstance, // program instance handle
51 NULL); // creation parameters
52
53 //在屏幕上显示窗口
54 ShowWindow(hwnd, iCmdShow); // hwnd,窗口句柄;iCmdShow,确定如何在屏幕上显示窗口,是一般大小,最小化还是最大化。
55 //指示窗口自我更新
56 UpdateWindow(hwnd); //重绘显示区域,它经由发送给窗口消息处理程序一个WM_PAINT做到这一点。
57
58
59 // Windows为当前执行的每个Windows程序维护一个‘消息队列’。在发生输入事件之后,
60 // Windows将事件转换为一个‘消息’,并将消息放入程序的消息队列中。
61 // 程序通过执行一块称之为‘消息循环’的程序代码从消息队列中取出消息。
62 while(GetMessage(&msg, NULL, 0, 0)) //从消息队列中取得消息
63 {
64 TranslateMessage(&msg); // 将msg结构传给Windows,进行一些键盘转换。
65 DispatchMessage(&msg); // 又将msg结构传给Windows,然后,Windows将该消息发送给适当的窗口消息处理程序,让它进行处理。也就是说,Windows将呼叫窗口消息处理程序。
66 }
67
68 //wParam是传递给PostQuitMessage函数的值(通常是0)。
69 return msg.wParam;
70 }
71
72
73 // 窗口消息处理函数
74 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
75 {
76 HDC hdc; //设备内容句柄
77 PAINTSTRUCT ps; //绘图信息结构,Windows为每个设备保存一个。
78 RECT rect; //矩形结构
79
80 switch(message)
81 {
82 case WM_CREATE:
83 PlaySound(TEXT("hellowin.wav"), NULL, SND_FILENAME|SND_ASYNC); //播放一个声音文件
84 return 0;
85
86 case WM_PAINT:
87 //取得设备内容句柄
88 hdc = BeginPaint(hwnd, &ps); //开始绘制窗口
89 GetClientRect(hwnd, &rect); //取得窗口显示区域的大小
90 //hdc:BeginPaint传出来的设备内容句柄
91 //TEXT(''):要输出的文字
92 //-1:指示字符串是以字节0终结的
93 //最后一个参数:旗标,控制文字显示的位置。
94 DrawText(hdc, TEXT("Hello, Windows 98!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); //显示字符串
95 //释放设备内容句柄
96 EndPaint(hwnd, &ps); //结束绘制窗口
97 return 0;
98
99 case WM_DESTROY: //关闭窗口,该消息是使用者单击Close按钮或者在程序的系统菜单上选择Close时发生的。
100 PostQuitMessage(0); //在消息队列中插入一个[退出程序]/WM_QUIT消息,当GetMessage得到一个WM_QUIT消息时,它传回0,这将导致WinMain退出消息循环,并终止程序。
101 return 0;
102 }
103
104 //执行内定的消息处理
105 return DefWindowProc(hwnd, message, wParam, lParam);
106 }
1 /*
2 HELLOWIN.C -- Displays "Hello, Windows 98!" in client area
3 (c) Louis Lu, 2008
4 */
5
6 #include <windows.h>
7
8 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
9
10 // 程序入口函数,主函数
11 // HINSTANCE 执行实体(程序自身)句柄
12 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
13 {
14 static TCHAR szAppName[] = TEXT("HelloWin");
15 HWND hwnd; //窗口句柄
16 MSG msg; //消息结构
17 WNDCLASS wndclass; //窗口类别结构
18
19 wndclass.style = CS_HREDRAW | CS_VREDRAW; //窗口类别样式
20 wndclass.lpfnWndProc = WndProc; //窗口类别的消息处理程序
21 wndclass.cbClsExtra = 0; //窗口类别结构预留额外空间
22 wndclass.cbWndExtra = 0; //窗口结构中预留额外空间
23 wndclass.hInstance = hInstance; //程序的执行实体句柄(WinMain的参数之一)
24 // LoadIcon 加载图标供程序使用
25 wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); //图标(显示在窗口标题列的左端)
26 // LoadCursor 加载鼠标光标供程序使用
27 wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); //鼠标光标
28 // GetStockObject 取得一个图形对象
29 wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //设置窗口背景颜色
30 wndclass.lpszMenuName = NULL; //指定窗口类别菜单,NULL表示没有应用程序菜单
31 wndclass.lpszClassName = szAppName; //必须给出一个类别名称,对于小程序,类别名称可以与程序名相同
32
33 if (!RegisterClass(&wndclass)) //为程序窗口注册窗口类别
34 {
35 MessageBox(NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR);
36
37 return 0;
38 }
39
40 //根据窗口类别建立一个窗口
41 hwnd = CreateWindow(szAppName, // window class name
42 TEXT("The Hello Program"), // window caption
43 WS_OVERLAPPEDWINDOW, // window style
44 CW_USEDEFAULT, // initial x position
45 CW_USEDEFAULT, // initial y position
46 CW_USEDEFAULT, // initial x size
47 CW_USEDEFAULT, // initial y size
48 NULL, // parent window handle
49 NULL, // window menu handle
50 hInstance, // program instance handle
51 NULL); // creation parameters
52
53 //在屏幕上显示窗口
54 ShowWindow(hwnd, iCmdShow); // hwnd,窗口句柄;iCmdShow,确定如何在屏幕上显示窗口,是一般大小,最小化还是最大化。
55 //指示窗口自我更新
56 UpdateWindow(hwnd); //重绘显示区域,它经由发送给窗口消息处理程序一个WM_PAINT做到这一点。
57
58
59 // Windows为当前执行的每个Windows程序维护一个‘消息队列’。在发生输入事件之后,
60 // Windows将事件转换为一个‘消息’,并将消息放入程序的消息队列中。
61 // 程序通过执行一块称之为‘消息循环’的程序代码从消息队列中取出消息。
62 while(GetMessage(&msg, NULL, 0, 0)) //从消息队列中取得消息
63 {
64 TranslateMessage(&msg); // 将msg结构传给Windows,进行一些键盘转换。
65 DispatchMessage(&msg); // 又将msg结构传给Windows,然后,Windows将该消息发送给适当的窗口消息处理程序,让它进行处理。也就是说,Windows将呼叫窗口消息处理程序。
66 }
67
68 //wParam是传递给PostQuitMessage函数的值(通常是0)。
69 return msg.wParam;
70 }
71
72
73 // 窗口消息处理函数
74 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
75 {
76 HDC hdc; //设备内容句柄
77 PAINTSTRUCT ps; //绘图信息结构,Windows为每个设备保存一个。
78 RECT rect; //矩形结构
79
80 switch(message)
81 {
82 case WM_CREATE:
83 PlaySound(TEXT("hellowin.wav"), NULL, SND_FILENAME|SND_ASYNC); //播放一个声音文件
84 return 0;
85
86 case WM_PAINT:
87 //取得设备内容句柄
88 hdc = BeginPaint(hwnd, &ps); //开始绘制窗口
89 GetClientRect(hwnd, &rect); //取得窗口显示区域的大小
90 //hdc:BeginPaint传出来的设备内容句柄
91 //TEXT(''):要输出的文字
92 //-1:指示字符串是以字节0终结的
93 //最后一个参数:旗标,控制文字显示的位置。
94 DrawText(hdc, TEXT("Hello, Windows 98!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); //显示字符串
95 //释放设备内容句柄
96 EndPaint(hwnd, &ps); //结束绘制窗口
97 return 0;
98
99 case WM_DESTROY: //关闭窗口,该消息是使用者单击Close按钮或者在程序的系统菜单上选择Close时发生的。
100 PostQuitMessage(0); //在消息队列中插入一个[退出程序]/WM_QUIT消息,当GetMessage得到一个WM_QUIT消息时,它传回0,这将导致WinMain退出消息循环,并终止程序。
101 return 0;
102 }
103
104 //执行内定的消息处理
105 return DefWindowProc(hwnd, message, wParam, lParam);
106 }