好吧,废话少说,开始我们win32游戏编程,期待我们能够创造出赏心悦目的游戏。
首先,打开vs2010创建如下工程:
加上如下代码:
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <windowsx.h>
//程序入口
int WINAPI WinMain(HINSTANCE hinstance,//应用程序当前事例的句柄
HINSTANCE hprevinstance,//应用程序的前事例的句柄。对于一个32的位程序,该参数总为NULL
LPSTR lpcmdline,//指向应用程序命令行的空字符串的指针,不包括函数名。获得整个命令行,参看GetCommandLine
int ncmdshow//指明窗口如何显示
)
{
//显示消息框
MessageBox(
NULL, //标识将被创建的消息框的拥有窗口。如果此参数为NULL,则消息框没有拥有窗口
"哥的第一个窗口程序!!!",//消息框显示的文本信息
"MY FIRST WINDOWS PROGRAM",//标题
MB_OK | MB_ICONEXCLAMATION//决定显示哪种信息框
);
//退出
return(0);
}
。
好了,开始运行吧!看看什么效果,如果出现了这个东东:
那就说明,你的环境没有问题了,可以继续我们下面的工作了,如果没有出现(找美丽的度娘吧!)。
做个简单的说明:WinMain是win32操作系统调用我们编写的程序的入口,MessageBox是显示消息框的函数,具体函数的入参、返回值和定义位置,可以查询winAPI文档,(如果没有找度娘。)
显然,这么弱智的东西,没什么好说的,下面为我们要编写的游戏做些准备吧!我需要一个窗口来展现游戏画面:
第一步:创建窗体信息结构体(我坚信你的C语言相当棒),
WNDCLASSEX winclass;//声明窗体信息结构体
WNDCLASSEX的定义如下所示:
typedef struct tagWNDCLASSEXA {
UINT cbSize;
/* Win 3.x */
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCSTR lpszMenuName;
LPCSTR lpszClassName;
/* Win 4.0 */
HICON hIconSm;
} WNDCLASSEXA, *PWNDCLASSEXA, NEAR *NPWNDCLASSEXA, FAR *LPWNDCLASSEXA;
,下面我来逐项赋值并解释其含义。
winclass.cbSize=sizeof(WNDCLASSEX);//计算结构体大小
winclass.style=CS_VREDRAW|CS_HREDRAW;//设置窗口风格,宽和高改变时刷新窗口
winclass.lpfnWndProc=NULL;//指向时间句柄的函数指针,基本上都是响应某个操作的回调函数(是我们自己定义的函数),这里设为空
//下面两个字段原本是为了指示windows将附加的运行时间告诉系统的,大多数人都设为0
winclass.cbClsExtra=0;
winclass.cbWndExtra=0;
winclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//设置窗体图标
winclass.hCursor=LoadCursor(NULL,IDC_ARROW);//设置光标
winclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//获取系统画刷、画笔、调色板或字体的一个句柄
winclass.lpszClassName=NULL;//菜单资源,以后再作解释
winclass.lpszMenuName="WINCLASS_MY";//为自己创建的结构体赋别名,将来用它可以来引用该结构体
winclass.hIconSm=LoadIcon(NULL,IDI_APPLICATION);//应用程序图标
至此,结构体创建完毕。
第二步:注册windows结构体
//注册结构体
RegisterClassEx(&winclass);
第三步:创建窗口
//创建窗口
HWND hwnd=NULL;
if(!(hwnd==CreateWindowEx(
NULL,
"WINCLASS_MY",
"哥的第一个窗口",
WS_OVERLAPPEDWINDOW|WS_VISIBLE,
0,
0,
400,
400,
NULL,
NULL,
hinstance,
NULL
))){
return(0);
}
至此,是不是可以运行程序得到窗体了哪?事实上是不可以的!
windows操作系统是基于消息事件机制的,还记得winclass.lpfnWndProc=NULL;这个属性吗?现在我们要给我们创建的窗体程序设置回调函数:
第四步:窗体程序设置回调函数
//系统进程回调函数
LRESULT CALLBACK WindowProc(HWND hwnd,
UINT msg,
WPARAM wparam,
LPARAM lparam)
{
PAINTSTRUCT ps;//图形绘制结构体
HDC hdc;//句柄
switch(msg)
{
case WM_CREATE: //窗口创建时
{
return(0);
} break;
case WM_PAINT: //窗口重绘时
{
hdc = BeginPaint(hwnd,&ps); //开始绘制
EndPaint(hwnd,&ps);//结束绘制
return(0);
} break;
case WM_DESTROY://窗口销毁时
{
PostQuitMessage(0);
return(0);
} break;
default:break;
}
//将消息队列中 不属于该进程的消息发送给系统进程
return (DefWindowProc(hwnd, msg, wparam, lparam));
}
第五步:处理事件消息:
if(NULL==hwnd){
return(0);
}
//循环处理消息
while(TRUE)
{//获取消息
if (GetMessage(&msg,NULL,0,0))
{
//
if (msg.message == WM_QUIT)
break;
//转换消息
TranslateMessage(&msg);
//发送消息给系统
DispatchMessage(&msg);
}
}
return(msg.wParam);
好了,现在可以编译,并运行程序了,出现窗口了吧!
最后给您贴上完整的程序:
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <windowsx.h>
#include <stdio.h>
#include <math.h>
#define WINDOW_CLASS_NAME "MY_CLASS"
//系统进程回调函数
LRESULT CALLBACK WindowProc(HWND hwnd,
UINT msg,
WPARAM wparam,
LPARAM lparam)
{
PAINTSTRUCT ps;//图形绘制结构体
HDC hdc;//句柄
switch(msg)
{
case WM_CREATE: //窗口创建时
{
return(0);
} break;
case WM_PAINT: //窗口重绘时
{
hdc = BeginPaint(hwnd,&ps); //开始绘制
EndPaint(hwnd,&ps);//结束绘制
return(0);
} break;
case WM_DESTROY://窗口销毁时
{
PostQuitMessage(0);
return(0);
} break;
default:break;
}
//将消息队列中 不属于该进程的消息发送给系统进程
return (DefWindowProc(hwnd, msg, wparam, lparam));
}
//程序入口
int WINAPI WinMain(HINSTANCE hinstance,//应用程序当前事例的句柄
HINSTANCE hprevinstance,//应用程序的前事例的句柄。对于一个32的位程序,该参数总为NULL
LPSTR lpcmdline,//指向应用程序命令行的空字符串的指针,不包括函数名。获得整个命令行,参看GetCommandLine
int ncmdshow//指明窗口如何显示
)
{
WNDCLASSEX winclass;//声明窗体信息结构体
HWND hwnd=NULL;
MSG msg;
winclass.cbSize=sizeof(WNDCLASSEX);//计算结构体大小
winclass.style=CS_DBLCLKS | CS_OWNDC;//设置窗口风格,宽和高改变时刷新窗口
winclass.lpfnWndProc=WindowProc;//指向时间句柄的函数指针,基本上都是响应某个操作的回调函数(是我们自己定义的函数),这里设为空。
//下面两个字段原本是为了指示windows将附加的运行时间告诉系统的,大多数人都设为0
winclass.cbClsExtra=0;
winclass.cbWndExtra=0;
winclass.hInstance=hinstance;//系统传给winmain函数的句柄
winclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//设置窗体图标
winclass.hCursor=LoadCursor(NULL,IDC_ARROW);//设置光标
winclass.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);//获取系统画刷、画笔、调色板或字体的一个句柄。
winclass.lpszClassName=WINDOW_CLASS_NAME;//为自己创建的结构体赋别名,将来用它可以来引用该结构体
winclass.lpszMenuName=NULL;//菜单资源,以后再作解释
winclass.hIconSm=LoadIcon(NULL,IDI_APPLICATION);//应用程序图标
//注册结构体
if(!RegisterClassEx(&winclass)){
return(0);
}
//创建窗口
hwnd=CreateWindowEx(
NULL,
WINDOW_CLASS_NAME,
"哥的第一个窗口",
WS_OVERLAPPEDWINDOW|WS_VISIBLE,
0,
0,
400,
400,
NULL,
NULL,
hinstance,
NULL
);
if(NULL==hwnd){
return(0);
}
//循环处理消息
while(TRUE)
{//获取消息
if (GetMessage(&msg,NULL,0,0))
{
//
if (msg.message == WM_QUIT)
break;
//转换消息
TranslateMessage(&msg);
//发送消息给系统
DispatchMessage(&msg);
}
}
return(msg.wParam);
}
- 大小: 45.8 KB
- 大小: 9.8 KB
分享到:
相关推荐
C_C++语言硬件程序设计——基于TMS320C5000系列DSP
1. 熟悉 C/C++ 的人员 2. 正在做关于 Qt 可视化却无从下手的人员 3. 希望做一个小项目,但没有合适的框架的人员 我主要能学到什么: 1. 该项目包含 鼠标点击响应与绘图相关的算法 2. 该项目包含 创建、删除、编辑 ...
——代码完成于2021-11-12 整体思路: 用两个数组分别模拟 A->B 和B->A间通讯的信道。A、B两主机各自拥有独立线程。线程move用来模拟信道中信号的移动。线程show用于打印信道。其中线程move和show detach()后作为...
c/c++完整视频教程(三)——–Linux服务器编程
C语言C++零基础到实战——大新企业内部技术免费公开课文档.doc
第一个c++程序(csdn)————程序
本程序是采用带头结点的单向循环链表写成的,当指针指到要出列的结点时,先输出结点的序列号,再删除之,直到所有结点都出列完
文中有三个源代码参考例子:这是其中之一—— NTService:是一个简单的 Win32 服务,它就是用本文所描述的方法建立的; 其余两个分别为: NTServCpl:是一个控制面版程序,用来控制 NTService 服务; NTServCtrl:...
所以通常我们会选择MinGW作为编译环境,这是一个开源免费的C/C++编译器配合一些第三方支持代码提示的编辑器(如VSCode)进行开发学习,然而,mingw-w64.org只能下载到32位安装器,mingw.org部分人反映域名被劫持,...
大一上学期,C语言/C++结课大作业——交并补运算+Gui界面
Win32 C/C++编写的斗地主游戏程序源码,包括服务器与客户端程序,VS2005开发。 支持服务器定制(添加、删除、编辑所选服务器参数), 支持游戏大厅功能,支持常规的斗地主游戏及旁观功能,支持基本聊天功能。
零基础学C/C++01——第一个程序Hello World! 答案很简单 只要学过c++ #include using namespace std; int main() { cout !" ; return 0; }
通讯录程序含多项功能,且有基本备注,适合非专业学生课程设计,自己学习等
虚拟机的设计与实现——C/C++.pdf
生死枪战游戏目前以3个模式运行(持续更新),玩家可以通过自己的喜好来选择,如:新手训练营,无限闯关,打怪,以及能调用时间而改变战力的暗月阁长老。更多特殊技能、特殊武器等你发掘! 改进或交流该游戏的建议...
简要实现了C/C++中调用Lua脚本的技术。 通过用Lua脚本输出一个便签,来研究C/C++与Lua的交互技术。
它只需要修改一个设置选项,就能够在同一个IDE集成开发环境下设计和编译以标准 C 和 C++ 语法设计的程序文件。 Turbo C++ 3.0 与 Turbo C 2.0 的主要区别: 1、Turbo C++ 3.0不仅能设计和编译C程序文件,而且修正...
前序创建二叉树c++(csdn)————程序
在sublime 和其他需要自己配置c/c++环境时所需要的文件
虚拟机的设计与实现——C/C++