115. 116. 117. 118. 119. 120. 121. 122. 123.
//Direct3D资源的初始化,调用失败用messagebox予以显示 if (!(S_OK==Direct3D_Init (hwnd,hInstance))) {
MessageBox(hwnd, _T(\初始化失败~!\), _T(\浅墨的 }
MoveWindow(hwnd,200,50,SCREEN_WIDTH,SCREEN_HEIGHT,true);
消息窗口\), 0); //使用MessageBox函数,创建一个消息窗口
//调整窗口显示时的位置,窗口左上角位于屏幕坐标(200,50)处 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.
ShowWindow( hwnd, nShowCmd ); //调用Win32函数ShowWindow UpdateWindow(hwnd); //对窗口进行更新,就像我们买了新房子要装修一
//消息循环过程
MSG msg = { 0 }; //初始化msg
while( msg.message != WM_QUIT ) //使用while循环 {
if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) //查看 {
TranslateMessage( &msg ); //将虚拟键消息转换为 DispatchMessage( &msg ); //该函数分发一个消息 } else {
Direct3D_Update(hwnd); //调用更新函数,进行画 Direct3D_Render(hwnd); //调用渲染函数,进行 } }
UnregisterClass(_T(\), wndClass. return 0; } 来显示窗口 样
应用程序消息队列,有消息时将队列中的消息派发出去。
字符消息 给窗口程序。
面的更新
画面的渲染
hInstance);
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.
//***********************************************************// Name: WndProc() // Desc: 对窗口消息进行处理
//***********************************************************LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wPa{
switch( message ) //switch语句开始 {
case WM_PAINT: // 客户区重绘消息 Direct3D_Render(hwnd); //调用Direct3D_Render ValidateRect(hwnd, NULL); // 更新客户区的显示 break; //跳出该switch
case WM_KEYDOWN: // 键盘按下消息 if (wParam == VK_ESCAPE) // ESC键
DestroyWindow(hwnd); // 销毁窗口, 并发送一条 break;
case WM_DESTROY: //窗口销毁消息
Direct3D_CleanUp(); //调用Direct3D_CleanUp函数,清 PostQuitMessage( 0 ); //向系统表明有个线程有终止请 break; //跳出该switch语句
default: //若上述case条件都不符合,则 return DefWindowProc( hwnd, message, wParam, lParam ) }
return 0; //正常退出 }
//***********************************************************// Name: Direct3D_Init( )
******************************
******************************
ram, LPARAM lParam ) //窗口过程函数WndProc
函数,进行画面的绘制
语句
WM_DESTROY消息
理COM接口对象
求。用来响应WM_DESTROY消息
执行该default语句
; //调用缺省的窗口过程来为应用程序没有处理的窗口消息提供缺省的处理。
******************************
182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193.
// Desc: 初始化Direct3D
// Point:【Direct3D初始化四步曲】
// 1.初始化四步曲之一,创建Direct3D接口对象 // 2.初始化四步曲之二,获取硬件设备信息 // 3.初始化四步曲之三,填充结构体
// 4.初始化四步曲之四,创建Direct3D设备接口
//***********************************************************
HRESULT Direct3D_Init(HWND hwnd,HINSTANCE hInstance) {
//-------------------------------------------------------
******************************
------------------------------- 194. 195.
// 【Direct3D初始化四步曲之一,创接口】:创建Direct3D接口对象, 以 //-------------------------------------------------------
便用该Direct3D对象创建Direct3D设备对象 ------------------------------- 196. 197. 198. 199. 200.
LPDIRECT3D9 pD3D = NULL; //Direct3D接口对象的创建 if( NULL == ( pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) return E_FAIL;
//-------------------------------------------------------
) //初始化Direct3D接口对象,并进行DirectX版本协商
------------------------------- 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213.
// 【Direct3D初始化四步曲之二,取信息】:获取硬件设备信息 //------------------------------------------------------- D3DCAPS9 caps; int vp = 0;
if( FAILED( pD3D->GetDeviceCaps( D3DADAPTER_DEFAULT, D3DD {
return E_FAIL; }
if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT ) vp = D3DCREATE_HARDWARE_VERTEXPROCESSING; //支持硬件 else
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING; //不支持硬件
//-------------------------------------------------------
-------------------------------
EVTYPE_HAL, &caps ) ) )
顶点运算,我们就采用硬件顶点运算,妥妥的
顶点运算,无奈只好采用软件顶点运算
------------------------------- 214.
// 【Direct3D
初始化四步曲之三,填内容】:填充
D3DPRESENT_PARAMETERS结构体 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233.
//------------------------------------------------------- D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.BackBufferWidth = SCREEN_WIDTH; d3dpp.BackBufferHeight = SCREEN_HEIGHT; d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8; d3dpp.BackBufferCount = 2;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; d3dpp.MultiSampleQuality = 0;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.hDeviceWindow = hwnd; d3dpp.Windowed = true; d3dpp.EnableAutoDepthStencil = true;
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; d3dpp.Flags = 0; d3dpp.FullScreen_RefreshRateInHz = 0;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IM
//--------------------------------------------------------------------------------------
MEDIATE;
------------------------------- 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245.
// 【Direct3D初始化四步曲之四,创设备】:创建Direct3D设备接口 //------------------------------------------------------- if(FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTY hwnd, vp, &d3dpp, &g_pd3dDevice))) return E_FAIL;
//获取显卡信息到g_strAdapterName中,并在显卡名称之前加上“当前显卡 wchar_t TempName[60]=L\当前显卡型号:\; //定义一个临时字符 D3DADAPTER_IDENTIFIER9 Adapter; //
定
义
一调
个用
------------------------------- PE_HAL,
型号:”字符串
串,且方便了把\当前显卡型号:\字符串引入我们的目的字符串中 D3DADAPTER_IDENTIFIER9结构体,用于存储显卡信息
pD3D->GetAdapterIdentifier(0,0,&Adapter);//GetAdapterIdentifier,获取显卡信息
int len = MultiByteToWideChar(CP_ACP,0, Adapter.Description, -1, NULL, 0);//显卡名称现在已经在Adapter.Description中了,但是其为char类型,我们要将其转为wchar_t类型
246. MultiByteToWideChar(CP_ACP, 0, Adapter.Description, -1,
g_strAdapterName, len);//这步操作完成后,g_strAdapterName中就为当前我们的显卡类型名的wchar_t型字符串了 247. 248. 249. 250. 251. 252.
wcscat_s(TempName,g_strAdapterName);//把当前我们的显卡名加到 wcscpy_s(g_strAdapterName,TempName);//把TempName中的结果
//------------------------------------------------------“当前显卡型号:”字符串后面,结果存在TempName中 拷贝到全局变量g_strAdapterName中,大功告成~
-------------------------------- 253. 254.
// 【DirectInput使用五步曲的前三步】:创设备,设格式,拿权力。在为 //------------------------------------------------------
鼠标设备初始化
-------------------------------- 255. 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266.
// 创建DirectInput接口和设备
DirectInput8Create(hInstance, 0x0800, IID_IDirectInput8, g_pDirectInput->CreateDevice(GUID_SysKeyboard, &g_pMouseD
// 设置数据格式和协作级别
g_pDirectInput->CreateDevice(GUID_SysMouse, &g_pMouseDevi g_pMouseDevice->SetDataFormat(&c_dfDIMouse);
//获取设备控制权
g_pMouseDevice->Acquire();
//-------------------------------------------------------
(void**)&g_pDirectInput, NULL); evice, NULL);
ce, NULL);
------------------------------- 267. 268.
// 【DirectInput使用五步曲的前三步】:创设备,设格式,拿权力。在为 //-------------------------------------------------------
键盘设备初始化
------------------------------- 269. 270. 271. 272. 273. 274.
// 创建DirectInput接口和设备
DirectInput8Create(hInstance, 0x0800, IID_IDirectInput8, g_pDirectInput->CreateDevice(GUID_SysKeyboard, &g_pKeyboa
// 设置数据格式和协作级别
g_pKeyboardDevice->SetDataFormat(&c_dfDIKeyboard);
(void**)&g_pDirectInput, NULL); rdDevice, NULL);