导言:我了解DirectX的时间也是不多的,所以掌握的知识有限。如果我说的不对尽管指正。
我所使用的代码来自《Direct X游戏开发终极指南》
接下来我就要介绍的就是最简单的DirectX程序“Blank Window“的基础部分:WInMain()。WinMain()在WIn32程序中是必不可少的,我看过几种不同版本的WinMain()函数代码,这些代码都大同小异。我们就拿其中的一个版本来说吧。
请看代码:
- LRESULTWINAPIMsgProc(HWNDhWnd,UINTmsg,WPARAMwParam,LPARAMlParam)
- {
- switch(msg)
- {
- caseWM_DESTROY:
- PostQuitMessage(0);
- return0;
- break;
- caseWM_KEYUP:
- if(wParam==VK_ESCAPE)PostQuitMessage(0);
- break;
- }
- returnDefWindowProc(hWnd,msg,wParam,lParam);
- }
- intWINAPIWinMain(HINSTANCEhInst,HINSTANCEprevhInst,LPSTRcmdLine,intshow)
- {
- //Registerthewindowclass
- WNDCLASSEXwc={sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0L,0L,
- GetModuleHandle(NULL),NULL,NULL,NULL,NULL,
- WINDOW_CLASS,NULL};
- RegisterClassEx(&wc);
- //Createtheapplication'swindow
- HWNDhWnd=CreateWindow(WINDOW_CLASS,WINDOW_NAME,WS_OVERLAPPEDWINDOW,
- 100,100,640,480,GetDesktopWindow(),NULL,
- wc.hInstance,NULL);
- //InitializeDirect3D
- if(InitializeD3D(hWnd,false))
- {
- //Showthewindow
- ShowWindow(hWnd,SW_SHOWDEFAULT);
- UpdateWindow(hWnd);
- //Enterthemessageloop
- MSGmsg;
- ZeroMemory(&msg,sizeof(msg));
- while(msg.message!=WM_QUIT)
- {
- if(PeekMessage(&msg,NULL,0U,0U,PM_REMOVE))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- else
- RenderScene(); //暂时不管它。
- }
- }
- //Releaseanyandallresources.
- Shutdown(); //暂时不管它。
- //Unregisterourwindow.
- UnregisterClass(WINDOW_CLASS,wc.hInstance);
- return0;
- }
这里包含了两个函数:MsgProc()和WinMain()函数。其中MsgProc()函数用来处理消息队列,这就好像是一群等待CPU大妈洗澡的野孩子,通过一个switch结构来实现不同的操作。重点是WinMain()函数,WinMain()函数有些长,但是在renderscene()函数面前这个长度真的不算什么的了。我可以用一个简图来分解WinMain()函数的工作机制。
首先创建一个窗口类,注意类名有WNDCLASS和WNDCLASSEX之分。在早期的vc中使用的是WNDCLASS,在VC6以及随后是普遍使用的是WNDCLASSEX,从名字可以看出这是WNDCLASS的加强版。
然后可以注册使用RegisterClassEx()函数,这里并没有使用返回值来判断是否正确地注册,而我希望以后的程序能够注意到这点。
可以在30行处加一个:
- if(!hWnd)return0;
这样也可以防止发生意外。
在显示窗口和更新窗口后,就进入消息循环,如上面简图所示,若没有消息队列,就直接渲染,若有,就根据消息队列进行不同的处理。最后就是解除注册的函数UnregisterClass()。
此外MsgProc()函数是在21行处使用的,我曾一度找不到它的调用位置,以上就是我今天的学习心得,希望大家提出宝贵的意见和建议。