• <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>

            天行健 君子當自強而不息

            DXUT框架剖析(14)

            控件是用戶接口的重要組成部分,為了便于用戶操作,為程序界面添加各種控件是非常好的方法。DXUT框架為在Direct3D程序中添加各種控件提供了支持。為了便于加載控件和處理各控件的消息,通常先在窗口中加載對話框,然后在對話框中添加響應的控件,由對話框來管理控件。為了統一管理各個對話框,還需要定義對話框資源管理器類CDXUTDialogResourceManager的一個對象,在程序開始時,調用各個對話框的Init函數和對話框資源管理對象進行初始化:

            CDXUTDialogResourceManager g_dlg_resource_manager;
            CD3DSettingsDlg g_settings_dlg;
            CDXUTDialog g_button_dlg;
            CDXUTDialog g_control_dlg;

            g_settings_dlg.Init(&g_dlg_resource_manager);
            g_button_dlg.Init(&g_dlg_resource_manager);
            g_control_dlg.Init(&g_dlg_resource_manager);

            需要注意的是,對話框類CD3DSettingsDlg是Direct3D封裝好的一個專門用于Direct3D渲染設備設置的對話框類,其中的控件已經都加載好了,同時各個控件將如何響應用戶的輸入Direct3D也已經實現了。在此只需對它的對象實例g_settings_dlg進行相應的初始化,并在程序退出前釋放對應的資源即可。

            g_button_dlg和g_control_dlg是兩個標準的DXUT對話框,它們中沒有任何控件,可以把它們看作兩個裝載控件的容器。其初始化包括三項內容:設置對話框控件消息處理回調函數、添加控件、設置對話框位置和大小。

            設置對話框控件消息處理回調函數、添加控件的代碼如下所示:

            g_button_dlg.SetCallback(OnGUIEvent);

            int x = 35, y = 10, width = 125, height = 22;

            g_button_dlg.AddButton(IDC_TOGGLE_FULLSCREEN, L"Toggle full screen", x, y, width, height);
            g_button_dlg.AddButton(IDC_TOGGLE_REF, L"Toggle REF (F3)", x, y += 24, width, height);
            g_button_dlg.AddButton(IDC_CHANGE_DEVICE, L"Change device (F2)", x, y += 24, width, height, VK_F2);

            g_button_dlg.SetCallback(OnGUIEvent);

            y = 10;

            g_control_dlg.AddComboBox(IDC_COMBO, x, y += 24, width, height);
            g_control_dlg.GetComboBox(IDC_COMBO)->AddItem(L"Text1", NULL);
            g_control_dlg.GetComboBox(IDC_COMBO)->AddItem(L"Text2", NULL);
            g_control_dlg.GetComboBox(IDC_COMBO)->AddItem(L"Text3", NULL);
            g_control_dlg.GetComboBox(IDC_COMBO)->AddItem(L"Text4", NULL);

            g_control_dlg.AddCheckBox(IDC_CHECK_BOX_1, L"CheckBox1", x, y += 24, width, height);
            g_control_dlg.AddCheckBox(IDC_CHECK_BOX_2, L"CheckBox2", x, y += 24, width, height);

            g_control_dlg.AddRadioButton(IDC_RADIO_1, IDC_RADIO_GROUP_1, L"Radio1G1", x, y += 24, width, height);
            g_control_dlg.AddRadioButton(IDC_RADIO_2, IDC_RADIO_GROUP_1, L"Radio2G1", x, y += 24, width, height);
            g_control_dlg.AddRadioButton(IDC_RADIO_3, IDC_RADIO_GROUP_1, L"Radio3G1", x, y += 24, width, height);
            g_control_dlg.GetRadioButton(IDC_RADIO_3)->SetChecked(true);

            g_control_dlg.AddButton(IDC_BUTTON_1, L"Button1", x, y += 24, width, height);
            g_control_dlg.AddButton(IDC_BUTTON_2, L"Button2", x, y += 24, width, height);

            g_control_dlg.AddRadioButton(IDC_RADIO_4, IDC_RADIO_GROUP_2, L"Radio1G2", x, y += 24, width, height);
            g_control_dlg.AddRadioButton(IDC_RADIO_5, IDC_RADIO_GROUP_2, L"Radio2G2", x, y += 24, width, height);
            g_control_dlg.GetRadioButton(IDC_RADIO_5)->SetChecked(true);

            g_control_dlg.AddSlider(IDC_SLIDER, 50, y += 24, 100, height);
            g_control_dlg.GetSlider(IDC_SLIDER)->SetRange(0, 100);
            g_control_dlg.GetSlider(IDC_SLIDER)->SetValue(50);

            g_control_dlg.AddEditBox(IDC_EDIT, L"Test", x, y += 24, width, 32);

            設置對話框位置和大小的代碼如下所示:

            // set dialog position and size

            g_button_dlg.SetLocation(pBackBufferSurfaceDesc->Width - 170, 0);
            g_button_dlg.SetSize(170, 170);

            g_control_dlg.SetLocation(pBackBufferSurfaceDesc->Width - 170, pBackBufferSurfaceDesc->Height - 350);
            g_control_dlg.SetSize(170, 300);

            因為上面的代碼用到了與對話框和控件相關的幾個類,所以需要將實現這幾個類的源文件添加到工程項目中,具體包括4個文件:DXUTgui.h、DXUTgui.cpp、DXUTSettingsDlg.h和DXUTSettingsDlg.cpp,這4個文件位于當前目錄的common目錄下。

             

            渲染控件

            在主程序的OnFrameRender()回調函數中,調用各個對話框的OnRender()函數對各個對話框進行渲染,代碼如下:

            //--------------------------------------------------------------------------------------
            // Render the scene
            //--------------------------------------------------------------------------------------
            void CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
            {
            HRESULT hr;
            	if(g_settings_dlg.IsActive())
            {
            g_settings_dlg.OnRender(fElapsedTime);
            return;
            }
                // Clear the render target and the zbuffer 
            V( pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(0, 0, 0, 0), 1.0f, 0) );
                // Render the scene
            if( SUCCEEDED( pd3dDevice->BeginScene() ) )
            {
            RenderText();
            		V(g_button_dlg.OnRender(fElapsedTime));
            V(g_control_dlg.OnRender(fElapsedTime));
                    V( pd3dDevice->EndScene() );
            }
            }

             

            處理控件消息

            當在應用程序的窗口中單擊鼠標或觸發其他事件時,先由對話框資源管理器對象g_dlg_resource_manager處理全局消息以更新GUI,然后進入各個對話框的消息處理函數:

            //--------------------------------------------------------------------------------------
            // Handle messages to the application
            //--------------------------------------------------------------------------------------
            LRESULT CALLBACK MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
            bool* pbNoFurtherProcessing, void* pUserContext )
            {
            *pbNoFurtherProcessing = g_dlg_resource_manager.MsgProc(hWnd, uMsg, wParam, lParam);
            if(*pbNoFurtherProcessing)
            return 0;
            	if(g_settings_dlg.IsActive())
            {
            g_settings_dlg.MsgProc(hWnd, uMsg, wParam, lParam);
            return 0;
            }
            	*pbNoFurtherProcessing = g_button_dlg.MsgProc(hWnd, uMsg, wParam, lParam);
            if(*pbNoFurtherProcessing)
            return 0;
            	*pbNoFurtherProcessing = g_control_dlg.MsgProc(hWnd, uMsg, wParam, lParam);
            if(*pbNoFurtherProcessing)
            return 0;
                return 0;
            }

            g_settings_dlg對于自己消息的處理Direct3D已經封裝好了,需要做的工作就是在回調函數OnGUIEvent()中處理對話框的消息。

            //--------------------------------------------------------------------------------------
            // Handle events for controls
            //--------------------------------------------------------------------------------------
            void CALLBACK OnGUIEvent(UINT event, int control_id, CDXUTControl* control, void* user_context)
            {
            switch(control_id)
            {
            case IDC_TOGGLE_FULLSCREEN:
            DXUTToggleFullScreen();
            break;
            	case IDC_TOGGLE_REF:
            DXUTToggleREF();
            break;
            	case IDC_CHANGE_DEVICE:
            g_settings_dlg.SetActive(true);
            break;
            }
            }

             

            釋放對話框

            在程序退出前需要釋放各個對話框所占用的資源:

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

             

            在程序運行時,單擊窗口上的【Toggle Full Screen】按鈕,可切換到全屏模式下。單擊窗口上的【Toggle REF】按鈕,可切換到參考設備下。按下F2鍵或單擊窗口上的【Change Device】按鈕,則顯示Direct3D設備設置對話框,如下圖所示:

             

            主程序:

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

            #pragma warning(disable : 
            4127)

            #define IDC_TOGGLE_FULLSCREEN        1
            #define IDC_TOGGLE_REF                2
            #define IDC_CHANGE_DEVICE            3
            #define IDC_COMBO                    4
            #define IDC_CHECK_BOX_1                5
            #define IDC_CHECK_BOX_2                6
            #define IDC_RADIO_1                    7
            #define IDC_RADIO_2                    8
            #define IDC_RADIO_3                    9
            #define IDC_BUTTON_1                10
            #define IDC_BUTTON_2                11
            #define IDC_RADIO_4                    12
            #define IDC_RADIO_5                    13
            #define IDC_SLIDER                    14
            #define IDC_EDIT                    15

            #define IDC_RADIO_GROUP_1            1
            #define IDC_RADIO_GROUP_2            2

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

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

            CDXUTDialogResourceManager    g_dlg_resource_manager;
            CD3DSettingsDlg                g_settings_dlg;
            CDXUTDialog                    g_button_dlg;
            CDXUTDialog                    g_control_dlg;

            //--------------------------------------------------------------------------------------
            // 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 )
            {
                HRESULT    hr;

                V_RETURN(g_dlg_resource_manager.OnCreateDevice(pd3dDevice));
                V_RETURN(g_settings_dlg.OnCreateDevice(pd3dDevice));

                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 )
            {
                HRESULT hr;

                V_RETURN(g_dlg_resource_manager.OnResetDevice());
                V_RETURN(g_settings_dlg.OnResetDevice());
                V_RETURN(g_font
            ->OnResetDevice());
                V_RETURN(D3DXCreateSprite(pd3dDevice, 
            &g_text_sprite));

                
            // set dialog position and size

                g_button_dlg.SetLocation(pBackBufferSurfaceDesc
            ->Width - 1700);
                g_button_dlg.SetSize(
            170170);

                g_control_dlg.SetLocation(pBackBufferSurfaceDesc
            ->Width - 170, pBackBufferSurfaceDesc->Height - 350);
                g_control_dlg.SetSize(
            170300);    

                
            // 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_dlg_resource_manager.OnLostDevice();
                g_settings_dlg.OnLostDevice();
                g_font
            ->OnLostDevice();
                release_com(g_text_sprite);
            }


            //--------------------------------------------------------------------------------------
            // Release resources created in the OnCreateDevice callback here
            //--------------------------------------------------------------------------------------
            void CALLBACK OnDestroyDevice( void* pUserContext )
            {
                g_dlg_resource_manager.OnDestroyDevice();
                g_settings_dlg.OnDestroyDevice();
                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 * 4);
                    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;

                
            if(g_settings_dlg.IsActive())
                {
                    g_settings_dlg.OnRender(fElapsedTime);
                    
            return;
                }

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

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

                    V(g_button_dlg.OnRender(fElapsedTime));
                    V(g_control_dlg.OnRender(fElapsedTime));

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


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

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

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

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

                
            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;
                    }
                }
            }

            //--------------------------------------------------------------------------------------
            // Handle events for controls
            //--------------------------------------------------------------------------------------
            void CALLBACK OnGUIEvent(UINT eventint control_id, CDXUTControl* control, void* user_context)
            {
                
            switch(control_id)
                {
                
            case IDC_TOGGLE_FULLSCREEN:
                    DXUTToggleFullScreen();
                    
            break;

                
            case IDC_TOGGLE_REF:
                    DXUTToggleREF();
                    
            break;

                
            case IDC_CHANGE_DEVICE:
                    g_settings_dlg.SetActive(
            true);
                    
            break;
                }
            }

            //--------------------------------------------------------------------------------------
            // Initialize dialogs
            //--------------------------------------------------------------------------------------
            void InitDialogs()
            {
                g_settings_dlg.Init(
            &g_dlg_resource_manager);
                g_button_dlg.Init(
            &g_dlg_resource_manager);
                g_control_dlg.Init(
            &g_dlg_resource_manager);

                g_button_dlg.SetCallback(OnGUIEvent);

                
            int x = 35, y = 10, width = 125, height = 22;

                g_button_dlg.AddButton(IDC_TOGGLE_FULLSCREEN, L
            "Toggle full screen", x, y,         width, height);
                g_button_dlg.AddButton(IDC_TOGGLE_REF,          L
            "Toggle REF (F3)",     x, y += 24, width, height);
                g_button_dlg.AddButton(IDC_CHANGE_DEVICE,      L
            "Change device (F2)", x, y += 24, width, height, VK_F2);

                g_button_dlg.SetCallback(OnGUIEvent);

                y 
            = 10;

                g_control_dlg.AddComboBox(IDC_COMBO, x, y 
            += 24, width, height);
                g_control_dlg.GetComboBox(IDC_COMBO)
            ->AddItem(L"Text1", NULL);
                g_control_dlg.GetComboBox(IDC_COMBO)
            ->AddItem(L"Text2", NULL);
                g_control_dlg.GetComboBox(IDC_COMBO)
            ->AddItem(L"Text3", NULL);
                g_control_dlg.GetComboBox(IDC_COMBO)
            ->AddItem(L"Text4", NULL);

                g_control_dlg.AddCheckBox(IDC_CHECK_BOX_1, L
            "CheckBox1", x, y += 24, width, height);
                g_control_dlg.AddCheckBox(IDC_CHECK_BOX_2, L
            "CheckBox2", x, y += 24, width, height);

                g_control_dlg.AddRadioButton(IDC_RADIO_1, IDC_RADIO_GROUP_1, L
            "Radio1G1", x, y += 24, width, height);
                g_control_dlg.AddRadioButton(IDC_RADIO_2, IDC_RADIO_GROUP_1, L
            "Radio2G1", x, y += 24, width, height);
                g_control_dlg.AddRadioButton(IDC_RADIO_3, IDC_RADIO_GROUP_1, L
            "Radio3G1", x, y += 24, width, height);
                g_control_dlg.GetRadioButton(IDC_RADIO_3)
            ->SetChecked(true);

                g_control_dlg.AddButton(IDC_BUTTON_1, L
            "Button1", x, y += 24, width, height);
                g_control_dlg.AddButton(IDC_BUTTON_2, L
            "Button2", x, y += 24, width, height);

                g_control_dlg.AddRadioButton(IDC_RADIO_4, IDC_RADIO_GROUP_2, L
            "Radio1G2", x, y += 24, width, height);
                g_control_dlg.AddRadioButton(IDC_RADIO_5, IDC_RADIO_GROUP_2, L
            "Radio2G2", x, y += 24, width, height);
                g_control_dlg.GetRadioButton(IDC_RADIO_5)
            ->SetChecked(true);

                g_control_dlg.AddSlider(IDC_SLIDER, 
            50, y += 24100, height);
                g_control_dlg.GetSlider(IDC_SLIDER)
            ->SetRange(0100);
                g_control_dlg.GetSlider(IDC_SLIDER)
            ->SetValue(50);

                g_control_dlg.AddEditBox(IDC_EDIT, L
            "Test", x, y += 24, width, 32);
            }

            //--------------------------------------------------------------------------------------
            // 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
                InitDialogs();

                
            // 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"AddControl" );
                DXUTCreateDevice( D3DADAPTER_DEFAULT, 
            true640480, IsDeviceAcceptable, ModifyDeviceSettings );

                
            // Start the render loop
                DXUTMainLoop();

                
            // TODO: Perform any application-level cleanup here

                
            return DXUTGetExitCode();
            }

             

            下載示例工程


            posted on 2008-05-19 14:28 lovedday 閱讀(2218) 評論(1)  編輯 收藏 引用

            評論

            # re: DXUT框架剖析(14) 2011-09-22 15:32

            你好 我用的DX2009年3月版+VS2008
            結果加入那四個文件后提示打不開包含文件
            在主程序的.cpp中加入兩個的頭文件后
            出現一堆:無法解析的外部符號
            找了一個能運行的例子 把lib拷過來加進去 少了幾個 但是還有兩個無法識別的外部符號 不知道該怎么解決 希望指點一下啊
            謝謝  回復  更多評論   

            公告

            導航

            統計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            99久久99久久精品国产片果冻| 新狼窝色AV性久久久久久| 996久久国产精品线观看| 国产2021久久精品| 精品久久久久成人码免费动漫 | 欧洲人妻丰满av无码久久不卡 | 久久免费99精品国产自在现线 | 久久久WWW成人免费精品| 97视频久久久| 久久er国产精品免费观看8| 亚洲精品国产字幕久久不卡| 大香网伊人久久综合网2020| 婷婷伊人久久大香线蕉AV | 中文字幕人妻色偷偷久久| 国产91色综合久久免费| 久久成人小视频| 精品人妻伦九区久久AAA片69 | 麻豆av久久av盛宴av| 国产精品九九久久免费视频| 久久精品中文无码资源站| 2019久久久高清456| 久久国产精品偷99| 久久国产精品99久久久久久老狼| 久久婷婷五月综合成人D啪| 久久这里有精品视频| 国产激情久久久久影院老熟女免费| 99蜜桃臀久久久欧美精品网站| 久久天天躁狠狠躁夜夜2020老熟妇| 国产成人久久AV免费| 国产精品女同久久久久电影院| 精品一二三区久久aaa片| 国产欧美久久久精品影院| 亚洲国产综合久久天堂| 久久这里只有精品视频99| 久久久WWW免费人成精品| 久久高清一级毛片| 精品久久久久一区二区三区| 成人亚洲欧美久久久久| 国产高潮久久免费观看| 久久伊人影视| 亚洲精品国产美女久久久|