解析最简单的DirectX程序“Blank Window”(一)
来源:互联网 发布:有道英语发音软件 编辑:程序博客网 时间:2024/05/16 23:45
导言:我了解DirectX的时间也是不多的,所以掌握的知识有限。如果我说的不对尽管指正。
我所使用的代码来自《Direct X游戏开发终极指南》
接下来我就要介绍的就是最简单的DirectX程序“Blank Window“的基础部分:WInMain()。WinMain()在WIn32程序中是必不可少的,我看过几种不同版本的WinMain()函数代码,这些代码都大同小异。我们就拿其中的一个版本来说吧。
请看代码:
- LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
- {
- switch(msg)
- {
- case WM_DESTROY:
- PostQuitMessage(0);
- return 0;
- break;
- case WM_KEYUP:
- if(wParam == VK_ESCAPE) PostQuitMessage(0);
- break;
- }
- return DefWindowProc(hWnd, msg, wParam, lParam);
- }
- int WINAPI WinMain(HINSTANCE hInst, HINSTANCE prevhInst, LPSTR cmdLine, int show)
- {
- // Register the window class
- WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
- GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
- WINDOW_CLASS, NULL };
- RegisterClassEx(&wc);
- // Create the application's window
- HWND hWnd = CreateWindow(WINDOW_CLASS, WINDOW_NAME, WS_OVERLAPPEDWINDOW,
- 100, 100, 640, 480, GetDesktopWindow(), NULL,
- wc.hInstance, NULL);
- // Initialize Direct3D
- if(InitializeD3D(hWnd, false))
- {
- // Show the window
- ShowWindow(hWnd, SW_SHOWDEFAULT);
- UpdateWindow(hWnd);
- // Enter the message loop
- MSG msg;
- ZeroMemory(&msg, sizeof(msg));
- while(msg.message != WM_QUIT)
- {
- if(PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- else
- RenderScene(); //暂时不管它。
- }
- }
- // Release any and all resources.
- Shutdown(); //暂时不管它。
- // Unregister our window.
- UnregisterClass(WINDOW_CLASS, wc.hInstance);
- return 0;
- }
这里包含了两个函数:MsgProc()和WinMain()函数。其中MsgProc()函数用来处理消息队列,这就好像是一群等待CPU大妈洗澡的野孩子,通过一个switch结构来实现不同的操作。重点是WinMain()函数,WinMain()函数有些长,但是在renderscene()函数面前这个长度真的不算什么的了。我可以用一个简图来分解WinMain()函数的工作机制。
首先创建一个窗口类,注意类名有WNDCLASS和WNDCLASSEX之分。在早期的vc中使用的是WNDCLASS,在VC6以及随后是普遍使用的是WNDCLASSEX,从名字可以看出这是WNDCLASS的加强版。
然后可以注册使用RegisterClassEx()函数,这里并没有使用返回值来判断是否正确地注册,而我希望以后的程序能够注意到这点。
可以在30行处加一个:
- if (!hWnd) return 0;
这样也可以防止发生意外。
在显示窗口和更新窗口后,就进入消息循环,如上面简图所示,若没有消息队列,就直接渲染,若有,就根据消息队列进行不同的处理。最后就是解除注册的函数UnregisterClass()。
此外MsgProc()函数是在21行处使用的,我曾一度找不到它的调用位置,以上就是我今天的学习心得,希望大家提出宝贵的意见和建议。
- 解析最简单的DirectX程序“Blank Window”(一)
- 解析最简单的DirectX程序“Blank Window”(二)
- 解析最简单的DirectX程序“Blank Window”(三)
- Directx学习笔记【1】最简单的window程序
- 编写最简单的SQL解析程序(原理演示)
- 最简单的WINDOWS程序详细解析.
- [DirectX游戏开发笔记之二] 最简单的DirectX
- 最简单的window程序——API版本
- direct基础学习(一) 最简单的Windows程序
- struts2 初学(一)最简单的struts2程序
- 最简单的程序
- Makefile解析(最简单的LED)
- MFC学习笔记一 最简单的MFC程序
- windows程序设计一 最简单的windows程序
- Android 一键退出程序最简单的方法 finishAffinity()
- 最简单的Windows窗口程序,使用main函数,隐藏控制台等,适合window编程入门
- C#网络编程(一)------最简单的基于cs的sokect通讯程序
- 嵌入python的c++程序发布(一)最简单的方法
- Ubuntu10.04 Android 开发环境配置 SDk下载配置 ADT插件下载
- 零基础开始学习Jave
- 为自己而活
- 验证码的生成(VB)
- 生成验证码(C#)
- 解析最简单的DirectX程序“Blank Window”(一)
- linux工作中常用到的命令
- .NET调用SAP接口
- 二进制、八进制、十进制、十六进制之间转换
- 用c#将数据显示到html标签中的指定位置
- LightBox
- 一代女皇武则天——计算机达人成长之路(12)连载
- 课程设计郁闷中
- 智商诚可贵,情商价更高 转自:沪江