头文件
-
-
-
- #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;
- LPDIRECT3DDEVICE9 pd3dDevice;
- 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;
- };
源代码:
-
-
-
- #include "D3DWindow.h"
-
-
-
-
- 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,
- NULL, NULL,
- m_d3dWindow.lpszClassName, NULL
- };
- RegisterClassEx( &wc );
-
- m_d3dWindow.hWnd = CreateWindowEx( 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 );
-
- initD3D();
-
- memcpy(_pd3dWindow,&m_d3dWindow,sizeof(m_d3dWindow));
- }
- D3DWindow::~D3DWindow(void)
- {
- }
-
-
-
-
- VOID D3DWindow::initD3D()
- {
-
- m_d3dWindow.pD3D = Direct3DCreate9( D3D_SDK_VERSION );
-
- m_d3dWindow.pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,
- m_d3dWindow.pd3ddm);
-
- 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;
-
- 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 );
-
- m_d3dWindow.pd3dDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
- m_d3dWindow.pd3dDevice->SetRenderState(D3DRS_ALPHAREF, 64);
- m_d3dWindow.pd3dDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER);
-
- 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);
- }
-
-
-
-
- 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;
- }
-
-
-
-
- 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 );
- }
-
-
-
- D3DWINDOW D3DWindow::getWindow()
- {
- return m_d3dWindow;
- }
-
-
-
-
- VOID D3DWindow::startRender()
- {
- m_d3dWindow.pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,
- RGB(255,255,255), 1.0f, 0 );
- m_d3dWindow.pd3dDevice->BeginScene();
- }
-
-
-
-
- VOID D3DWindow::endRender()
- {
- m_d3dWindow.pd3dDevice->EndScene();
- m_d3dWindow.pd3dDevice->Present( NULL, NULL, NULL, NULL );
- }
(秩名) |