ZhangZemin007 发表于 2013-2-1 09:30:33

C/C++游戏之旅(一)————创建第一个win32窗体程序

好吧,废话少说,开始我们win32游戏编程,期待我们能够创造出赏心悦目的游戏。
首先,打开vs2010创建如下工程:
http://dl.iteye.com/upload/attachment/0074/5331/e92c489a-ea0b-318f-8cdc-8a518d04bf42.jpg
加上如下代码:   #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);}。
好了,开始运行吧!看看什么效果,如果出现了这个东东:
http://dl.iteye.com/upload/attachment/0074/5333/11639c99-c613-3bd5-9368-5869b099ad68.jpg
那就说明,你的环境没有问题了,可以继续我们下面的工作了,如果没有出现(找美丽的度娘吧!)。
做个简单的说明: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)
{
PAINTSTRUCTps;//图形绘制结构体
HDChdc;//句柄
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){PAINTSTRUCTps;//图形绘制结构体HDChdc;//句柄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将附加的运行时间告诉系统的,大多数人都设为0winclass.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);}
页: [1]
查看完整版本: C/C++游戏之旅(一)————创建第一个win32窗体程序