青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天行健 君子當自強而不息

DXUT框架剖析(13)

添加文本

DXUT框架對文本繪制進行了封裝,提供了類CDXUTHelper來簡化文本顯示,使用該接口大體分為3個步驟:初始化ID3DXSprite和ID3DXFont對象,顯示文本,釋放ID3DXSprite和ID3DXFont對象。

首先來看看CDXUTHelper的定義部分:

//--------------------------------------------------------------------------------------
// Manages the insertion point when drawing text
//--------------------------------------------------------------------------------------
class CDXUTTextHelper
{
public:
    CDXUTTextHelper( ID3DXFont
* pFont, ID3DXSprite* pSprite, int nLineHeight );

    
void SetInsertionPos( int x, int y )     { m_pt.x = x; m_pt.y = y; }
    
void SetForegroundColor( D3DXCOLOR clr ) { m_clr = clr; }

    
void Begin();
    HRESULT DrawFormattedTextLine( 
const WCHAR* strMsg,  );
    HRESULT DrawTextLine( 
const WCHAR* strMsg );
    HRESULT DrawFormattedTextLine( RECT 
&rc, DWORD dwFlags, const WCHAR* strMsg,  );
    HRESULT DrawTextLine( RECT 
&rc, DWORD dwFlags, const WCHAR* strMsg );
    
void End();

protected:
    ID3DXFont
*   m_pFont;
    ID3DXSprite
* m_pSprite;
    D3DXCOLOR    m_clr;
    POINT        m_pt;
    
int          m_nLineHeight;
};

 

接著來看看CDXUTHelper的實現(xiàn)部分:

//--------------------------------------------------------------------------------------

CDXUTTextHelper::CDXUTTextHelper( ID3DXFont
* pFont, ID3DXSprite* pSprite, int nLineHeight )
{
    m_pFont          
= pFont;
    m_pSprite      
= pSprite;
    m_clr          
= D3DXCOLOR(1,1,1,1);
    m_pt.x          
= 0
    m_pt.y          
= 0
    m_nLineHeight 
= nLineHeight;
}

//--------------------------------------------------------------------------------------

