您的位置:首页 > 编程语言

windows游戏编程<七> 创建WIN32一个HelloWOrld程序

2014-03-29 00:18 337 查看



本系列文章由jadeshu编写,转载请注明出处。/article/10929250.html

作者:jadeshu 邮箱: jadeshu@qq.com 欢迎邮件交流

一开始我们得大致了解一个程序的运行过程,运行时得先启动一个程序,如下启动过程

1.WIN32程序启动过程就是进程的创建过程,系统调用CreateProcess函数创建新的进程(当一个线程调用CreateProcess函数时,系统会创建一个进程内核对象,其使用计数初始化为1.此进程内核对象不是进程本身,仅仅是一个系统用来管理这个进程的小的数据结构)

2.系统然后为新的进程创建一个虚拟地址空间,加载应用程序运行时所需的代码和数据

3.系统接着为新进程创建一个主线程(这个主线程通过执行C/C++运行期启动代码开始运行,C/C++运行期启动代码又会调用main函数。如果系统能够成功创建新的进程和进程的主线程,CreateProcess函数会返回TRUE,否则返回FALSE)

....运行程序

#include <windows.h>
#include <tchar.h>

HINSTANCE hInst;						//窗口实例句柄
TCHAR szTitle[MAX_PATH] = _T("HelloWorld");			//窗口类名
TCHAR szWindowClass[MAX_PATH] = _T("szClass");			//窗口标题名

ATOM				MyRegisterClass(HINSTANCE hInstance);   //注册窗口类函数声明
BOOL				InitInstance(HINSTANCE, int);		//初始化实例函数声明
LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);		//窗口回调函数声明

int WINAPI _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR    lpCmdLine,
int       nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);

MSG msg;                                  //消息结构体

MyRegisterClass(hInstance);

if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}

while (GetMessage(&msg, NULL, 0, 0))	  //消息循环
{
TranslateMessage(&msg);		  //转换消息
DispatchMessage(&msg);		  //派发消息
}

return (int) msg.wParam;
}

ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style			= CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc	= WndProc;						//窗口处理函数为WndProc
wcex.cbClsExtra		= 0;							//窗口类扩展数据
wcex.cbWndExtra		= 0;							//窗口实例扩展数据
wcex.hInstance		= hInstance;						//当前实例句柄
wcex.hIcon		= LoadIcon(hInstance, IDI_APPLICATION);                 //加载图标
wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);				//加载光标
wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);				//窗口背景填充颜色
wcex.lpszMenuName	= NULL;							//菜单
wcex.lpszClassName	= szWindowClass;					//窗口类名
wcex.hIconSm		= LoadIcon(wcex.hInstance, IDI_APPLICATION);		//加载小图标
return RegisterClassEx(&wcex);							//注册窗口类
}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;

hInst = hInstance; // Store instance handle in our global variable

hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);			//创建窗口

if (!hWnd)
{
return FALSE;
}

ShowWindow(hWnd, nCmdShow);								//显示窗口
UpdateWindow(hWnd);									//更新窗口

return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;

switch (message)
{
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);							//退出
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}


具体可以参看windows游戏编程<一>

需要了解的有以下几点:

1.Windows窗口类结构WNDCLASS WNDCLASSEX

2.注册窗口类

3.创建窗口

4.事件处理程序(窗口回调函数)

5.主事件循环(该实例的消息循环)

对于游戏是一个实时的循环,即你所需要的是一种检测在消息队列中是否有消息,如果有就处理它,没有就进行处理游戏逻辑等!

下面介绍几个函数的区别

BOOL GetMessage(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax
);


其唯一用途就是从事件对列中获得消息,并进行处理。当程序在等待通过
GetMessage 传递的消息时,主事件循坏基本上是锁定的。即,如果消息队列中没有消息,则GetMessage()不会返回,一直等待..

BOOL PeekMessage(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax,
UINT wRemoveMsg
);


他们的原型几乎是一样的,唯一的不同是 PeekMessage 比 GetMessage 多了一个参数:UINT wRemoveMsg // removal flags。对于wRemoveMsg ,有效的标志有PM_NOREMOVE,PeekMessage 处理之后,消息没有从序列中去除PM_REMOVE,PeekMessage
处理之后,消息已经从序列中去除怎样来实现实时事件循坏呢?通过利用PeekMessage 来判断消息序列中是否有消息,如果有,就处理它;否则直接返回,并不等待。

LRESULT SendMessage(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);


SendMessage根据窗口句柄发送一个消息给窗口,SendMessage
向窗口传递一个要求立即处理的消息。接收窗口处理完该消息后,该函数便紧接着 WinProc 返回。是同步的。
BOOL PostMessage(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);

PostMessage 将消息发往窗口的消息序列,而后直接返回。如果不在意在消息被处理以前的时间延迟,或者该消息的优先级较低,就可以使用该函数。是异步的。

VC创建WIN32框架程序

1.打开VC


or

or....

2.


3.新建项目

4.选择WIN32项目点击确定 一直下一步直至完成



5.完成



接着编译运行即可
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