解析最简单的DirectX程序“Blank Window”(一)

本文介绍了DirectX编程的基础知识,重点讲解了WinMain()函数的工作原理及其组成部分,包括窗口类的创建与注册、消息循环处理等关键步骤。

导言:我了解DirectX的时间也是不多的,所以掌握的知识有限。如果我说的不对尽管指正。

我所使用的代码来自《Direct X游戏开发终极指南》

接下来我就要介绍的就是最简单的DirectX程序“Blank Window“的基础部分:WInMain()。WinMain()在WIn32程序中是必不可少的,我看过几种不同版本的WinMain()函数代码,这些代码都大同小异。我们就拿其中的一个版本来说吧。

请看代码:

Code:
  1. LRESULTWINAPIMsgProc(HWNDhWnd,UINTmsg,WPARAMwParam,LPARAMlParam)
  2. {
  3. switch(msg)
  4. {
  5. caseWM_DESTROY:
  6. PostQuitMessage(0);
  7. return0;
  8. break;
  9. caseWM_KEYUP:
  10. if(wParam==VK_ESCAPE)PostQuitMessage(0);
  11. break;
  12. }
  13. returnDefWindowProc(hWnd,msg,wParam,lParam);
  14. }
  15. intWINAPIWinMain(HINSTANCEhInst,HINSTANCEprevhInst,LPSTRcmdLine,intshow)
  16. {
  17. //Registerthewindowclass
  18. WNDCLASSEXwc={sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0L,0L,
  19. GetModuleHandle(NULL),NULL,NULL,NULL,NULL,
  20. WINDOW_CLASS,NULL};
  21. RegisterClassEx(&wc);
  22. //Createtheapplication'swindow
  23. HWNDhWnd=CreateWindow(WINDOW_CLASS,WINDOW_NAME,WS_OVERLAPPEDWINDOW,
  24. 100,100,640,480,GetDesktopWindow(),NULL,
  25. wc.hInstance,NULL);
  26. //InitializeDirect3D
  27. if(InitializeD3D(hWnd,false))
  28. {
  29. //Showthewindow
  30. ShowWindow(hWnd,SW_SHOWDEFAULT);
  31. UpdateWindow(hWnd);
  32. //Enterthemessageloop
  33. MSGmsg;
  34. ZeroMemory(&msg,sizeof(msg));
  35. while(msg.message!=WM_QUIT)
  36. {
  37. if(PeekMessage(&msg,NULL,0U,0U,PM_REMOVE))
  38. {
  39. TranslateMessage(&msg);
  40. DispatchMessage(&msg);
  41. }
  42. else
  43. RenderScene(); //暂时不管它。
  44. }
  45. }
  46. //Releaseanyandallresources.
  47. Shutdown(); //暂时不管它。
  48. //Unregisterourwindow.
  49. UnregisterClass(WINDOW_CLASS,wc.hInstance);
  50. return0;
  51. }

这里包含了两个函数:MsgProc()和WinMain()函数。其中MsgProc()函数用来处理消息队列,这就好像是一群等待CPU大妈洗澡的野孩子,通过一个switch结构来实现不同的操作。重点是WinMain()函数,WinMain()函数有些长,但是在renderscene()函数面前这个长度真的不算什么的了。我可以用一个简图来分解WinMain()函数的工作机制。

首先创建一个窗口类,注意类名有WNDCLASS和WNDCLASSEX之分。在早期的vc中使用的是WNDCLASS,在VC6以及随后是普遍使用的是WNDCLASSEX,从名字可以看出这是WNDCLASS的加强版。

然后可以注册使用RegisterClassEx()函数,这里并没有使用返回值来判断是否正确地注册,而我希望以后的程序能够注意到这点。

可以在30行处加一个:

Code:
  1. if(!hWnd)return0;

这样也可以防止发生意外。

在显示窗口和更新窗口后,就进入消息循环,如上面简图所示,若没有消息队列,就直接渲染,若有,就根据消息队列进行不同的处理。最后就是解除注册的函数UnregisterClass()。

此外MsgProc()函数是在21行处使用的,我曾一度找不到它的调用位置,以上就是我今天的学习心得,希望大家提出宝贵的意见和建议。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值