|
本帖最后由 夜行的猫仔 于 2012-8-28 10:27 编辑
需要使用MangoGUI创建创建窗体有两种方法:
一种是自己创建窗口将MangoGUI绑定到自己创建的窗口上,另外一个方法是通过MangoGUI创建,这两种方法创建得到的都是标准win32 API 窗口。大家可以根据自己的项目需求选用创建模式。这里给大家讲如何使用MangoGUI创建新窗体。
首先创建新的win32窗口工程。在项目属性的连接器属性中添加如下库:- dxerr.lib
- dxguid.lib
- d3dx9d.lib
- d3d9.lib
- winmm.lib
- comctl32.lib
- ..\MangoInterface\lib\MangoGUI2005_lib.lib
复制代码 其中最后一个库是通过源代码MangoGUI编译生成的lib静态库文件,路径可以自行修改。
以下是窗体创建完整代码:- <font size="1">//=============================================================================
- // Desc: Direct3D应用程序框架
- //=============================================================================
- #include "../MangoInterface/interface/Mango.h"
- //-----------------------------------------------------------------------------
- // 全局变量
- //-----------------------------------------------------------------------------
- //-----------------------------------------------------------------------------
- // Desc: 函数声明
- //------------------------------------------------------------------------------
- bool CALLBACK IsDeviceAcceptable( D3DCAPS9* pCaps, D3DFORMAT AdapterFormat, D3DFORMAT BackBufferFormat, bool bWindowed, void* pUserContext );
- bool CALLBACK ModifyDeviceSettings( MANGODeviceSettings* pDeviceSettings, const D3DCAPS9* pCaps, void* pUserContext );
- void CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext );
- //-----------------------------------------------------------------------------
- // Desc: 入口函数
- //-----------------------------------------------------------------------------
- INT WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
- {
- //为Debug配置启用运行时内存检查功能
- #if defined(DEBUG) | defined(_DEBUG)
- _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
- #endif
- //初始化MANGO, 创建窗口, 创建Direct3D设备对象
- MANGOSetFrameRender( OnFrameRender );
- MANGOInit( );
- MANGOCreateWindow( L"MangoGUI System v 0.1.53" );
- MANGOCreateDevice( D3DADAPTER_DEFAULT, true, 640, 480, IsDeviceAcceptable, ModifyDeviceSettings );
- //进入消息循环和场景渲染
- MANGOMainLoop();
- //在此进行应用程序相关的清除工作
- return MANGOGetExitCode();
- }
- //-----------------------------------------------------------------------------
- // Desc: 设备能力检查
- //-----------------------------------------------------------------------------
- bool CALLBACK IsDeviceAcceptable( D3DCAPS9* pCaps, D3DFORMAT AdapterFormat,
- D3DFORMAT BackBufferFormat, bool bWindowed,
- void* pUserContext )
- {
- IDirect3D9* pD3D = MANGOGetD3DObject();
- if( FAILED( pD3D->CheckDeviceFormat( pCaps->AdapterOrdinal, pCaps->DeviceType,
- AdapterFormat, D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING,
- D3DRTYPE_TEXTURE, BackBufferFormat ) ) )
- return false;
- return true;
- }
- //-----------------------------------------------------------------------------
- // Desc: 修改Direct3D渲染设备设置
- //-----------------------------------------------------------------------------
- bool CALLBACK ModifyDeviceSettings( MANGODeviceSettings* pDeviceSettings,
- const D3DCAPS9* pCaps, void* pUserContext )
- {
- pDeviceSettings->pp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
- //如果不支持硬件顶点处理则使用软件顶点处理
- if( (pCaps->DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) == 0)
- {
- pDeviceSettings->BehaviorFlags = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
- }
- //如果使用参考设备,则弹出警告对话框
- static bool s_bFirstTime = true;
- if( s_bFirstTime )
- {
- s_bFirstTime = false;
- if( pDeviceSettings->DeviceType == D3DDEVTYPE_REF )
- MANGODisplaySwitchingToREFWarning();
- }
- return true;
- }
- //-----------------------------------------------------------------------------
- // Desc: 渲染场景
- //-----------------------------------------------------------------------------
- void CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime,
- float fElapsedTime, void* pUserContext )
- {
- HRESULT hr;
- //清除后台颜色缓冲区和深度缓冲区
- V( pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
- D3DCOLOR_ARGB(0, 45, 50, 170), 1.0f, 0) );
- //渲染场景
- if( SUCCEEDED( pd3dDevice->BeginScene() ) )
- {
- //渲染文本和控件
- MANGO_BeginPerfEvent( MANGO_PERFEVENTCOLOR, L"HUD / Stats" );
- MANGO_EndPerfEvent();
- V( pd3dDevice->EndScene() );
- }
- }</font>
复制代码 接下来详细解释每一段代码的意义:
1.头文件- //=============================================================================
- // Desc: Direct3D应用程序框架
- //=============================================================================
- #include "../MangoInterface/interface/Mango.h"
- //-----------------------------------------------------------------------------
复制代码 头文件中首先调用了MangoGUI的接口文件“Mango.h“。在GUI中需要调用的控件都从这个接口中获取。
2.定义GUI系统回调函数- bool CALLBACK IsDeviceAcceptable( D3DCAPS9* pCaps, D3DFORMAT AdapterFormat, D3DFORMAT BackBufferFormat, bool bWindowed, void* pUserContext );
- bool CALLBACK ModifyDeviceSettings( MANGODeviceSettings* pDeviceSettings, const D3DCAPS9* pCaps, void* pUserContext );
- 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函数是入口函数。- 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是一个框架程序 ,一旦框架搭设完毕,就在框架中添加代码或者类就可以了,非常方便。
|
|