dxut 学习笔记

dxut框架

用于调试关键代码和算法

 

用于线程安全访问成员变量的宏

< 临界区的访问锁定

相关API函数:

EnterCriticalSection

结构:

LPCRITICAL_SECTION

使用方法:

 1//定义临界区结构
 2
 3CRITICAL_SECTION    g_cs;
 4
 5//定义锁定类
 6
 7class DXUTLock
 8{
 9public:
10    inline  DXUTLock()
11    {
12        if( g_bThreadSafe ) EnterCriticalSection( &g_cs );
13    }

14    inline  ~DXUTLock()
15    {
16        if( g_bThreadSafe ) LeaveCriticalSection( &g_cs );
17    }

18}
;
19
20//< 代码从dxut的源码处copy
21
22

在需要使用的临界资源前,实例化DXUTLock类就可以了

DXUTLock    lock;

在临时变量lock的作用范围结束后,会自动析构解锁

 

 

 

< 线程安全的宏

 1//--------------------------------------------------------------------------------------
 2// Helper macros to build member functions that access member variables with thread safety
 3//--------------------------------------------------------------------------------------
 4#define SET_ACCESSOR( x, y )      inline void Set##y( x t )           { DXUTLock l; m_state.m_##y = t; };
 5#define GET_ACCESSOR( x, y )       inline x Get##y()                  { DXUTLock l; return m_state.m_##y; };
 6#define GET_SET_ACCESSOR( x, y )    SET_ACCESSOR( x, y )              GET_ACCESSOR( x, y )
 7
 8#define SETP_ACCESSOR( x, y )              inline void Set##y( x* t )  { DXUTLock l; m_state.m_##y = *t; };
 9#define GETP_ACCESSOR( x, y )              inline x* Get##y()          { DXUTLock l; return &m_state.m_##y; };
10#define GETP_SETP_ACCESSOR( x, y ) SETP_ACCESSOR( x, y ) GETP_ACCESSOR( x, y )
11
12使用:
13
14GET_SET_ACCESSOR( IDirect3D9*, D3D9 );
15
16还原宏
17
18inline void SetD3D9(Idirect3D9* D3D9)
19
20{
21
22DXUTLock l; 
23
24m_state.m_D3D9 = D3D9;
25
26}

27
28

同理设置GetD3D9();

这样就完成了对成员变量m_state的线程安全设置。

全局类DXUTState

DxUtState全局类,整个框架中拥有唯一实例化对象,储DXUT的状态

回调函数的注册

回调函数的注册函数在DXUTState类中

d3d9可注册的回调函数

 

 1DXUTSetCallbackDeviceChanging       //< 设备创建前调用,设置一些参数
 2
 3DXUTSetCallbackDeviceRemoved
 4
 5DXUTSetCallbackFrameMove          //< 相当于update()每一帧渲染前调用
 6
 7DXUTSetCallbackKeyboard            //< 键盘回调
 8
 9DXUTSetCallbackMouse              //< 鼠标回调
10
11DXUTSetCallbackMsgProc            //< 消息处理
12
13DXUTSetCallbackD3D9DeviceAcceptable //< 设备创建前检查
14
15DXUTSetCallbackD3D9DeviceCreated     //< 设备创建时调用
16
17DXUTSetCallbackD3D9DeviceReset      //< 设备创建后调用
18
19DXUTSetCallbackD3D9DeviceLost       //< 设备丢失,程序结束时调用
20
21DXUTSetCallbackD3D9DeviceDestroyed //< 设备结束时调用
22
23DXUTSetCallbackD3D9FrameRender     //< 每一帧的渲染代码
24
25

 

初始化常用函数:

 

 1DXUTInit
 2
 3DXUTSetHotkeyHandling    //< 设置默认热键
 4
 5DXUTSetCursorSettings     //< 设置鼠标
 6
 7DXUTCreateWindow       //< 创建窗口
 8
 9DXUTCreateDevice        //< 创建d3d设置
10
11DXUTMainLoop          //<程序主循环
12
13

 

DXUT控件使用

声明控件

回调函数为类成员函数,不能直接传参,可以声明成员函数为静态成员。

注意:控件的流程也与程序流程一样,要CreateReset。必须Reset,要创建状态块

