DXUT(add text,add control)

《精通Direct X 3D图形与动画程序设计》中的DXUT再老了,不能再我这运行(VS2008,WIN7),因此下了最新的AppFrame再次基础上加上了text和control。。终于把DXUT解决了。继续。。

//--------------------------------------------------------------------------------------
// File: EmptyProject.cpp
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//--------------------------------------------------------------------------------------
#include "DXUT.h"
#include "DXUTcamera.h"
#include "DXUTsettingsdlg.h"
#include "SDKmisc.h"
#include "resource.h"
//-----------------------------------------------------------------------------
// 全局变量
//-----------------------------------------------------------------------------
ID3DXFont*                 g_pFont = NULL;          //ID3DXFont字体对象
ID3DXSprite*               g_pTextSprite = NULL;    //ID3DXSprite文本精灵对象
bool                       g_bShowHelp = true;      //标识是否显示简单帮助信息

CDXUTDialogResourceManager g_DialogResourceManager; //对话框资源管理器
CD3DSettingsDlg            g_SettingsDlg;           //Direct3D设备设置对话框
CDXUTDialog                g_HUD;                   //对话框
CDXUTDialog                g_SampleUI;              //对话框
//-----------------------------------------------------------------------------
// 控件ID
//-----------------------------------------------------------------------------
#define IDC_TOGGLEFULLSCREEN      1
#define IDC_TOGGLEREF             2
#define IDC_CHANGEDEVICE          3

void RenderText();
void CALLBACK OnGUIEvent( UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserContext );

//-----------------------------------------------------------------------------
// Desc: 应用程序相关初始化
//-----------------------------------------------------------------------------
void InitApp()
{
 //初始化对话框
 g_SettingsDlg.Init( &g_DialogResourceManager );
 g_HUD.Init( &g_DialogResourceManager );
 g_SampleUI.Init( &g_DialogResourceManager );

 //为g_HUD对话框设置消息处理函数,添加控件
 g_HUD.SetCallback( OnGUIEvent ); int iY = 10;
 g_HUD.AddButton( IDC_TOGGLEFULLSCREEN, L"Toggle full screen", 35, iY, 125, 22 );
 g_HUD.AddButton( IDC_TOGGLEREF, L"Toggle REF (F3)", 35, iY += 24, 125, 22 );
 g_HUD.AddButton( IDC_CHANGEDEVICE, L"Change device (F2)", 35, iY += 24, 125, 22, VK_F2 );

 //为g_SampleUI对话框设置消息处理函数,添加控件
 /*
 g_SampleUI.SetCallback( OnGUIEvent ); iY = 10;
 g_SampleUI.AddComboBox( 19, 35, iY += 24, 125, 22 );
 g_SampleUI.GetComboBox( 19 )->AddItem( L"Text1", NULL );
 g_SampleUI.GetComboBox( 19 )->AddItem( L"Text2", NULL );
 g_SampleUI.GetComboBox( 19 )->AddItem( L"Text3", NULL );
 g_SampleUI.GetComboBox( 19 )->AddItem( L"Text4", NULL );
 g_SampleUI.AddCheckBox( 21, L"Checkbox1", 35, iY += 24, 125, 22 );
 g_SampleUI.AddCheckBox( 11, L"Checkbox2", 35, iY += 24, 125, 22 );
 g_SampleUI.AddRadioButton( 12, 1, L"Radio1G1", 35, iY += 24, 125, 22 );
 g_SampleUI.AddRadioButton( 13, 1, L"Radio2G1", 35, iY += 24, 125, 22 );
 g_SampleUI.AddRadioButton( 14, 1, L"Radio3G1", 35, iY += 24, 125, 22 );
 g_SampleUI.GetRadioButton( 14 )->SetChecked( true );
 g_SampleUI.AddButton( 17, L"Button1", 35, iY += 24, 125, 22 );
 g_SampleUI.AddButton( 18, L"Button2", 35, iY += 24, 125, 22 );
 g_SampleUI.AddRadioButton( 15, 2, L"Radio1G2", 35, iY += 24, 125, 22 );
 g_SampleUI.AddRadioButton( 16, 2, L"Radio2G3", 35, iY += 24, 125, 22 );
 g_SampleUI.GetRadioButton( 16 )->SetChecked( true );
 g_SampleUI.AddSlider( 20, 50, iY += 24, 100, 22 );
 g_SampleUI.GetSlider( 20 )->SetRange( 0, 100 );
 g_SampleUI.GetSlider( 20 )->SetValue( 50 );
 g_SampleUI.AddEditBox( 20, L"Test", 35, iY += 24, 125, 32 );
 */
}
//--------------------------------------------------------------------------------------
// Rejects any D3D9 devices that aren't acceptable to the app by returning false
//--------------------------------------------------------------------------------------
bool CALLBACK IsD3D9DeviceAcceptable( D3DCAPS9* pCaps, D3DFORMAT AdapterFormat, D3DFORMAT BackBufferFormat,
                                      bool bWindowed, void* pUserContext )
{
    // Typically want to skip back buffer formats that don't support alpha blending
    IDirect3D9* pD3D = DXUTGetD3D9Object();
    if( FAILED( pD3D->CheckDeviceFormat( pCaps->AdapterOrdinal, pCaps->DeviceType,
                                         AdapterFormat, D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING,
                                         D3DRTYPE_TEXTURE, BackBufferFormat ) ) )
        return false;

    return true;
}


