设为首页 加入收藏

TOP

(Visual C++)游戏开发笔记二十六 DirectX 11各组件的介绍&第一个DirectX 11 Demo的创建 (四)
2014-11-23 19:33:38 】 浏览:803
Tags:Visual 游戏 开发 笔记 二十六 DirectX 组件 介绍 一个 Demo 创建
能,可以看到WNDPROC的定义:
typedef LRESULT (CALLBACK*WNDPROC)(HWND, UINT, WPARAM, LPARAM);

在这里又出现了两个新的数据类型LRESULT和CALLBACK,再次使用goto definition,可以看到它们实际上是long和__stdcall。


从WNDPROC的定义可以知道,WNDPROC实际上是函数指针类型。

注意:WNDPROC被定义为指向窗口过程函数的指针类型,窗口过程函数的格式必须与WNDPROC相同。

知识点 在函数调用过程中,会使用栈。__stdcall与__cdecl是两种不同的函数调用约定,定义了函数参数入栈的顺序,由调用函数还是被调用函数将参数弹出栈,以及产生函数修饰名的方法。关于这两个调用约定的详细信息,大家可参看MSDN。对于参数个数可变的函数,例如printf,使用的是__cdecl调用约定,Win32的API函数都遵循__stdcall调用约定。在VC++开发环境中,默认的编译选项是__cdecl,对于那些需要__stdcall调用约定的函数,在声明时必须显式地加上__stdcall。在Windows程序中,回调函数必须遵循__stdcall调用约定,所以我们在声明回调函数时要使用CALLBACK。使用CALLBACK而不是__stdcall的原因是为了告诉我们这是一个回调函数。注意,在Windows 98和Windows 2000下,声明窗口过程函数时,即使不使用CALLBACK也不会出错,但在Windows NT4.0下,则会出错。

▲cbClsExtra. 类附加内存。

▲cbWndExtra. 窗口附加内存。

▲hInstance. 指定包含窗口过程的程序的实例句柄。

▲hIcon. 指定窗口类的图标句柄。

▲hCursor. 指定窗口类的光标句柄。

▲hbrBackground. 指定窗口类的背景画刷句柄。

▲lpszMenuName. 一个以空终止的字符串,指定菜单资源的名字。

▲lpszClassName. 一个以空终止的字符串,指定窗口类的名字。

▲hIconSm. 指定窗口类的小图标句柄。(就像在任务栏右下角托盘中应用程序显示的小图标)

大部分的Win32应用程序的窗口特性我们是不做考虑的,如创建一个菜单(在编辑区之外,我们一般不会在游戏中创建一个Win32菜单)。这些成员变量我们在这里一般设为0。

随着WNDCLASSEX结构体的创建,我们可以将它用RegisterClassEx( )调用,来注册一个窗口。RegisterClassEx()必须在我们创建窗口之前调用,且调用时需要用到窗口类的地址作为变量。若函数返回值为0,则表示注册失败,这时,我们需要检查窗口相关值的合法性。

下一步就是创建实际的窗口了。首先我们调用AdjustWindowRect()函数来根据我们设定的尺寸和风格来计算窗口的尺寸。窗口的类型取决于我们需要的真实尺寸。如果我们需要Win32应用程序,就会有像标题栏这样的非客户区,一个环绕着应用程序的边框,等等。如果我们要创建一个特殊的窗口尺寸,我们需要牢记在心的是,应用程序既有客户区,也有非客户区。

AdjustWindowRect函数首先用利用一个矩形定义左下角,右下角,左上角,右上角窗口区域的坐标。左上角的属性代表了窗口的起始位置,结合右下角则可以反应窗口的宽度和高度。AdjustWindowRect函数中也专门有一个布尔类型的标明窗口类型的变量,指示窗口是否拥有菜单栏,而有无菜单栏影响着非客户区。

下一步我们调用Win32函数CreateWindow来创建我们的窗口。在下表中我们讲解它的一个变体CreateWindowA。两者的主要的区别是CreateWindowA接受ANSI编码类型的字符串变量,而CreateWindows接受Unicode编码类型的字符串变量。若要使用Unicode类型,我们可以用L”XX”将我们的Unicode类型字符串括起来,而其中“XX”处填写Unicode字符串的内容。

Win32函数CreateWindowA的变量如下:

▲ lpClassName (可选) 窗口类名(和窗口类结构体一致)

▲ lpWindowName (可选) 窗口标题栏文本

▲ dwStyle 窗口类型标识

▲ X—窗口的水平位置。

▲ Y—窗口的竖直位置。

▲ nWidth—窗口宽度

▲ hHeight—窗口高度

▲ hWndParent (可选)—父窗口句柄的一个句柄 (若此新窗口为弹出窗口或者子窗口,本变量为为可选).

▲ hMenu (可选)—窗口菜单的资源句柄

▲ hInstance (可选)—应用程序实例ID (wWinMain的第一个变量).

▲ lpParam (optional)—通过窗口过程回调函数的lpParam参数,传递给窗口数据

(在窗口回调过程中深入讲解).

CreateWindow(A)的返回值是一个空句柄。如果CreateWindow(A)创建成功,我们可以调用Win32函数ShowWindow来显示窗口,ShowWindow()函数需要使用ShowWindow函数返回的窗口句柄,以及cmdShow参数(wWinMain的最后一个变量)。

当窗口被创建后,应用程序就能开始执行它的工作了。Win32 GUI应用程序是基于事件的应用程序。这就意味着当事件发生时,应用程序得到通知,然后进行相关的响应。
这样的消息响应机制持续到应用程序退出。例如,当Microsoft Word运行后,一个“创建(Create)”事件被激发,应用程序便开始加载。当用户点击工具栏上与菜单上等的按钮的时候,一个事件就被触发,发送到应用程序处进行处理。如果打开文件按钮的鼠标点击事件被触发,然后一个对话框会显示出来,使用户可以直观地选择需要打开的文件。许多应用程序都是基于事件而运行与工作的。

在电子游戏中,应用程序是实时的,这意味着很多事件与行为的发生与否并不是应用程序一直在执行很多任务的。若用户按下游戏控制器的按钮,通常会在游戏循环的更新步骤中被检测到,然后游戏程序进行对应的响应。如果没有事件发生,游戏程序依然会通过渲染当前的游戏状态而运行(例如,渲染菜单,电影,游戏地图等),并执行逻辑更新,查找和响应网络数据,进行音频播放等等。
无论是实时还是基于事件的程序,都会在启动运行后一直处于运行的状态,直到用户决定退出。在这里介绍应用程序循环的概念。应用程序循环我们解释为,是一个持续的无限的循环,直到用户进行了相关打破这种循环的操作。可以通过接受到一个WM_QUIT(Win32运用程序的退出消息)消息。在应用程序中点击“退出”来关闭该程序。(例如,在游戏运行时按下Esc键也许会出现一个暂停的画面,但不应该是退出,除非我们去那样设计),或者设计任何其他方式的退出。在此专栏系列的后续内容,我们将演示只有当用户按Esc键,或者单击窗口右上角的“X”关闭按钮的时候,应用程序才会退出。

这是一个我们之后中会用到的应用循环的例子
代码段3:Blank Win32 Window Demo书写步骤之三—— 应用循环
[cpp]
int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCEprevInstance

首页 上一页 1 2 3 4 5 6 7 下一页 尾页 4/7/7
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇(Visual C++)游戏开发笔记二十.. 下一篇int 和 LPCWSTR 的转换

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目