HRESULT CDXUTTextHelper::DrawFormattedTextLine( 
const WCHAR* strMsg,  )
{
    WCHAR strBuffer[
512];
    
    va_list args;
    va_start(args, strMsg);
    StringCchVPrintf( strBuffer, 
512, strMsg, args );
    strBuffer[
511= L'\0';
    va_end(args);

    
return DrawTextLine( strBuffer );
}

HRESULT CDXUTTextHelper::DrawTextLine( 
const WCHAR* strMsg )
{
    
if( NULL == m_pFont ) 
        
return DXUT_ERR_MSGBOX( L"DrawTextLine", E_INVALIDARG );    

    RECT rc;
    SetRect( 
&rc, m_pt.x, m_pt.y, 00 ); 

    HRESULT hr 
= m_pFont->DrawText( m_pSprite, strMsg, -1&rc, DT_NOCLIP, m_clr );

    
if( FAILED(hr) )
        
return DXTRACE_ERR_MSGBOX( L"DrawText", hr );

    m_pt.y 
+= m_nLineHeight;

    
return S_OK;
}


HRESULT CDXUTTextHelper::DrawFormattedTextLine( RECT 
&rc, DWORD dwFlags, const WCHAR* strMsg,  )
{
    WCHAR strBuffer[
512];
    
    va_list args;
    va_start(args, strMsg);
    StringCchVPrintf( strBuffer, 
512, strMsg, args );
    strBuffer[
511= L'\0';
    va_end(args);

    
return DrawTextLine( rc, dwFlags, strBuffer );
}


HRESULT CDXUTTextHelper::DrawTextLine( RECT 
&rc, DWORD dwFlags, const WCHAR* strMsg )
{
    
if( NULL == m_pFont ) 
        
return DXUT_ERR_MSGBOX( L"DrawTextLine", E_INVALIDARG );
    
    HRESULT hr 
= m_pFont->DrawText( m_pSprite, strMsg, -1&rc, dwFlags, m_clr );

    
if( FAILED(hr) )
        
return DXTRACE_ERR_MSGBOX( L"DrawText", hr );

    m_pt.y 
+= m_nLineHeight;

    
return S_OK;
}


//--------------------------------------------------------------------------------------

void CDXUTTextHelper::Begin()
{
    
if( m_pSprite )
        m_pSprite
->Begin( D3DXSPRITE_ALPHABLEND | D3DXSPRITE_SORT_TEXTURE );
}

void CDXUTTextHelper::End()
{
    
if( m_pSprite )
        m_pSprite
->End();
}

 

代碼相當簡潔明了,需要說明的是函數(shù)StringCchVPrintf: 
StringCchVPrintf is a replacement for vsprintf. It accepts a format string and its arguments, provided as a va_list, and returns a formatted string. The size, in characters, of the destination buffer is provided to the function to ensure that StringCchVPrintf does not write past the end of this buffer.

Syntax

HRESULT StringCchVPrintf(      

    LPTSTR pszDest,
    size_t cchDest,
    LPCTSTR pszFormat,
    va_list argList
);

Parameters

pszDest
[out] Pointer to a buffer which receives the formatted, null-terminated string created from pszFormat and argList.
cchDest
[in] Size of the destination buffer, in characters. This value must be sufficiently large to accommodate the final formatted string plus 1 to account for the terminating null character. The maximum number of characters allowed is STRSAFE_MAX_CCH.
pszFormat
[in] Pointer to a buffer containing a printf-style format string. This string must be null-terminated.
argList
[in] A va_list containing the arguments to be inserted into pszFormat.

Return Value

Note that this function returns an HRESULT as opposed to vsprintf, which returns the number of characters written. It is strongly recommended that you use the SUCCEEDED and FAILED macros to test the return value of this function.

S_OK There was sufficient space for the result to be copied to pszDest without truncation and the buffer is null-terminated.
STRSAFE_E_INVALID_PARAMETER The value in cchDest is either 0 or larger than STRSAFE_MAX_CCH.
STRSAFE_E_INSUFFICIENT_BUFFER The copy operation failed due to insufficient buffer space. The destination buffer contains a truncated, null-terminated version of the intended result. In situations where truncation is acceptable, this may not necessarily be seen as a failure condition.
 

Remarks

StringCchVPrintf provides additional processing for proper buffer handling in your code. Poor buffer handling is implicated in many security issues that involve buffer overruns. StringCchVPrintf always null-terminates a non-zero-length destination buffer.

For more information on va_lists, see the conventions defined in Stdarg.h.

StringCchVPrintf can be used in its generic form, or specifically as StringCchVPrintfA (for ANSI strings) or StringCchVPrintfW (for Unicode strings). The form to use is determined by your data.

String Data Type String Literal Function
char "string" StringCchVPrintfA
TCHAR TEXT("string") StringCchVPrintf
WCHAR L"string" StringCchVPrintfW
 

StringCchVPrintf and its ANSI and Unicode variants are replacements for these functions:

  • vsprintf
  • vswprintf
  • wvsprintf
  • wvnsprintf
  • _vstprintf
  • _vsnprintf
  • _vsnwprintf
  • _vsntprintf

Behavior is undefined if the strings pointed to by pszDest, pszFormat, or any argument strings overlap.

Neither pszFormat nor pszDest should be NULL. See StringCchVPrintfEx if you require the handling of null string pointer values.

以及ID3DXSprite::Begin()的聲明:

Prepares a device for drawing sprites.

HRESULT Begin(
DWORD Flags
);

Parameters

Flags
[in] Combination of zero or more flags that describe sprite rendering options. For this method, the valid flags are:
  • D3DXSPRITE_ALPHABLEND
  • D3DXSprite__BILLBOARD
  • D3DXSPRITE_DONOTMODIFY_RENDERSTATE
  • D3DXSPRITE_DONOTSAVESTATE
  • D3DXSPRITE_OBJECTSPACE
  • D3DXSprite__SORT_DEPTH_BACKTOFRONT
  • D3DXSprite__SORT_DEPTH_FRONTTOBACK
  • D3DXSprite__SORT_TEXTURE
For a description of the flags and for information on how to control device state capture and device view transforms, see D3DXSPRITE.

Return Values

If the method succeeds, the return value is S_OK. If the method fails, the return value can be one of the following: D3DERR_INVALIDCALL, D3DERR_OUTOFVIDEOMEMORY, D3DXERR_INVALIDDATA, E_OUTOFMEMORY.

Remarks

This method must be called from inside a IDirect3DDevice9::BeginScene . . . IDirect3DDevice9::EndScene sequence. ID3DXSprite::Begin cannot be used as a substitute for either IDirect3DDevice9::BeginScene or ID3DXRenderToSurface::BeginScene.

This method will set the following states on the device.

Render States:

Type (D3DRENDERSTATETYPE) Value
D3DRS_ALPHABLENDENABLE TRUE
D3DRS_ALPHAFUNC D3DCMP_GREATER
D3DRS_ALPHAREF 0x00
D3DRS_ALPHATESTENABLE AlphaCmpCaps
D3DRS_BLENDOP D3DBLENDOP_ADD
D3DRS_CLIPPING TRUE
D3DRS_CLIPPLANEENABLE FALSE
D3DRS_COLORWRITEENABLE D3DCOLORWRITEENABLE_ALPHA | D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_RED
D3DRS_CULLMODE D3DCULL_NONE
D3DRS_DESTBLEND D3DBLEND_INVSRCALPHA
D3DRS_DIFFUSEMATERIALSOURCE D3DMCS_COLOR1
D3DRS_ENABLEADAPTIVETESSELLATION FALSE
D3DRS_FILLMODE D3DFILL_SOLID
D3DRS_FOGENABLE FALSE
D3DRS_INDEXEDVERTEXBLENDENABLE FALSE
D3DRS_LIGHTING FALSE
D3DRS_RANGEFOGENABLE FALSE
D3DRS_SEPARATEALPHABLENDENABLE FALSE
D3DRS_SHADEMODE D3DSHADE_GOURAUD
D3DRS_SPECULARENABLE FALSE
D3DRS_SRCBLEND D3DBLEND_SRCALPHA
D3DRS_SRGBWRITEENABLE FALSE
D3DRS_STENCILENABLE FALSE
D3DRS_VERTEXBLEND FALSE
D3DRS_WRAP0 0

Texture Stage States:

Stage Identifier Type (D3DTEXTURESTAGESTATETYPE) Value
0 D3DTSS_ALPHAARG1 D3DTA_TEXTURE
0 D3DTSS_ALPHAARG2 D3DTA_DIFFUSE
0 D3DTSS_ALPHAOP D3DTOP_MODULATE
0 D3DTSS_COLORARG1 D3DTA_TEXTURE
0 D3DTSS_COLORARG2 D3DTA_DIFFUSE
0 D3DTSS_COLOROP D3DTOP_MODULATE
0 D3DTSS_TEXCOORDINDEX 0
0 D3DTSS_TEXTURETRANSFORMFLAGS D3DTTFF_DISABLE
1 D3DTSS_ALPHAOP D3DTOP_DISABLE
1 D3DTSS_COLOROP D3DTOP_DISABLE

Sampler States:

Sampler Stage Index Type (D3DSAMPLERSTATETYPE) Value
0 D3DSAMP_ADDRESSU D3DTADDRESS_CLAMP
0 D3DSAMP_ADDRESSV D3DTADDRESS_CLAMP
0 D3DSAMP_MAGFILTER D3DTEXF_ANISOTROPIC if TextureFilterCaps includes D3DPTFILTERCAPS_MAGFANISOTROPIC; otherwise D3DTEXF_LINEAR
0 D3DSAMP_MAXMIPLEVEL 0
0 D3DSAMP_MAXANISOTROPY MaxAnisotropy
0 D3DSAMP_MINFILTER D3DTEXF_ANISOTROPIC if TextureFilterCaps includes D3DPTFILTERCAPS_MINFANISOTROPIC; otherwise D3DTEXF_LINEAR
0 D3DSAMP_MIPFILTER D3DTEXF_LINEAR if TextureFilterCaps includes D3DPTFILTERCAPS_MIPFLINEAR; otherwise D3DTEXF_POINT
0 D3DSAMP_MIPMAPLODBIAS 0
0 D3DSAMP_SRGBTEXTURE 0

Note    This method disables N-patches.

D3DXSPRITE

The following flags are used to specify sprite rendering options to the flags parameter in the ID3DXSprite::Begin method:

#define Description
D3DXSPRITE_DONOTSAVESTATE The device state is not to be saved or restored when ID3DXSprite::Begin or ID3DXSprite::End is called.
D3DXSPRITE_DONOTMODIFY_RENDERSTATE The device render state is not to be changed when ID3DXSprite::Begin is called. The device is assumed to be in a valid state to draw vertices containing UsageIndex = 0 in the D3DDECLUSAGE_POSITION, D3DDECLUSAGE_TEXCOORD, and D3DDECLUSAGE_COLOR data.
D3DXSPRITE_OBJECTSPACE The world, view, and projection transforms are not modified. The transforms currently set to the device are used to transform the sprites when the batched sprites are drawn (when ID3DXSprite::Flush or ID3DXSprite::End is called). If this flag is not specified, then world, view, and projection transforms are modified so that sprites are drawn in screen-space coordinates.
D3DXSPRITE_BILLBOARD Each sprite will be rotated about its center so that it is facing the viewer. ID3DXSprite::SetWorldViewLH or ID3DXSprite::SetWorldViewRH must be called first.
D3DXSPRITE_ALPHABLEND Enables alpha blending with D3DRS_ALPHATESTENABLE set to TRUE (for nonzero alpha). D3DBLEND_SRCALPHA will be the source blend state, and D3DBLEND_INVSRCALPHA will be the destination blend state in calls to IDirect3DDevice9::SetRenderState. See Alpha Blending State (Direct3D 9). ID3DXFont expects this flag to be set when drawing text.
D3DXSPRITE_SORT_TEXTURE Sort sprites by texture prior to drawing. This can improve performance when drawing non-overlapping sprites of uniform depth.

You may also combine D3DXSPRITE_SORT_TEXTURE with either D3DXSPRITE_SORT_DEPTH_FRONTTOBACK or D3DXSPRITE_SORT_DEPTH_BACKTOFRONT. This will sort the list of sprites by depth first and texture second.

D3DXSPRITE_SORT_DEPTH_FRONTTOBACK Sprites are sorted by depth in front-to-back order prior to drawing. This procedure is recommended when drawing opaque sprites of varying depths.

You may combine D3DXSPRITE_SORT_DEPTH_FRONTTOBACK with D3DXSPRITE_SORT_TEXTURE to sort first by depth, and second by texture.

D3DXSPRITE_SORT_DEPTH_BACKTOFRONT Sprites are sorted by depth in back-to-front order prior to drawing. This procedure is recommended when drawing transparent sprites of varying depths.

You may combine D3DXSPRITE_SORT_DEPTH_BACKTOFRONT with D3DXSPRITE_SORT_TEXTURE to sort first by depth, and second by texture.

D3DXSPRITE_DO_NOT_ADDREF_TEXTURE Disables calling AddRef() on every draw, and Release() on Flush() for better performance.

 

初始化ID3DXSprite和ID3DXFont對象

在回調函數(shù)OnCreateDevice()中創(chuàng)建ID3DXFont對象:

//--------------------------------------------------------------------------------------
// Create any D3DPOOL_MANAGED resources here
//--------------------------------------------------------------------------------------
HRESULT CALLBACK OnCreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc,
void* pUserContext )
{
D3DXCreateFont(pd3dDevice, 18, 0, FW_BOLD, 1, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH | FF_DONTCARE, L"Arial", &g_font);
    return S_OK;
}

 

繪制文本

//--------------------------------------------------------------------------------------
// Render the helper information
//--------------------------------------------------------------------------------------
void RenderText()
{
CDXUTTextHelper text_helper(g_font, g_text_sprite, 20);
	text_helper.Begin();
	// show frame and device states
text_helper.SetInsertionPos(5, 5);
text_helper.SetForegroundColor( D3DXCOLOR(1.0f, 0.475f, 0.0f, 1.0f) );
text_helper.DrawTextLine( DXUTGetFrameStats(true) );
text_helper.DrawTextLine( DXUTGetDeviceStats() );
	// show other simple information
text_helper.SetForegroundColor( D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f) );
text_helper.DrawTextLine(L"Put whatever misc status here");
	// show helper information
	const D3DSURFACE_DESC* surface_desc = DXUTGetBackBufferSurfaceDesc();
	if(g_show_help)
{
text_helper.SetInsertionPos(10, surface_desc->Height - 15 * 6);
text_helper.SetForegroundColor( D3DXCOLOR(1.0f, 0.475f, 0.0f, 1.0f) );
text_helper.DrawTextLine(L"Controls (F1 to hide):");
		text_helper.SetInsertionPos(40, surface_desc->Height - 15 * 5);
text_helper.DrawTextLine(L"Quir: ESC");
}
else
{
text_helper.SetInsertionPos(10, surface_desc->Height - 15 * 4);
text_helper.SetForegroundColor( D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f) );
text_helper.DrawTextLine(L"Press F1 for help");
}
	text_helper.End();
}

 

