注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

刘邓

每天收获一点点-目标:富足

 
 
 

日志

 
 

Direct3D初始化(类的封装)  

2012-03-06 19:52:03|  分类: 技术类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
之前的是面向过程的初始化,我把过程以CInitD3D类封装起来,让以后的实践更多的关注绘制的本身而不是老长的初始化过程
下面是封装后的代码:

//把具体的操作分离出来这样我们将更多的关注于绘制本身而不是老长的初始化过程
//以后的初始化过程将可以被重复利用
//RENDER.cpp
#include"CInitWindow.h"

void CInitD3D::Direct3DRender()
{
g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,255),1.0f,0);
g_pd3dDevice->BeginScene(); //开始绘制

/*
...
...
其中为具体绘制的内容
...
...
*/
g_pd3dDevice->EndScene();
g_pd3dDevice->Present(NULL,NULL,NULL,NULL);
}

//初始化D3D类的头文件
#include<d3d9.h>
class CInitD3D
{
public:
CInitD3D();
~CInitD3D();
LPDIRECT3DDEVICE9 g_pd3dDevice ;
HRESULT InitDirect3D(HWND hWnd); //初始化D3D
void Direct3DRender(); //渲染图形
void Direct3DCleanup(); //清理D3D资源
};

CInitD3D::CInitD3D()
{
g_pd3dDevice = NULL;
}

CInitD3D::~CInitD3D()
{
Direct3DCleanup();
}

HRESULT CInitD3D::InitDirect3D(HWND hWnd)
{
//创建IDirect3D接口
LPDIRECT3D9 pD3D = NULL;//IDirect interface
pD3D = Direct3DCreate9(D3D_SDK_VERSION);
if (pD3D == NULL)
{
return E_FAIL;
}
//获取硬件设备信息
D3DCAPS9 caps;
int vp = 0;
pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&caps);
if(caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;

//创建Direct3D设备接口
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.BackBufferWidth = 640;
d3dpp.BackBufferHeight = 480;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount = 1;
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 = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;

pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,vp,&d3dpp,&g_pd3dDevice);//创建设备
pD3D->Release();
return S_OK;
}

void CInitD3D::Direct3DCleanup()
{
if (g_pd3dDevice!=NULL)
{
g_pd3dDevice->Release();
}
g_pd3dDevice = NULL;
}

//初始化窗口的头文件

#include<d3d9.h>
#include "CInitD3D.h"

CInitD3D D3D;
const char *g_pClassName = "HelloDirect3D";//窗口类名
const char *g_pWindowName = "Direct3D初始化";//窗口标题

LRESULT CALLBACK WinWNDPROC(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
//以下部分为初始化窗口类部分
WNDCLASS wndclass;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//窗口背景初始化
wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);//光标(Cursor)初始化
wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);//窗口小图标初始化
wndclass.hInstance = hInstance ;//初始化窗口类句柄
wndclass.lpfnWndProc = WinWNDPROC; //定义窗口类的消息处理函数
wndclass.lpszClassName = g_pClassName;//窗口类名
wndclass.lpszMenuName = NULL;//无菜单栏所以为空
wndclass.style = CS_HREDRAW|CS_VREDRAW;//窗口样式

//以下部分为注册窗口类

if(!RegisterClass(&wndclass))
return 0;

//以下部分为创建窗口部分,直接调用CreatWindow函数即可

HWND hWnd = CreateWindow(
g_pClassName, //窗口类名
g_pWindowName, //窗口标题
WS_OVERLAPPEDWINDOW, //窗口样式
CW_USEDEFAULT, //窗口最初x位置
CW_USEDEFAULT, //窗口最初y位置
CW_USEDEFAULT, //窗口最初宽度
CW_USEDEFAULT, //窗口最初高度(以上均为默认值)
NULL, //窗口父句柄
NULL, //窗口菜单句柄
wndclass.hInstance, //应用程序实例句柄
NULL //创建窗口的参数
);

D3D.InitDirect3D(hWnd);
//以下部分为显示,更新窗口部分
ShowWindow(hWnd,nShowCmd);
UpdateWindow(hWnd);
//以下部分为消息处理函数,即消息循环

MSG msg; //定义一个message消息实例
ZeroMemory(&msg,sizeof(msg));//把第一个参数的开始地址以及它的长度的内存段用0来填充
while (msg.message!=WM_QUIT) //取得消息
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg); //翻译消息(把键盘消息传入值对照映射到虚拟表中)
DispatchMessage(&msg); //传递消息(把消息加入Windows队列或者直接加入程序队列中)
}
else
{
D3D.Direct3DRender(); //绘制3D场景
}
}

UnregisterClass("HelloMsg",wndclass.hInstance);
return 0;
}


LRESULT CALLBACK WinWNDPROC(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_PAINT:
D3D.Direct3DRender();//重新绘制
ValidateRect(hWnd,NULL);//更新客户区的显示
break;
case WM_DESTROY:
D3D.Direct3DCleanup(); //窗口销毁消息
PostQuitMessage(0); //显示退出消息
break;
}
return DefWindowProc(hWnd,message,wParam,lParam);
}



  评论这张
 
阅读(300)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017