【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 2203|回复: 0

【MangoGUI控件系列教程】MangoGUI Tut01_CreateWindwos 建立窗体

[复制链接]
发表于 2012-8-28 09:42:30 | 显示全部楼层 |阅读模式
本帖最后由 夜行的猫仔 于 2012-8-28 10:27 编辑

需要使用MangoGUI创建创建窗体有两种方法:
一种是自己创建窗口将MangoGUI绑定到自己创建的窗口上,另外一个方法是通过MangoGUI创建,这两种方法创建得到的都是标准win32 API 窗口。大家可以根据自己的项目需求选用创建模式。这里给大家讲如何使用MangoGUI创建新窗体。

首先创建新的win32窗口工程。在项目属性的连接器属性中添加如下库:
  1. dxerr.lib
  2. dxguid.lib
  3. d3dx9d.lib
  4. d3d9.lib
  5. winmm.lib
  6. comctl32.lib
  7. ..\MangoInterface\lib\MangoGUI2005_lib.lib
复制代码
其中最后一个库是通过源代码MangoGUI编译生成的lib静态库文件,路径可以自行修改。

以下是窗体创建完整代码:
  1. <font size="1">//=============================================================================
  2. // Desc: Direct3D应用程序框架
  3. //=============================================================================
  4. #include "../MangoInterface/interface/Mango.h"
  5. //-----------------------------------------------------------------------------
  6. // 全局变量
  7. //-----------------------------------------------------------------------------


  8. //-----------------------------------------------------------------------------
  9. // Desc: 函数声明
  10. //------------------------------------------------------------------------------
  11. bool    CALLBACK IsDeviceAcceptable( D3DCAPS9* pCaps, D3DFORMAT AdapterFormat, D3DFORMAT BackBufferFormat, bool bWindowed, void* pUserContext );
  12. bool    CALLBACK ModifyDeviceSettings( MANGODeviceSettings* pDeviceSettings, const D3DCAPS9* pCaps, void* pUserContext );
  13. void    CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext );
  14. //-----------------------------------------------------------------------------
  15. // Desc: 入口函数
  16. //-----------------------------------------------------------------------------
  17. INT WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
  18. {
  19.         //为Debug配置启用运行时内存检查功能
  20. #if defined(DEBUG) | defined(_DEBUG)
  21.         _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
  22. #endif

  23.         //初始化MANGO, 创建窗口, 创建Direct3D设备对象
  24.         MANGOSetFrameRender( OnFrameRender );


  25.         MANGOInit( );
  26.         MANGOCreateWindow( L"MangoGUI System  v 0.1.53" );
  27.         MANGOCreateDevice( D3DADAPTER_DEFAULT, true, 640, 480, IsDeviceAcceptable, ModifyDeviceSettings );

  28.         //进入消息循环和场景渲染
  29.         MANGOMainLoop();

  30.         //在此进行应用程序相关的清除工作

  31.         return MANGOGetExitCode();
  32. }


  33. //-----------------------------------------------------------------------------
  34. // Desc: 设备能力检查
  35. //-----------------------------------------------------------------------------
  36. bool CALLBACK IsDeviceAcceptable( D3DCAPS9* pCaps, D3DFORMAT AdapterFormat,
  37.                                                                  D3DFORMAT BackBufferFormat, bool bWindowed,
  38.                                                                  void* pUserContext )
  39. {
  40.         IDirect3D9* pD3D = MANGOGetD3DObject();
  41.         if( FAILED( pD3D->CheckDeviceFormat( pCaps->AdapterOrdinal, pCaps->DeviceType,
  42.                 AdapterFormat, D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING,
  43.                 D3DRTYPE_TEXTURE, BackBufferFormat ) ) )
  44.                 return false;

  45.         return true;
  46. }


  47. //-----------------------------------------------------------------------------
  48. // Desc: 修改Direct3D渲染设备设置
  49. //-----------------------------------------------------------------------------
  50. bool CALLBACK ModifyDeviceSettings( MANGODeviceSettings* pDeviceSettings,
  51.                                                                    const D3DCAPS9* pCaps, void* pUserContext )
  52. {
  53.         pDeviceSettings->pp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
  54.         //如果不支持硬件顶点处理则使用软件顶点处理
  55.         if( (pCaps->DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) == 0)
  56.         {
  57.                 pDeviceSettings->BehaviorFlags = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
  58.         }

  59.         //如果使用参考设备,则弹出警告对话框
  60.         static bool s_bFirstTime = true;
  61.         if( s_bFirstTime )
  62.         {
  63.                 s_bFirstTime = false;
  64.                 if( pDeviceSettings->DeviceType == D3DDEVTYPE_REF )
  65.                         MANGODisplaySwitchingToREFWarning();
  66.         }

  67.         return true;
  68. }

  69. //-----------------------------------------------------------------------------
  70. // Desc: 渲染场景
  71. //-----------------------------------------------------------------------------
  72. void CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime,
  73.                                                         float fElapsedTime, void* pUserContext )
  74. {
  75.         HRESULT hr;
  76.         //清除后台颜色缓冲区和深度缓冲区
  77.         V( pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
  78.                 D3DCOLOR_ARGB(0, 45, 50, 170), 1.0f, 0) );

  79.         //渲染场景
  80.         if( SUCCEEDED( pd3dDevice->BeginScene() ) )
  81.         {
  82.                 //渲染文本和控件
  83.                 MANGO_BeginPerfEvent( MANGO_PERFEVENTCOLOR, L"HUD / Stats" );
  84.                 MANGO_EndPerfEvent();

  85.                 V( pd3dDevice->EndScene() );
  86.         }
  87. }</font>