處理鍵盤消息

程序通過鍵盤上的"F1"鍵切換來表明是否顯示簡單幫助文本,處理代碼如下:

//--------------------------------------------------------------------------------------
// Handle keybaord event
//--------------------------------------------------------------------------------------
void CALLBACK OnKeyboardProc(UINT charater, bool is_key_down, bool is_alt_down, void* user_context)
{
if(is_key_down)
{
switch(charater)
{
case VK_F1:
g_show_help = !g_show_help;
break;
}
}
}

 

運行效果圖:

 

主程序:

#include "dxstdafx.h"
#include 
"resource.h"

#pragma warning(disable : 
4127)

ID3DXFont
*        g_font;
ID3DXSprite
*    g_text_sprite;
bool            g_show_help = true;

#define release_com(p)    do { if(p) { (p)->Release(); (p) = NULL; } } while(0)

//--------------------------------------------------------------------------------------
// Rejects any devices that aren't acceptable by returning false
//--------------------------------------------------------------------------------------
bool CALLBACK IsDeviceAcceptable( D3DCAPS9* pCaps, D3DFORMAT AdapterFormat, 
                                  D3DFORMAT BackBufferFormat, 
bool bWindowed, void* pUserContext )
{
    
// Typically want to skip backbuffer formats that don't support alpha blending

    IDirect3D9
* pD3D = DXUTGetD3DObject(); 

    
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, const D3DCAPS9* pCaps, void* pUserContext )
{
    
// If video card does not support hardware vertex processing, then uses sofaware vertex processing.
    if((pCaps->DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) == 0)
        pDeviceSettings
->BehaviorFlags = D3DCREATE_SOFTWARE_VERTEXPROCESSING;

    
static bool is_first_time = true;

    
if(is_first_time)
    {
        is_first_time 
= false;

        
// if using reference device, then pop a warning message box.
        if(pDeviceSettings->DeviceType == D3DDEVTYPE_REF)
            DXUTDisplaySwitchingToREFWarning();
    }

    
return true;
}


