//----------------------------------------------------------------------------- // 文件: D3DWindow.h // // 描述: D3DWindow类的头文件,定义变量,函数。 // // 更新: 2009-03-19 by Ninsun //----------------------------------------------------------------------------- #pragma once #define _WIN32_WINNT 0x0502 #include <d3dx9.h> #include <winuser.h> #pragma comment (lib, "d3d9.lib") #pragma comment (lib, "d3dx9.lib") #pragma comment (lib, "User32.lib") #include "D3DCamera.h" struct D3DWINDOW { HINSTANCE hInst; // 实例句柄 WNDPROC pMsgProc; // 消息处理函数指针 INT iWidth; // 屏幕宽度 INT iHeight; // 屏幕高度 LPCTSTR lpszClassName; // 窗口类名 LPCTSTR lpszWindowName; // 窗口名 HICON hIcon; // 图标句柄 HCURSOR hCursor; // 光标句柄 HWND hWnd; // 窗口句柄 LPDIRECT3D9 pD3D; // D3D对象,用于创建设备 LPDIRECT3DDEVICE9 pd3dDevice; // D3D设备,用于渲染 D3DDISPLAYMODE* pd3ddm; // 硬件显示模式 }; #define WND_WIDTH 640 // 默认显示宽度 #define WND_HEIGHT 480 // 默认显示高度 #define VIEW_2D 0 // 2D视图(正交投影) #define VIEW_3D 1 // 3D视图(透视投影) class D3DWindow { public: D3DWindow(D3DWINDOW* _pd3dWindow); public: ~D3DWindow(void); public: VOID showWindow(); D3DWINDOW getWindow(); VOID cleanup(); VOID startRender(); VOID endRender(); private: VOID initD3D(); private: D3DWINDOW m_d3dWindow; }; //----------------------------------------------------------------------------- // 文件: D3DWindow.cpp // // 描述: 用于快速创建Win32窗口以及D3D设备 // // 更新: 2009-03-19 by Ninsun //----------------------------------------------------------------------------- #include "D3DWindow.h" //----------------------------------------------------------------------------- // 名称: D3DWindow() // 描述: 自定义构造函数 //----------------------------------------------------------------------------- D3DWindow::D3DWindow(D3DWINDOW* _pd3dWindow) { m_d3dWindow = *_pd3dWindow; if (m_d3dWindow.iWidth == 0 || m_d3dWindow.iHeight == 0) { m_d3dWindow.iWidth = WND_WIDTH; m_d3dWindow.iHeight = WND_HEIGHT; } if (m_d3dWindow.lpszClassName == 0) { m_d3dWindow.lpszClassName = TEXT("D3D_2D Window"); } if (m_d3dWindow.lpszWindowName == 0) { m_d3dWindow.lpszWindowName = TEXT("D3D_2D Window"); } if (m_d3dWindow.pd3ddm == 0) { m_d3dWindow.pd3ddm = new D3DDISPLAYMODE(); } // 注册窗口类 WNDCLASSEX wc = { sizeof( WNDCLASSEX ), CS_CLASSDC, m_d3dWindow.pMsgProc, 0L, 0L, m_d3dWindow.hInst, m_d3dWindow.hIcon, m_d3dWindow.hCursor, /*(HBRUSH)(COLOR_WINDOW+1)*/NULL, NULL, m_d3dWindow.lpszClassName, NULL }; RegisterClassEx( &wc ); // 创建程序窗口 m_d3dWindow.hWnd = CreateWindowEx( /*WS_EX_LAYERED*/WS_EX_APPWINDOW, m_d3dWindow.lpszClassName, m_d3dWindow.lpszWindowName, WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX, 0, 0, WND_WIDTH,WND_HEIGHT, NULL, NULL, wc.hInstance, NULL ); // 初始化D3D initD3D(); // 将D3DWindow信息反馈给创建结构体 memcpy(_pd3dWindow,&m_d3dWindow,sizeof(m_d3dWindow)); } D3DWindow::~D3DWindow(void) { } //----------------------------------------------------------------------------- // 名称: initD3D() // 描述: 创建D3D设备 //----------------------------------------------------------------------------- VOID D3DWindow::initD3D() { // 创建D3D对象 m_d3dWindow.pD3D = Direct3DCreate9( D3D_SDK_VERSION ); // 获取硬件显示模式 m_d3dWindow.pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, m_d3dWindow.pd3ddm); // 设置用来创建D3D设备的数组 D3DPRESENT_PARAMETERS d3dpp; ZeroMemory( &d3dpp, sizeof( d3dpp ) ); d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferWidth = WND_WIDTH; d3dpp.BackBufferHeight = WND_HEIGHT; d3dpp.BackBufferFormat = m_d3dWindow.pd3ddm->Format; d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; d3dpp.EnableAutoDepthStencil = TRUE; d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; // 创建D3D设备 m_d3dWindow.pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, m_d3dWindow.hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &m_d3dWindow.pd3dDevice ); // 关闭裁剪模式和光照 m_d3dWindow.pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); m_d3dWindow.pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE ); // 设置alpha测试 m_d3dWindow.pd3dDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE); m_d3dWindow.pd3dDevice->SetRenderState(D3DRS_ALPHAREF, 64); m_d3dWindow.pd3dDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER); // 设置alpha混合 m_d3dWindow.pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); m_d3dWindow.pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); m_d3dWindow.pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); // 设置纹理过滤模式 m_d3dWindow.pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER,D3DTEXF_LINEAR); m_d3dWindow.pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER,D3DTEXF_LINEAR); // 开启深度缓冲 m_d3dWindow.pd3dDevice->SetRenderState(D3DRS_ZENABLE, TRUE); m_d3dWindow.pd3dDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESS); m_d3dWindow.pd3dDevice->SetRenderState(D3DRS_ZWRITEENABLE, TRUE); } //----------------------------------------------------------------------------- // 名称: cleanup() // 描述: 释放所有资源 //----------------------------------------------------------------------------- VOID D3DWindow::cleanup() { if( m_d3dWindow.pd3dDevice != NULL ) m_d3dWindow.pd3dDevice->Release(); if( m_d3dWindow.pD3D != NULL ) m_d3dWindow.pD3D->Release(); m_d3dWindow.pd3dDevice = NULL; m_d3dWindow.pD3D = NULL; } //----------------------------------------------------------------------------- // 名称: showWindow() // 描述: 显示窗口 //----------------------------------------------------------------------------- VOID D3DWindow::showWindow() { // 设置窗口大小并移动到屏幕中心 RECT windowRect; RECT clientRect; GetWindowRect(m_d3dWindow.hWnd, &windowRect); GetClientRect(m_d3dWindow.hWnd, &clientRect); int width = m_d3dWindow.iWidth + (windowRect.right-windowRect.left) - (clientRect.right-clientRect.left); int height = m_d3dWindow.iHeight + (windowRect.bottom-windowRect.top) - (clientRect.bottom-clientRect.top); MoveWindow(m_d3dWindow.hWnd, (m_d3dWindow.pd3ddm->Width - width)/2, (m_d3dWindow.pd3ddm->Height - height)/2, width, height, TRUE); // 显示窗口 ShowWindow( m_d3dWindow.hWnd, SW_SHOWDEFAULT ); UpdateWindow( m_d3dWindow.hWnd ); // 主消息循环 MSG msg; ZeroMemory( &msg, sizeof( msg ) ); while( msg.message != WM_QUIT ) { if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } else { Sleep(1); } } cleanup(); UnregisterClass( m_d3dWindow.lpszClassName, m_d3dWindow.hInst ); } //----------------------------------------------------------------------------- // 名称: getWindow() // 描述: 获得窗口结构体 //----------------------------------------------------------------------------- D3DWINDOW D3DWindow::getWindow() { return m_d3dWindow; } //----------------------------------------------------------------------------- // 名称: startRender() // 描述: 开始渲染 //----------------------------------------------------------------------------- VOID D3DWindow::startRender() { m_d3dWindow.pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, RGB(255,255,255), 1.0f, 0 ); m_d3dWindow.pd3dDevice->BeginScene(); } //----------------------------------------------------------------------------- // 名称: endRender() // 描述: 结束渲染 //----------------------------------------------------------------------------- VOID D3DWindow::endRender() { m_d3dWindow.pd3dDevice->EndScene(); m_d3dWindow.pd3dDevice->Present( NULL, NULL, NULL, NULL ); }