1. 首先是建立一个程序框架,用单文档界面就可以了。
2. 以CWnd为基类,派生一个窗口类CD3DWnd。
3. 在主窗口增加一个CD3DWnd数据类型成员,也既是产生一个
CD3DWnd对象。
方法:CD3DWnd m_pWndD3D; //标准的命名方法
2.利用类向导添加两个消息处理函数
//用于创建并显示一个CD3DWnd窗口
void CMainFrame::OnD3dBegin()
{
m_wndD3D.CreateEx(
0,AfxRegisterWndClass(0,NULL,NULL,NULL),
"Direct3D窗口",WS_POPUP|WS_CAPTION|WS_VISIBLE,
CRect(100,100,500,500),this,0);
//: Add your command handler code here
}
//销毁窗口
void CMainFrame::OnD3dEnd()
{
// TODO: Add your command handler code here
m_wndD3D.DestroyWindow();
}
小结:通过上面的部分就能为建立D3D搭一个桥了,只是现在建立的窗口只是一个MFC窗口。下面的部分为它添加DIRECT3D的功能。
4. 初始化Direct3D
A. 创建Direct3D对象
LPDIRECT3D9 m_pD3D;
LPDIRECT3DDEVICE9 m_pDevice;
void InitD3D();
void InitD3D()的代码
void CD3DWnd::InitD3D()
{
m_pD3D=::Direct3DCreate9(D3D_SDK_VERSION);
D3DPRESENT_PARAMETERS d3dpp;
::ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.Windowed=TRUE;
d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat=D3DFMT_UNKNOWN;
m_pD3D->CreateDevice(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
m_hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,&m_pDevice);
}
这个初始化函数建立好之后还要在CWndD3D中创建创建函数,以便调用InitD3D
int CD3DWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
InitD3D();
return 0;
}
B. 为创建好的Direct3D对象创建设备对象
渲染部分
还是必须先创建这个函数
void CD3DWnd::Render()
{
m_pDevice->Clear(
0,NULL,D3DCLEAR_TARGET,
D3DCOLOR_XRGB(0,255,255),
1.0f,0);
m_pDevice->BeginScene();
m_pDevice->EndScene();
m_pDevice->Present(NULL,NULL,NULL,NULL);
}
然后再调用
void CD3DWnd::OnPaint()
{
CPaintDC dc(this); // device context for painting
Render();
// TODO: Add your message handler code here
// Do not call CWnd::OnPaint() for painting messages
}
5. 释放接口
分两部分
第一部分是把设备对象和D3D对象按照次序释放。
void CD3DWnd::Cleanup()
{
m_pDevice->Release();
m_pD3D->Release();
}
第二部分是把CD3DWnd类在内存中师范出来。
void CD3DWnd::OnDestroy()
{
CWnd::OnDestroy();
Cleanup();
// TODO: Add your message handler code here
}