//--------------------------------------------------------------------------------------
// Create any D3DPOOL_MANAGED resources here 
//--------------------------------------------------------------------------------------
HRESULT CALLBACK OnCreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, 
                                 
void* pUserContext )
{
    D3DXCreateFont(pd3dDevice, 
180, FW_BOLD, 1, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY,
                   DEFAULT_PITCH 
| FF_DONTCARE, L"Arial"&g_font);

    
return S_OK;
}


//--------------------------------------------------------------------------------------
// Create any D3DPOOL_DEFAULT resources here 
//--------------------------------------------------------------------------------------
HRESULT CALLBACK OnResetDevice( IDirect3DDevice9* pd3dDevice, 
                                
const D3DSURFACE_DESC* pBackBufferSurfaceDesc, 
                                
void* pUserContext )
{
    g_font
->OnResetDevice();
    D3DXCreateSprite(pd3dDevice, 
&g_text_sprite);

    
// setup view matrix

    D3DXMATRIX mat_view;
    D3DXVECTOR3 eye(
0.0f0.0f-5.0f);
    D3DXVECTOR3  at(
0.0f0.0f,  0.0f);
    D3DXVECTOR3  up(
0.0f1.0f,  0.0f);

    D3DXMatrixLookAtLH(
&mat_view, &eye, &at, &up);
    pd3dDevice
->SetTransform(D3DTS_VIEW, &mat_view);

    
// set projection matrix
    D3DXMATRIX mat_proj;
    
float aspect = (float)pBackBufferSurfaceDesc->Width / pBackBufferSurfaceDesc->Height;
    D3DXMatrixPerspectiveFovLH(
&mat_proj, D3DX_PI/4, aspect, 1.0f100.0f);
    pd3dDevice
->SetTransform(D3DTS_PROJECTION, &mat_proj);

    
return S_OK;
}