//--------------------------------------------------------------------------------------
// Before a device is created, modify the device settings as needed
//--------------------------------------------------------------------------------------
bool CALLBACK ModifyDeviceSettings( DXUTDeviceSettings* pDeviceSettings,void* pUserContext )
{
 HRESULT hr;
 IDirect3D9* pD3D = DXUTGetD3D9Object();
 D3DCAPS9 caps;
 V( pD3D->GetDeviceCaps( pDeviceSettings->d3d9.AdapterOrdinal,
  pDeviceSettings->d3d9.DeviceType,
  &caps ) );
 //如果不支持硬件顶点处理则使用软件顶点处理
 if( (caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) == 0)
 {
  pDeviceSettings->d3d9.BehaviorFlags = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
 }

 //如果使用参考设备,则弹出警告对话框
 static bool s_bFirstTime = true;
 if( s_bFirstTime )
 {
  s_bFirstTime = false;
  if( pDeviceSettings->d3d10.DriverType == D3DDEVTYPE_REF )
   DXUTDisplaySwitchingToREFWarning(pDeviceSettings->ver);
 }

 return true;
}


//--------------------------------------------------------------------------------------
// Create any D3D9 resources that will live through a device reset (D3DPOOL_MANAGED)
// and aren't tied to the back buffer size
//--------------------------------------------------------------------------------------
HRESULT CALLBACK OnD3D9CreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc,
                                     void* pUserContext )
{
 HRESULT hr;

 V_RETURN( g_DialogResourceManager.OnD3D9CreateDevice( pd3dDevice ) );
 V_RETURN( g_SettingsDlg.OnD3D9CreateDevice( pd3dDevice ) );
 //创建字体
 V_RETURN( D3DXCreateFont( pd3dDevice, 15, 0, FW_BOLD, 1, FALSE, DEFAULT_CHARSET,
  OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,
  L"Arial", &g_pFont ) );

    return S_OK;
}


//--------------------------------------------------------------------------------------
// Create any D3D9 resources that won't live through a device reset (D3DPOOL_DEFAULT)
// or that are tied to the back buffer size
//--------------------------------------------------------------------------------------
HRESULT CALLBACK OnD3D9ResetDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc,
                                    void* pUserContext )
{

 HRESULT hr;

 V_RETURN( g_DialogResourceManager.OnD3D9ResetDevice() );
 V_RETURN( g_SettingsDlg.OnD3D9ResetDevice() );

 //设置对话框位置和尺寸
 g_HUD.SetLocation( pBackBufferSurfaceDesc->Width-170, 0 );
 g_HUD.SetSize( 170, 170 );
 g_SampleUI.SetLocation( pBackBufferSurfaceDesc->Width-170,
  pBackBufferSurfaceDesc->Height-350 );
 g_SampleUI.SetSize( 170, 300 );

 //恢复字体
 if( g_pFont )
  V_RETURN( g_pFont->OnResetDevice() );

 //创建ID3DXSprite接口对象
 V_RETURN( D3DXCreateSprite( pd3dDevice, &g_pTextSprite ) );

 //设置观察矩阵
 D3DXMATRIXA16 matView;
 D3DXVECTOR3 vEyePt( 0.0f, 0.0f,-5 );
 D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );
 D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );
 D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );
 pd3dDevice->SetTransform( D3DTS_VIEW, &matView );

 //设置投影矩阵
 D3DXMATRIXA16 matProj;
 float fAspectRatio = (float)pBackBufferSurfaceDesc->Width / pBackBufferSurfaceDesc->Height;
 D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, fAspectRatio, 1.0f, 100.0f );
 pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );

    return S_OK;
}


