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

来源:互联网 发布:有道英语发音软件 编辑:程序博客网 时间:2024/05/16 23:45

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

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

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

请看代码:

Code:
  1. LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)   
  2. {   
  3.    switch(msg)   
  4.       {   
  5.          case WM_DESTROY:   
  6.             PostQuitMessage(0);   
  7.             return 0;   
  8.             break;   
  9.   
  10.          case WM_KEYUP:   
  11.             if(wParam == VK_ESCAPE) PostQuitMessage(0);   
  12.             break;   
  13.       }   
  14.    return DefWindowProc(hWnd, msg, wParam, lParam);   
  15. }   
  16.   
  17.   
  18. int WINAPI WinMain(HINSTANCE hInst, HINSTANCE prevhInst, LPSTR cmdLine, int show)   
  19. {   
  20.    // Register the window class   
  21.    WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,   
  22.                      GetModuleHandle(NULL), NULL, NULL, NULL, NULL,   
  23.                      WINDOW_CLASS, NULL };   
  24.    RegisterClassEx(&wc);   
  25.   
  26.    // Create the application's window   
  27.    HWND hWnd = CreateWindow(WINDOW_CLASS, WINDOW_NAME, WS_OVERLAPPEDWINDOW,   
  28.                             100, 100, 640, 480, GetDesktopWindow(), NULL,   
  29.                             wc.hInstance, NULL);   
  30.   
  31.    // Initialize Direct3D   
  32.    if(InitializeD3D(hWnd, false))   
  33.       {   
  34.          // Show the window   
  35.          ShowWindow(hWnd, SW_SHOWDEFAULT);   
  36.          UpdateWindow(hWnd);   
  37.   
  38.          // Enter the message loop   
  39.          MSG msg;   
  40.          ZeroMemory(&msg, sizeof(msg));   
  41.   
  42.          while(msg.message != WM_QUIT)   
  43.             {   
  44.                if(PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))   
  45.                   {   
  46.                      TranslateMessage(&msg);   
  47.                      DispatchMessage(&msg);   
  48.                   }   
  49.                else  
  50.                   RenderScene();   //暂时不管它。
  51.             }   
  52.       }   
  53.   
  54.    // Release any and all resources.   
  55.    Shutdown();    //暂时不管它。
  56.   
  57.    // Unregister our window.   
  58.    UnregisterClass(WINDOW_CLASS, wc.hInstance);   
  59.    return 0;   
  60. }  

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

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

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

可以在30行处加一个:

Code:
  1. if (!hWnd) return 0;  

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

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

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

原创粉丝点击