导言:我深深地感觉到这个“Blank Window”是那么的复杂。为了一个黑屏,要调用很多很多函数。这也难怪我们的程序员要组成一个团队才能胜任游戏制作。
好了,上次我有个疑问。就是WndProc()函数和MsgProc()函数究竟是什么区别?带着这个问题,我发贴,问了好友,在多方的答案下,我终于得出了自己的见解。
其实WndProc()函数和MsgProc()函数大部分是相同的,只是命名上是不同的。在Win32程序中,我们可以看到,他们的函数原型都在WinMain()函数前面,所以我们可以这样认为,它是一个自定义的、人为的函数,我们甚至可以取消掉这个函数名重新命名自己喜欢的名字。
这次我学到了创建和显示Direct3D窗口。当然,我用到的还是这本书:
首先还是看代码:
- boolInitializeD3D(HWNDhWnd,boolfullscreen)
- {
- D3DDISPLAYMODEdisplayMode;
- //CreatetheD3Dobject.
- g_D3D=Direct3DCreate9(D3D_SDK_VERSION);
- if(g_D3D==NULL)returnfalse;
- //Getthedesktopdisplaymode.
- if(FAILED(g_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&displayMode)))
- returnfalse;
- //SetupthestructureusedtocreatetheD3DDevice
- D3DPRESENT_PARAMETERSd3dpp;
- ZeroMemory(&d3dpp,sizeof(d3dpp));
- if(fullscreen)
- {
- d3dpp.Windowed=FALSE;
- d3dpp.BackBufferWidth=640;
- d3dpp.BackBufferHeight=480;
- }
- else
- d3dpp.Windowed=TRUE;
- d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
- d3dpp.BackBufferFormat=displayMode.Format;
- //CreatetheD3DDevice
- if(FAILED(g_D3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,
- D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_D3DDevice)))
- {
- returnfalse;
- }
- returntrue;
- }
InitializeD3D()这是作者自定义的一个函数,并不是系统内置的函数。它的参数是窗口句柄和是否全屏的逻辑变量。简单地来说,这个函数的结构用来创建D3D窗口的。具体的细节如下:
我这里谈两点:
1、使用“if (FAILED(...)) return false”结构可以很好地节约代码,而且能够达到判断是否成功。如果在“return false”前加一条语句cout<<"错误码(1009)"(当然这个是随便举的例子,win32程序是不能使cout简单地输出的。),就可以在运行的时候判断错误在哪里。
2、使用ZeroMemory()函数也是一个良好的习惯。因为你不知道将要创建装置所用的内存是否在初始时为0,如果不是0,那么在使用的时候难免会出一些莫名的错误。使用ZeroMemory()函数,就好像在放东西前清空一下箱子一样,可以避免损坏我们的电脑,因此这也是我大力推荐使用的。