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控件使用
声明控件
回调函数为类成员函数,不能直接传参,可以声明成员函数为静态成员。
注意:控件的流程也与程序流程一样,要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
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!"), 10, 20, 100, 40);
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(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