自定义简单控件管理类:

 

 

  1#pragma once
  2
  3#include "DXUT.h"
  4
  5#include "DXUTgui.h"
  6
  7#include "DXUTsettingsdlg.h"
  8
  9#include "resource.h"
 10
 11class ControlManage
 12
 13{
 14
 15public:
 16
 17         ControlManage(void);
 18
 19         ~ControlManage(void);
 20
 21         void Init();
 22
 23   //< 事件控件处理回调
 24
 25 static void CALLBACK OnControlMsgProc(UINT nEvent, int nControlId, CDXUTControl* pControl, void * pUserContext);
 26
 27 
 28
 29//< 控件的渲染
 30
 31         void Render(float elapseTime);
 32
 33 
 34
 35//< 对外的事件处理接口
 36
 37         BOOL ProcessControlMsg(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
 38
 39 
 40
 41//< 控件的创建
 42
 43         void CreateDeivce(IDirect3DDevice9* pd3dDevice);
 44
 45 
 46
 47//< 控件的重置,必须有,不然没法创建状态块
 48
 49         void ResetDevice();
 50
 51 
 52
 53protected:
 54
 55         CDXUTDialogResourceManager *m_dialogManager;
 56
 57         CD3DSettingsDlg            *m_settingDlg;
 58
 59         CDXUTDialog                *m_debugInfoDlg;
 60
 61}
;
 62
 63 
 64
 65.cpp
 66
 67#include "DXUT.h"
 68
 69#include "ControlManage.h"
 70
 71#include <tchar.h>
 72
 73ControlManage::ControlManage(void)
 74
 75{
 76
 77         m_dialogManager = new CDXUTDialogResourceManager();
 78
 79         m_debugInfoDlg = new CDXUTDialog();
 80
 81         m_settingDlg = new CD3DSettingsDlg();
 82
 83         m_settingDlg->SetActive(false);
 84
 85}

 86
 87 
 88
 89 
 90
 91ControlManage::~ControlManage( void )
 92
 93{
 94
 95         m_dialogManager->OnD3D9DestroyDevice();
 96
 97    m_settingDlg->OnD3D9DestroyDevice();
 98
 99    
100
101}

102
103void CALLBACK ControlManage::OnControlMsgProc( UINT nEvent, int nControlId, CDXUTControl* pControl, void * pUserContext )
104
105{
106
107         switch(nControlId)
108
109         {
110
111         case 1:
112
113                   break;
114
115         }

116
117}

118
119 
120
121void ControlManage::Init()
122
123{
124
125 
126
127    m_settingDlg->Init(m_dialogManager);
128
129    m_debugInfoDlg->Init(m_dialogManager);
130
131    
132
133         //< 设置消息处理回调函数
134
135         m_debugInfoDlg->SetCallback(OnControlMsgProc);
136
137         
138
139 
140
141         //< 添加子控件
142
143    m_debugInfoDlg->AddStatic(IDC_STATIC_Name, _T("hello, DXUT!"), 102010040);
144
145         
146
147   
148
149         
150
151         
152
153}

154
155 
156
157 
158
159 
160
161void ControlManage::Render( float elapseTime )
162
163{
164
165         
166
167         if(m_settingDlg->IsActive())
168
169         {
170
171                   m_settingDlg->OnRender(elapseTime);
172
173                   return;
174
175         }

176
177 
178
179    m_debugInfoDlg->OnRender(elapseTime);
180
181}

182
183 
184
185BOOL ControlManage::ProcessControlMsg( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
186
187{
188
189    if(m_dialogManager->MsgProc(hWnd, uMsg, wParam, lParam))
190
191         {
192
193                   return 0;
194
195         }

196
197 
198
199         if(m_settingDlg->IsActive())
200
201         {
202
203                   m_settingDlg->MsgProc(hWnd, uMsg, wParam, lParam);
204
205                   return 0;
206
207         }

208
209 
210
211 
212
213         if(m_debugInfoDlg->MsgProc(hWnd, uMsg, wParam, lParam))
214
215         {
216
217                   return 0;
218
219         }

220
221 
222
223         return 0;
224
225         
226
227 
228
229}

230
231 
232
233void ControlManage::CreateDeivce( IDirect3DDevice9* pd3dDevice )
234
235{
236
237    m_dialogManager->OnD3D9CreateDevice(pd3dDevice);
238
239         m_settingDlg->OnD3D9CreateDevice(pd3dDevice);
240
241}

242
243 
244
245void ControlManage::ResetDevice()
246
247{
248
249         //< 设置位置信息
250
251         m_debugInfoDlg->SetLocation(10020);
252
253         m_debugInfoDlg->SetSize(100100);
254
255 
256
257         m_dialogManager->OnD3D9ResetDevice();
258
259         m_settingDlg->OnD3D9ResetDevice();
260
261}

262
263

 

posted on 2012-02-20 14:18 帅哥帅 阅读(288) 评论(0)  编辑 收藏 引用 所属分类: dx


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

导航

统计

常用链接

留言簿

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