//--------------------------------------------------------------------------------------
// Handle updates to the scene.  This is called regardless of which D3D API is used
//--------------------------------------------------------------------------------------
void CALLBACK OnFrameMove( double fTime, float fElapsedTime, void* pUserContext )
{
}


//--------------------------------------------------------------------------------------
// Render the scene using the D3D9 device
//--------------------------------------------------------------------------------------
void CALLBACK OnD3D9FrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
{
    HRESULT hr;

 //如果正在利用Direct3D设备设置对话框进行设置, 则不渲染场景
 if( g_SettingsDlg.IsActive() )
 {
  g_SettingsDlg.OnRender( fElapsedTime );
  return;
 }

    // Clear the render target and the zbuffer
    V( pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB( 0, 45, 50, 170 ), 1.0f, 0 ) );

    // Render the scene
    if( SUCCEEDED( pd3dDevice->BeginScene() ) )
    {
  //渲染文本
  DXUT_BeginPerfEvent( DXUT_PERFEVENTCOLOR, L"HUD / Stats" );
  RenderText();
  V( g_HUD.OnRender( fElapsedTime ) );
  V( g_SampleUI.OnRender( fElapsedTime ) );
  DXUT_EndPerfEvent();

        V( pd3dDevice->EndScene() );
    }
}

//-----------------------------------------------------------------------------
// Desc: 渲染文本
//-----------------------------------------------------------------------------
void RenderText()
{
 CDXUTTextHelper txtHelper( g_pFont, g_pTextSprite, 15 );

 //显示当前Direct3D设备状态和渲染帧速率
 txtHelper.Begin();
 txtHelper.SetInsertionPos( 5, 5 );
 txtHelper.SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 0.0f, 1.0f ) );
 txtHelper.DrawTextLine( DXUTGetFrameStats(true) );
 txtHelper.DrawTextLine( DXUTGetDeviceStats() );

 //显示其他简要信息
 txtHelper.SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f ) );
 txtHelper.DrawTextLine( L"Put whatever misc status here" );

 //显示简单帮助文本
 const D3DSURFACE_DESC* pd3dsdBackBuffer = DXUTGetD3D9BackBufferSurfaceDesc();
 if( g_bShowHelp )
 {
  txtHelper.SetInsertionPos( 10, pd3dsdBackBuffer->Height-15*6 );
  txtHelper.SetForegroundColor( D3DXCOLOR( 1.0f, 0.75f, 0.0f, 1.0f ) );
  txtHelper.DrawTextLine( L"Controls (F1 to hide):" );

  txtHelper.SetInsertionPos( 40, pd3dsdBackBuffer->Height-15*5 );
  txtHelper.DrawTextLine( L"Quit: ESC" );
 }
 else
 {
  txtHelper.SetInsertionPos( 10, pd3dsdBackBuffer->Height-15*2 );
  txtHelper.SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f ) );
  txtHelper.DrawTextLine( L"Press F1 for help" );
 }
 txtHelper.End();
}

//-----------------------------------------------------------------------------
// Desc: 消息处理
//-----------------------------------------------------------------------------
LRESULT CALLBACK MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
       bool* pbNoFurtherProcessing, void* pUserContext )
{
 *pbNoFurtherProcessing = g_DialogResourceManager.MsgProc( hWnd, uMsg, wParam, lParam );
 if( *pbNoFurtherProcessing )
  return 0;

 if( g_SettingsDlg.IsActive() )
 {
  g_SettingsDlg.MsgProc( hWnd, uMsg, wParam, lParam );
  return 0;
 }

 *pbNoFurtherProcessing = g_HUD.MsgProc( hWnd, uMsg, wParam, lParam );
 if( *pbNoFurtherProcessing )
  return 0;

 *pbNoFurtherProcessing = g_SampleUI.MsgProc( hWnd, uMsg, wParam, lParam );
 if( *pbNoFurtherProcessing )
  return 0;

 return 0;
}