//--------------------------------------------------------------------------------------
// Release resources created in the OnResetDevice callback here 
//--------------------------------------------------------------------------------------
void CALLBACK OnLostDevice( void* pUserContext )
{
    g_font
->OnLostDevice();
    release_com(g_text_sprite);
}


//--------------------------------------------------------------------------------------
// Release resources created in the OnCreateDevice callback here
//--------------------------------------------------------------------------------------
void CALLBACK OnDestroyDevice( void* pUserContext )
{
    release_com(g_font);
}

//--------------------------------------------------------------------------------------
// Handle updates to the scene
//--------------------------------------------------------------------------------------
void CALLBACK OnFrameMove( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
{
}

//--------------------------------------------------------------------------------------
// Render the helper information
//--------------------------------------------------------------------------------------
void RenderText()
{
    CDXUTTextHelper text_helper(g_font, g_text_sprite, 
20);
    
    text_helper.Begin();

    
// show frame and device states
    text_helper.SetInsertionPos(55);
    text_helper.SetForegroundColor( D3DXCOLOR(
1.0f0.475f0.0f1.0f) );
    text_helper.DrawTextLine( DXUTGetFrameStats(
true) );
    text_helper.DrawTextLine( DXUTGetDeviceStats() );

    
// show other simple information
    text_helper.SetForegroundColor( D3DXCOLOR(1.0f1.0f1.0f1.0f) );
    text_helper.DrawTextLine(L
"Put whatever misc status here");

    
// show helper information
    
    
const D3DSURFACE_DESC* surface_desc = DXUTGetBackBufferSurfaceDesc();

    
if(g_show_help)
    {
        text_helper.SetInsertionPos(
10, surface_desc->Height - 15 * 6);
        text_helper.SetForegroundColor( D3DXCOLOR(
1.0f0.475f0.0f1.0f) );
        text_helper.DrawTextLine(L
"Controls (F1 to hide):");
        
        text_helper.SetInsertionPos(
40, surface_desc->Height - 15 * 5);
        text_helper.DrawTextLine(L
"Quir: ESC");
    }
    
else
    {
        text_helper.SetInsertionPos(
10, surface_desc->Height - 15 * 4);
        text_helper.SetForegroundColor( D3DXCOLOR(
1.0f1.0f1.0f1.0f) );
        text_helper.DrawTextLine(L
"Press F1 for help");
    }

    text_helper.End();
}

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

    
// Clear the render target and the zbuffer 
    V( pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(0555), 1.0f0) );

    
