|  | 
 
| 本帖最后由 夜行的猫仔 于 2012-8-28 10:27 编辑 
 需要使用MangoGUI创建创建窗体有两种方法:
 一种是自己创建窗口将MangoGUI绑定到自己创建的窗口上,另外一个方法是通过MangoGUI创建,这两种方法创建得到的都是标准win32 API 窗口。大家可以根据自己的项目需求选用创建模式。这里给大家讲如何使用MangoGUI创建新窗体。
 
 首先创建新的win32窗口工程。在项目属性的连接器属性中添加如下库:
 其中最后一个库是通过源代码MangoGUI编译生成的lib静态库文件,路径可以自行修改。复制代码dxerr.lib
dxguid.lib
d3dx9d.lib
d3d9.lib
winmm.lib
comctl32.lib
..\MangoInterface\lib\MangoGUI2005_lib.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.头文件
 头文件中首先调用了MangoGUI的接口文件“Mango.h“。在GUI中需要调用的控件都从这个接口中获取。复制代码//=============================================================================
// Desc: Direct3D应用程序框架
//=============================================================================
#include "../MangoInterface/interface/Mango.h"
//-----------------------------------------------------------------------------
 2.定义GUI系统回调函数
 MangoGUI提供了丰富的接口函数,这些函数全是依靠回调机制调用的,我们先接触其中的三个函数:IsDeviceAcceptable,ModifyDeviceSettings和OnFrameRender。复制代码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 );
 IsDeviceAcceptable函数设备初始化的时候调用,在创建某个Direct3D渲染设备之前,如果需要对渲染设备的特征进行检查,查看设备是否支持需要的功能,可将检查代码写在函数IsD3D9DeviceAcceptable()中。
 
 在某个渲染设备创建之前,如果需要修改该渲染设备的设置,可将代码写在函数ModifyDeviceSettings()中。MangoGUI接下来就根据设置(或者是默认设置)创建最适合当前硬件的Direct3D渲染设备。例如,当硬件不支持某些功能时,可以通过使用参考设备进行模拟,设置使用参考设备代码通常写在该函数中。
 
 OnFrameRender函数 就是标准dx中的Render函数的步骤,也就是绘制窗口中的蓝色背景的部分。这个函数在以后我们将详细讲。
 
 3.WinMain函数是入口函数。
 在开始将OnFrameRender函数设定为MangoGUI渲染回调。复制代码INT WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
接下来MANGOInit();初始化窗口属性类型。
 MANGOCreateWindow( L"MangoGUI System  v 0.1.53" );设定创建窗口的窗口标题。
 MANGOCreateDevice(D3DADAPTER_DEFAULT, true, 640, 480, IsDeviceAcceptable, ModifyDeviceSettings)这里才是真正的设定d3dpp属性的地方,其中后面两个参数是设定的两个回调函数。
 
 MANGOMainLoop();这里才是处理消息循环的地方。这里几乎不用管。
 最后是MANGOGetExitCode()程序返回代码。
 
 MANGOGUI是一个框架程序 ,一旦框架搭设完毕,就在框架中添加代码或者类就可以了,非常方便。
 
 | 
 |