//-----------------------------------------------------------------------------
// Desc: 键盘消息处理
//-----------------------------------------------------------------------------
void CALLBACK KeyboardProc( UINT nChar, bool bKeyDown, bool bAltDown, void* pUserContext )
{
 if( bKeyDown )
 {
  switch( nChar )
  {
  case VK_F1: g_bShowHelp = !g_bShowHelp; break;
  }
 }
}

//-----------------------------------------------------------------------------
// Desc: 处理各种控件消息
//-----------------------------------------------------------------------------
void CALLBACK OnGUIEvent( UINT nEvent, int nControlID, CDXUTControl* pControl,
       void* pUserContext )
{
 switch( nControlID )
 {
 case IDC_TOGGLEFULLSCREEN:
  DXUTToggleFullScreen();
  break;

 case IDC_TOGGLEREF:
  DXUTToggleREF();
  break;

 case IDC_CHANGEDEVICE:
  g_SettingsDlg.SetActive( !g_SettingsDlg.IsActive() );
  break;
 }
}
//--------------------------------------------------------------------------------------
// Release D3D9 resources created in the OnD3D9ResetDevice callback
//--------------------------------------------------------------------------------------
void CALLBACK OnD3D9LostDevice( void* pUserContext )
{
 g_DialogResourceManager.OnD3D9LostDevice();
 g_SettingsDlg.OnD3D9LostDevice();
 if( g_pFont )
  g_pFont->OnLostDevice();
 SAFE_RELEASE( g_pTextSprite );
}


//--------------------------------------------------------------------------------------
// Release D3D9 resources created in the OnD3D9CreateDevice callback
//--------------------------------------------------------------------------------------
void CALLBACK OnD3D9DestroyDevice( void* pUserContext )
{
 g_DialogResourceManager.OnD3D9DestroyDevice();
 g_SettingsDlg.OnD3D9DestroyDevice();
 SAFE_RELEASE( g_pFont );
}


//--------------------------------------------------------------------------------------
// Initialize everything and go into a render loop
//--------------------------------------------------------------------------------------
INT WINAPI wWinMain( HINSTANCE, HINSTANCE, LPWSTR, int )
{
    // Enable run-time memory check for debug builds.
#if defined(DEBUG) | defined(_DEBUG)
    _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
#endif

    // Set the callback functions
    DXUTSetCallbackD3D9DeviceAcceptable( IsD3D9DeviceAcceptable );
    DXUTSetCallbackD3D9DeviceCreated( OnD3D9CreateDevice );
    DXUTSetCallbackD3D9DeviceReset( OnD3D9ResetDevice );
    DXUTSetCallbackD3D9FrameRender( OnD3D9FrameRender );
    DXUTSetCallbackD3D9DeviceLost( OnD3D9LostDevice );
    DXUTSetCallbackD3D9DeviceDestroyed( OnD3D9DestroyDevice );
    DXUTSetCallbackDeviceChanging( ModifyDeviceSettings );
    DXUTSetCallbackMsgProc( MsgProc );
    DXUTSetCallbackFrameMove( OnFrameMove );

    // TODO: Perform any application-level initialization here

 InitApp();
    // Initialize DXUT and create the desired Win32 window and Direct3D device for the application
    DXUTInit( true, true ); // Parse the command line and show msgboxes
    DXUTSetHotkeyHandling( true, true, true );  // handle the default hotkeys
    DXUTSetCursorSettings( true, true ); // Show the cursor and clip it when in full screen
    DXUTCreateWindow( L"EmptyProject" );
    DXUTCreateDevice( true, 640, 480 );

    // Start the render loop
    DXUTMainLoop();

    // TODO: Perform any application-level cleanup here

    return DXUTGetExitCode();
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值