// Render the scene
    if( SUCCEEDED( pd3dDevice->BeginScene() ) )
    {
        RenderText();
        V( pd3dDevice
->EndScene() );
    }
}


//--------------------------------------------------------------------------------------
// Handle messages to the application 
//--------------------------------------------------------------------------------------
LRESULT CALLBACK MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, 
                          
bool* pbNoFurtherProcessing, void* pUserContext )
{
    
return 0;
}


//--------------------------------------------------------------------------------------
// Handle keybaord event
//--------------------------------------------------------------------------------------
void CALLBACK OnKeyboardProc(UINT charater, bool is_key_down, bool is_alt_down, void* user_context)
{
    
if(is_key_down)
    {
        
switch(charater)
        {
        
case VK_F1:
            g_show_help 
= !g_show_help;
            
break;
        }
    }
}


//--------------------------------------------------------------------------------------
// Initialize everything and go into a render loop
//--------------------------------------------------------------------------------------
INT WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, 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
    DXUTSetCallbackDeviceCreated( OnCreateDevice );
    DXUTSetCallbackDeviceReset( OnResetDevice );
    DXUTSetCallbackDeviceLost( OnLostDevice );
    DXUTSetCallbackDeviceDestroyed( OnDestroyDevice );
    DXUTSetCallbackMsgProc( MsgProc );
    DXUTSetCallbackFrameRender( OnFrameRender );
    DXUTSetCallbackFrameMove( OnFrameMove );
    DXUTSetCallbackKeyboard(OnKeyboardProc);
   
    
