dxut 学习笔记

dxut 学习笔记

dxut框架

用于调试关键代码和算法

 

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

< 临界区的访问锁定

相关API函数:

EnterCriticalSection

结构:

LPCRITICAL_SECTION

使用方法:

 1 // 定义临界区结构
 2
 3 CRITICAL_SECTION    g_cs;
 4
 5 // 定义锁定类
 6
 7 class  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
14 GET_SET_ACCESSOR( IDirect3D9 * , D3D9 );
15
16 还原宏
17
18 inline  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可注册的回调函数

 

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

 

初始化常用函数:

 

 1 DXUTInit
 2
 3 DXUTSetHotkeyHandling     // < 设置默认热键
 4
 5 DXUTSetCursorSettings      // < 设置鼠标
 6
 7 DXUTCreateWindow        // < 创建窗口
 8
 9 DXUTCreateDevice         // < 创建d3d设置
10
11 DXUTMainLoop           // <程序主循环
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
 11 class  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
 73 ControlManage::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
 91 ControlManage:: ~ ControlManage(  void  )
 92
 93 {
 94
 95         m_dialogManager->OnD3D9DestroyDevice();
 96
 97    m_settingDlg->OnD3D9DestroyDevice();
 98
 99    
100
101}

102
103 void  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
121 void  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
161 void  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
185 BOOL 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
233 void  ControlManage::CreateDeivce( IDirect3DDevice9 *  pd3dDevice )
234
235 {
236
237    m_dialogManager->OnD3D9CreateDevice(pd3dDevice);
238
239         m_settingDlg->OnD3D9CreateDevice(pd3dDevice);
240
241}

242
243  
244
245 void  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

 

你可能感兴趣的:(dxut 学习笔记)