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

  

本系列文章由jadeshu编写,转载请注明出处。http://blog.csdn.net/jadeshu/article/details/22449085

作者: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

oror....

2.

3.新建项目


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


5.完成



接着编译运行即可


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
<!DOCTYPE html>:声明文档类型为HTML5。 <html lang="en">:定义HTML文档的根元素,其中lang属性指定了文档的语言为英语。 <head>:定义文档的头部,包含了一些描述文档信息的元素。 <meta charset="UTF-8">:设置文档的字符编码为UTF-8,确保正确显示特殊字符。 <title>Document</title>:设置文档的标题为"Document"。 <style>:开始定义内部样式表。 p { color: red; font-size: 20px; }:选择所有的<p>元素,并设置颜色为红色,字体大小为20像素。 h2 { color: yellow; }:选择所有的<h2>元素,并设置颜色为黄色。 .hello { background: #cccccc; }:选择具有类名"hello"的元素,并设置背景颜色为#cccccc(浅灰色)。 .world { font-weight: bold; }:选择具有类名"world"的元素,并设置字体加粗。 #haha { color: blue; }:选择具有ID "haha"的元素,并设置颜色为蓝色。 </style>:结束内部样式表。 <body>:定义文档的主体部分,包含页面中的可见内容。 <p>welcome to css!</p>:创建一个段落元素,显示文本"welcome to css!"。 <p>hello world!</p>:创建一个段落元素,显示文本"hello world!"。 <h2>WEB前端开发</h2>:创建一个标题2(h2)元素,显示文本"WEB前端开发"。 <h3>Java开发</h3>:创建一个标题3(h3)元素,显示文本"Java开发"。 <hr>:创建一个水平线。 <p class="hello">welcome to css!</p>:创建一个具有类名"hello"的段落元素,显示文本"welcome to css!"。 <p>hello world!</p>:创建一个段落元素,显示文本"hello world!"。 <h2>WEB前端开发</h2>:创建一个标题2(h2)元素,显示文本"WEB前端开发"。 <h3>Java开发</h3>:创建一个标题3(h3)元素,显示文本"Java开发"。 <div class="hello">主讲:Hector</div>:创建一个具有类名"hello"的div元素,显示文本"主讲:Hector"。 <div class="world">主讲:Hector</div>:创建一个具有类名"world"的div元素,显示文本"主讲:Hector"。 <hr>:创建一个水平线。 <h1 id="haha">哈哈</h1>:创建一个具有ID "haha"的标题1(h1)元素,显示文本"哈哈"。 </body>:结束文档的主体部分。 </html>:结束HTML文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值