📄 d3dbase.cpp
字号:
#include "D3DBase.h"
CD3DApplication* CD3DApplication::m_pApp = NULL;
CD3DApplication::CD3DApplication()
{
this->m_Height = 480;
this->m_Width = 640;
this->m_pApp = this;
this->m_pD3D9Object = NULL;
this->m_pD3DDevice = NULL;
this->m_hMainWnd = NULL;
}
bool CD3DApplication::create(int Width,int Height, const char* appTitle,bool fullScreen)
{
m_isFullScreen = fullScreen;
WNDCLASSEX wndclass ;
wndclass.cbSize = sizeof (wndclass) ;
DWORD wndStyle = WS_POPUP;
if(fullScreen == true)
{
wndStyle = WS_POPUP;
}
else
{
wndStyle = WS_OVERLAPPEDWINDOW;
}
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = CD3DApplication::windowProc;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = GetModuleHandle(NULL);
wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION) ;// (wndclass.hInstance, MAKEINTRESOURCE(IDI_DGE) ) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
LOGBRUSH longBrush =
{
BS_SOLID,RGB(255,255,255),0
};
wndclass.hbrBackground = CreateBrushIndirect(&longBrush);//(HBRUSH) GetStockObject(BLACK_BRUSH) ;
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = "D3DCreateWnd";
wndclass.hIconSm = LoadIcon(NULL,IDI_APPLICATION);//(wndclass.hInstance, MAKEINTRESOURCE(IDI_DGE) ) ;
// Register the class
RegisterClassEx(&wndclass);
// Create a window
HWND hWnd = CreateWindowEx(
0, // Extended style
wndclass.lpszClassName,
appTitle,
wndStyle, // Window style
0, // Horizontal origin
0, // Vertical origin
Width,//GetSystemMetrics(SM_CXSCREEN), // x size
Height,//GetSystemMetrics(SM_CYSCREEN), // y size
NULL, // Handle of parent
NULL, // Handle to menu
wndclass.hInstance,//hInstance, // Application instance
NULL); // Additional data
if (!hWnd)
{
return NULL;
}
m_hMainWnd = hWnd;
::ShowWindow(hWnd,SW_SHOW);
return hWnd != NULL;
}
bool CD3DApplication::createdevice(int bufferWidht, int bufferHeight)
{
if(m_hMainWnd == NULL)
return NULL;
m_pD3D9Object = Direct3DCreate9(D3D_SDK_VERSION);
if(NULL == m_pD3D9Object)
return false;
m_isFullScreen = false;
m_DepthStencilFormat = D3DFMT_D16;
m_BackBufferFormat = D3DFMT_X8R8G8B8;
D3DDISPLAYMODE d3dm;
if(FAILED(m_pD3D9Object->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3dm) ))
{
return NULL;
}
//Now Check the depth - Stencil buffer format
HRESULT hr = m_pD3D9Object->CheckDeviceFormat( D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
m_BackBufferFormat,
D3DUSAGE_DEPTHSTENCIL,
D3DRTYPE_SURFACE,
m_DepthStencilFormat);
if(FAILED(hr))
return NULL;
hr = m_pD3D9Object->CheckDepthStencilMatch(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,m_BackBufferFormat,
m_BackBufferFormat,m_DepthStencilFormat) ;
if( !SUCCEEDED(hr))
return NULL;
//Now prepaire to create the D3D Device;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof(d3dpp) );
d3dpp.BackBufferCount = 1;
d3dpp.hDeviceWindow = m_hMainWnd;
d3dpp.BackBufferWidth = bufferWidht;
d3dpp.BackBufferHeight = bufferHeight;
d3dpp.BackBufferFormat = m_BackBufferFormat;
if(m_isFullScreen)
{
d3dpp.FullScreen_RefreshRateInHz = d3dm.RefreshRate;
if(FAILED(m_pD3D9Object->CheckDeviceType(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,d3dpp.BackBufferFormat,d3dpp.BackBufferFormat,TRUE)))
{
return NULL;
}
}
d3dpp.AutoDepthStencilFormat = m_DepthStencilFormat;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.Windowed = !m_isFullScreen;
d3dpp.SwapEffect = D3DSWAPEFFECT_FLIP;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
//All parameter is filled Check the device type first
//Now I can create the device
if(FAILED(m_pD3D9Object->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,m_hMainWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&m_pD3DDevice) ) )
{
return false;
}
return true;
}
void CD3DApplication::destoryApp()
{
if(m_pD3DDevice->Release() >0)
{
//MessageBoxA(NULL,"有资源没有释放!","警告",MB_OK);
}
m_pD3DDevice = NULL;
m_pD3D9Object->Release();
m_pD3D9Object= NULL;
}
bool CD3DApplication::loop()
{
MSG msg;
//DWORD thisTick;
DWORD lastTick;
int count=0;
lastTick=GetTickCount();
while( 1 )
{
if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) )
{
if( !GetMessage( &msg, NULL, 0, 0 ) )//Remove The message From the Message Queue
{
return msg.wParam != 0;
}
//if ( !TranslateAccelerator( g_AppData.hWnd, g_AppData.hAccel, &msg ) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
else
{
DWORD thisTickt = GetTickCount();
long passedTime = thisTickt - lastTick;
lastTick = thisTickt;
onRender(passedTime);
}
}
return true;
}
LONG CALLBACK CD3DApplication::windowProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
if(hWnd == m_pApp->m_hMainWnd)
{
return m_pApp->onWndMessage(msg,wParam,lParam);
}
return (LONG)::DefWindowProc(hWnd,msg,wParam,lParam);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -