dxut 学习笔记
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
2
3
4
5
6
7
8

9
10
11

12
13
14
15

16
17
18
19
20
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

21
22
23
24
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
初始化常用函数:
1
DXUTInit
2![]()
3
DXUTSetHotkeyHandling
//
< 设置默认热键
4
5
DXUTSetCursorSettings
//
< 设置鼠标
6
7
DXUTCreateWindow
//
< 创建窗口
8
9
DXUTCreateDevice
//
< 创建d3d设置
10
11
DXUTMainLoop
//
<程序主循环
12
13
2
3
4
5
6
7
8
9
10
11
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
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75

76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93

94
95
96
97
98
99
100
101
102
103
104
105

106
107
108
109

110
111
112
113
114
115
116
117
118
119
120
121
122
123

124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163

164
165
166
167
168
169

170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187

188
189
190
191

192
193
194
195
196
197
198
199
200
201

202
203
204
205
206
207
208
209
210
211
212
213
214
215

216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235

236
237
238
239
240
241
242
243
244
245
246
247

248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263