dxut框架
用于调试关键代码和算法
用于线程安全访问成员变量的宏
< 临界区的访问锁定
相关API函数:
EnterCriticalSection
结构:
LPCRITICAL_SECTION
使用方法:
1
//定义临界区结构
2
3
CRITICAL_SECTION g_cs;
4
5
//定义锁定类
6
7
class DXUTLock
8

{
9
public:
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
22
DXUTLock l;
23
24
m_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控件使用
声明控件
回调函数为类成员函数,不能直接传参,可以声明成员函数为静态成员。
注意:控件的流程也与程序流程一样,要Create和Reset。必须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
15
public:
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
53
protected:
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!"), 10, 20, 100, 40);
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(100, 20);
252
253
m_debugInfoDlg->SetSize(100, 100);
254
255
256
257
m_dialogManager->OnD3D9ResetDevice();
258
259
m_settingDlg->OnD3D9ResetDevice();
260
261
}
262
263