复制代码
接下来详细解释每一段代码的意义:

1.头文件
  1. //=============================================================================
  2. // Desc: Direct3D应用程序框架
  3. //=============================================================================
  4. #include "../MangoInterface/interface/Mango.h"
  5. //-----------------------------------------------------------------------------
复制代码
头文件中首先调用了MangoGUI的接口文件“Mango.h“。在GUI中需要调用的控件都从这个接口中获取。

2.定义GUI系统回调函数
  1. bool    CALLBACK IsDeviceAcceptable( D3DCAPS9* pCaps, D3DFORMAT AdapterFormat, D3DFORMAT BackBufferFormat, bool bWindowed, void* pUserContext );
  2. bool    CALLBACK ModifyDeviceSettings( MANGODeviceSettings* pDeviceSettings, const D3DCAPS9* pCaps, void* pUserContext );
  3. void    CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext );
复制代码
MangoGUI提供了丰富的接口函数,这些函数全是依靠回调机制调用的,我们先接触其中的三个函数:IsDeviceAcceptable,ModifyDeviceSettings和OnFrameRender。

IsDeviceAcceptable函数设备初始化的时候调用,在创建某个Direct3D渲染设备之前,如果需要对渲染设备的特征进行检查,查看设备是否支持需要的功能,可将检查代码写在函数IsD3D9DeviceAcceptable()中。

在某个渲染设备创建之前,如果需要修改该渲染设备的设置,可将代码写在函数ModifyDeviceSettings()中。MangoGUI接下来就根据设置(或者是默认设置)创建最适合当前硬件的Direct3D渲染设备。例如,当硬件不支持某些功能时,可以通过使用参考设备进行模拟,设置使用参考设备代码通常写在该函数中。

OnFrameRender函数 就是标准dx中的Render函数的步骤,也就是绘制窗口中的蓝色背景的部分。这个函数在以后我们将详细讲。

3.WinMain函数是入口函数。
  1. INT WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
复制代码
在开始将OnFrameRender函数设定为MangoGUI渲染回调。
接下来MANGOInit();初始化窗口属性类型。
MANGOCreateWindow( L"MangoGUI System  v 0.1.53" );设定创建窗口的窗口标题。
MANGOCreateDevice(D3DADAPTER_DEFAULT, true, 640, 480, IsDeviceAcceptable, ModifyDeviceSettings)这里才是真正的设定d3dpp属性的地方,其中后面两个参数是设定的两个回调函数。

MANGOMainLoop();这里才是处理消息循环的地方。这里几乎不用管。
最后是MANGOGetExitCode()程序返回代码。

MANGOGUI是一个框架程序 ,一旦框架搭设完毕,就在框架中添加代码或者类就可以了,非常方便。

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2024-4-27 23:18

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表