// TODO: Perform any application-level initialization here

    
// Initialize DXUT and create the desired Win32 window and Direct3D device for the application
    DXUTInit( truetruetrue ); // Parse the command line, handle the default hotkeys, and show msgboxes
    DXUTSetCursorSettings( truetrue ); // Show the cursor and clip it when in full screen
    DXUTCreateWindow( L"AddText" );
    DXUTCreateDevice( D3DADAPTER_DEFAULT, 
true640480, IsDeviceAcceptable, ModifyDeviceSettings );

    
// Start the render loop
    DXUTMainLoop();

    
// TODO: Perform any application-level cleanup here

    
return DXUTGetExitCode();
}

 

 

下載示例工程


posted on 2008-05-17 17:38 lovedday 閱讀(2754) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


公告

導航

統(tǒng)計

常用鏈接

隨筆分類(178)

3D游戲編程相關鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            好看的av在线不卡观看| 亚洲一区激情| 一区二区三区视频在线观看| 欧美黑人在线播放| 亚洲人成亚洲人成在线观看图片| 亚洲国产精品久久久久婷婷884 | 99精品视频免费观看视频| 亚洲视频1区2区| 国产精品一区二区久久国产| 香蕉成人久久| 欧美国产免费| 在线一区欧美| 国产一级一区二区| 蜜臀久久久99精品久久久久久| 亚洲激情专区| 欧美在线免费视频| 亚洲国产精品999| 欧美人与禽猛交乱配视频| 一本色道久久88综合日韩精品 | 欧美国产一区在线| 亚洲一级网站| 在线播放精品| 欧美日韩视频一区二区| 亚久久调教视频| 亚洲精品国产精品国自产在线| 亚洲欧美国产视频| 雨宫琴音一区二区在线| 欧美日韩福利| 久久婷婷综合激情| 亚洲一区二区三区在线| 欧美国产精品久久| 午夜性色一区二区三区免费视频| 尤物yw午夜国产精品视频| 欧美日韩一区二区三区| 久久精品青青大伊人av| 99精品国产在热久久婷婷| 欧美在线国产| 一个色综合av| 一区二区三区在线视频免费观看| 欧美日韩在线另类| 久久综合九色欧美综合狠狠| 一区二区三区黄色| 欧美大片91| 欧美在线观看天堂一区二区三区| 99国产成+人+综合+亚洲欧美| 国产目拍亚洲精品99久久精品 | 久久综合伊人77777麻豆| 99综合电影在线视频| 狠狠色伊人亚洲综合成人| 欧美另类视频| 麻豆精品在线播放| 久久久av水蜜桃| 亚洲欧美制服另类日韩| 亚洲精一区二区三区| 欧美激情视频在线播放| 久久超碰97人人做人人爱| 一区二区三区高清| 亚洲精品一区在线观看| 在线免费观看日本欧美| 狠狠色狠色综合曰曰| 国产日韩av一区二区| 国产精品久久久久久久app| 欧美日本不卡视频| 欧美国产在线电影| 欧美超级免费视 在线| 久久人人97超碰精品888| 久久久久国产精品厨房| 久久久久久久网站| 欧美在线观看一区二区| 欧美一区二区三区免费大片| 亚洲综合色网站| 亚洲一区欧美| 亚洲欧美国产日韩中文字幕 | 亚洲永久精品国产| 一区二区欧美日韩| 99av国产精品欲麻豆| 99re这里只有精品6| aa级大片欧美三级| 一区二区三区 在线观看视频 | 国产精品女主播一区二区三区| 欧美视频官网| 欧美亚一区二区| 国产精品免费一区豆花| 国产精品亚洲精品| 国产三区精品| 韩日成人在线| 亚洲风情在线资源站| 亚洲精品国产精品久久清纯直播| 亚洲六月丁香色婷婷综合久久| 亚洲精品婷婷| 亚洲免费中文| 久久精品国产欧美激情| 另类人畜视频在线| 亚洲高清毛片| 亚洲深夜影院| 欧美在线视频一区二区三区| 久久久久国内| 欧美日韩ab| 国产精品日韩欧美一区二区| 国产亚洲精品aa午夜观看| 影音先锋久久精品| 一区二区高清视频在线观看| 午夜精品久久久久久久久| 久久精品亚洲国产奇米99| 欧美国产日韩一区二区三区| 91久久综合| 亚洲影院污污.| 另类av一区二区| 欧美无砖砖区免费| 国产一区二区高清| 99精品黄色片免费大全| 欧美一区二区三区免费大片| 欧美福利视频在线观看| 一区二区精品国产| 久久久久久久久一区二区| 欧美经典一区二区三区| 国产亚洲成av人片在线观看桃| 亚洲国产福利在线| 欧美亚洲在线观看| 亚洲国产视频直播| 性欧美18~19sex高清播放| 欧美xxxx在线观看| 国产欧美一区二区三区视频| 亚洲六月丁香色婷婷综合久久| 性欧美videos另类喷潮| 亚洲国产成人不卡| 欧美一区二区三区在线播放| 欧美激情aaaa| 激情av一区| 亚洲欧美成人| 亚洲国产精品99久久久久久久久| 亚洲一级二级| 欧美精品一区二区高清在线观看| 国产麻豆精品久久一二三| 一本久久综合| 欧美+亚洲+精品+三区| 亚洲欧美日韩综合国产aⅴ| 欧美精品入口| 亚洲第一精品福利| 久久成人国产| 亚洲午夜激情网页| 欧美日韩视频专区在线播放 | 亚洲高清视频在线观看| 欧美一区二区啪啪| 国产精品久久久久久久午夜| 亚洲人www| 男男成人高潮片免费网站| 欧美一级理论性理论a| 国产精品乱码人人做人人爱| 一区二区三区**美女毛片 | 亚洲国产精品一区二区久| 欧美一区二区高清| 国产精品美女久久久久aⅴ国产馆| 日韩视频免费观看高清在线视频 | 亚洲福利久久| 女生裸体视频一区二区三区| 国内精品美女av在线播放| 久久aⅴ乱码一区二区三区| 国产精品99久久久久久人| 欧美噜噜久久久xxx| 亚洲精品视频在线| 亚洲电影免费在线观看| 老色鬼久久亚洲一区二区| 韩国v欧美v日本v亚洲v| 久久夜色精品国产欧美乱| 久久大综合网| 国产一在线精品一区在线观看| 久久国产免费| 久久精品网址| 亚洲电影免费在线| 欧美国产一区二区在线观看| 免费不卡视频| 亚洲美女精品一区| 99精品国产在热久久下载| 欧美日韩一区二区免费视频| 亚洲性感激情| 亚洲男女自偷自拍| 国产在线国偷精品产拍免费yy| 久久国产精品久久久久久久久久| 午夜精品理论片| 精品粉嫩aⅴ一区二区三区四区| 久久免费国产精品1| 久久久久一区二区| 亚洲久久一区| 在线综合+亚洲+欧美中文字幕| 国产精品亚洲成人| 久久一区二区三区国产精品| 免费不卡视频| 亚洲视频在线观看视频| 亚洲欧美日韩精品一区二区| 国产亚洲在线| 欧美国产日韩亚洲一区| 欧美日韩精品一区二区天天拍小说| 国产精品99久久不卡二区| 亚洲在线视频网站| 在线精品国精品国产尤物884a| 亚洲国产高清aⅴ视频| 欧美性理论片在线观看片免费| 欧美一区二区三区在线视频 | 亚洲影音一区|