很多学习C语言使用的是Turbo C,但是现在已经是桌面程序的天下了。虽然有时候命令符程序也比较好用,但是学习怎么开发窗口应用程序还是必要的。在前面的一篇博客中你可以学习如何使用C语言编写一个简单的windows下的窗口程序。

今天大笨兔带给大家的是一个windows游戏编程的窗口模板代码,代码如下:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include <windows.h>
#define WINDOW_CLASS_NAME "win32api"
#define WINDOW_WIDTH 500
#define WINDOW_HEIGHT 500
//检测按键状态
#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
#define KEYUP(vk_code)   ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)
/* 窗口过程 */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
HWND main_window_handle = NULL; //保存窗口句柄的全局变量
HINSTANCE hinstance_app = NULL; //保存程序实例句柄的全局变量
HDC global_hdc = NULL;           //保存窗口 hdc 的全局变量
int WINAPI
WinMain (HINSTANCE hinstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nFunsterStil)
{
HWND hwnd;               /* 窗口句柄 */
MSG messages;             /* 保存窗口消息 */
WNDCLASSEX wincl;         /* 窗口类 */
/* 要注册窗口类的信息 */
wincl.hInstance = hinstance;
wincl.lpszClassName = WINDOW_CLASS_NAME;
wincl.lpfnWndProc = WindowProcedure;       /* 窗口过程名字 */
wincl.style = CS_DBLCLKS | CS_OWNDC |
CS_HREDRAW | CS_VREDRAW;                 /* 窗口风格 */
wincl.cbSize = sizeof (WNDCLASSEX);
/* 使用默认的icon和鼠标光标 */
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL;                 /* 没有菜单 */
wincl.cbClsExtra = 0;
wincl.cbWndExtra = 0;
/* 窗口的背景为黑色 */
wincl.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
/* 注册窗口类 */
if (!RegisterClassEx (&wincl))
return 0;
/* 注册完窗口类后创建一个窗口 hwnd保存窗口句柄 */
hwnd = CreateWindowEx (
0,                   /* Extended possibilites for variation */
WINDOW_CLASS_NAME,         /* 窗口类名字 */
"windows游戏编程模板 大笨兔博客--C语言学习交流专业博客" ,       /* 窗口标题 */
WS_OVERLAPPEDWINDOW | WS_VISIBLE, /* 程序运行就激活窗口 */
0,
0,       /* 窗口相对于桌面的位置 */
WINDOW_WIDTH,
WINDOW_HEIGHT,                 /* 窗口高与宽 */
HWND_DESKTOP,
NULL,                 /* 没有菜单 */
hinstance,
NULL
);
/* 保存窗口句柄与程序实例句柄到全局变量 */
main_window_handle = hwnd;
hinstance_app = hinstance;
/* 游戏初始化的工作 */
/* 消息循环 */
while (TRUE){
if (PeekMessage (&messages, NULL, 0, 0,PM_REMOVE))
{
//检测到退出消息
if (WM_QUIT == messages.message)
break ;
TranslateMessage(&messages);
/* Send message to WindowProcedure */
DispatchMessage(&messages);
}
/*
** 游戏主循环
** 你可以执行动画、逻辑等等操作
*/
}
/* 游戏结束的工作 */
/* 程序返回 */
return messages.wParam;
}
/*事件处理函数*/
LRESULT CALLBACK
WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
RECT rt;
char szHello[]= "Hello, C-Free!" ;
switch (message)
{
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
EndPaint(hwnd, &ps);
break ;
case WM_DESTROY:
PostQuitMessage (0);
break ;
default :
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}

程序的运行效果如下:

windows游戏编程模板

windows游戏编程模板

程序和普通的win32窗口程序差不多,但是在处理消息循环中使用的不是GetMessage,而换成了PeekMessage函数.你可以在程序的消息循环中处理游戏的动画、逻辑等等。在消息循环前处理游戏初始化的操作,在消息循环结束后处理资源回收的工作。

这个游戏框架对于C语言开发windows下的小游戏,还是非常好用的。希望对你有用。
:)

参考资料:《windows游戏编程大师技巧》
(全文完)

若非注明,均为原创文章,转载请注明: 转载自大笨兔

本文链接地址:C语言小程序:Windows窗口游戏编程模板