您的位置:首页 > 其它

Direct2D的使用(1)

2014-06-10 12:55 363 查看
教大家怎么使用D2d简单画出一个矩形。有些新手看到,为什么D2D操作要进行那么多代码就晕了,下面就简单来说明这些步骤(后面附带完整代码和附带效果图,注意D2D的画图实现,也是放在OnPaint()函数里面实现的)(本人使用的编译器版本为2010,对于VC6.0,我不清楚是否带有这些头文件,很久没用VC6.0了,读者可以试试看)

很多人使用D2D有游戏开发的目的,那就来开始你的游戏之旅吧,说太多了,看下面的简单的6个步骤为你开启入门。

1.添加头文件和链接

#include <d2d1.h>

#pragma comment(lib, "d2d1.lib")

//提示:D2D接口的标志是ID2D1,然后后面是加上你想要的功能英文,便于记忆。

2.创建 ID2D1Factory

ID2D1Factory* pD2DFactory = NULL;

HRESULT hr = D2D1CreateFactory(

D2D1_FACTORY_TYPE_SINGLE_THREADED,

&pD2DFactory

);



3.创建 ID2D1HwndRenderTarget

CRect rc;

GetClientRect(hwnd, &rc);

// 创建2D渲染器,用来在窗口中进行渲染

targetID2D1HwndRenderTarget* pRT = NULL;

HRESULT hr = pD2DFactory->CreateHwndRenderTarget(

D2D1::RenderTargetProperties(),

D2D1::HwndRenderTargetProperties( hwnd, D2D1::SizeU( rc.right - rc.left, rc.bottom - rc.top) ),

&pRT);



4.创建画笔

ID2D1SolidColorBrush* pBlackBrush = NULL;

if (SUCCEEDED(hr))

{

pRT->CreateSolidColorBrush(

D2D1::ColorF(D2D1::ColorF::Black),

&pBlackBrush );//这里创建的是黑色

}



5.绘制矩形



pRT->BeginDraw(); //绘制过程和D3D一样,BeginDraw,endDraw内实现绘画代码

pRT->Clear(D2D1::ColorF(D2D1::ColorF::White,0));//用某种颜色清空上一次绘画。这里用白色。

pRT->DrawRectangle(

D2D1::RectF(

rc.left + 100.0f,

rc.top + 100.0f,

rc.right - 100.0f,

rc.bottom - 100.0f),

pBlackBrush);

HRESULT hr = pRT->EndDraw();



6.最后释放资源

SafeRelease(pRT);

SafeRelease(pBlackBrush);

SafeRelease(pD2DFactory);



以下是完整代码,变量名称和上说讲解的不一致。

#include <d2d1.h>

#pragma comment(lib, "d2d1.lib")

ID2D1Factory* pD2DFactory = NULL;

ID2D1HwndRenderTarget* pRenderTarget=NULL;//用来在窗口中进行渲染

ID2D1SolidColorBrush* pBlackBrush=NULL;//定义画刷,用来绘制图形

ID2D1RadialGradientBrush* pRadialGradientBrush=NULL; //渐变画刷

#define SAFE_RELEASE(p) if(p){p->Release() ; p = NULL ;} //这里释放后记得赋值NULL,不然条件判断无效

VOID DrawRectangle(HWND hwnd)

{

HRESULT hr;

RECT rc={0,0,500,500};//渲染矩形大小

hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &pD2DFactory) ;

if(!SUCCEEDED(hr))

{

MessageBox(hwnd,"创建失败1",0);

}

hr = pD2DFactory->CreateHwndRenderTarget(

D2D1::RenderTargetProperties(),

D2D1::HwndRenderTargetProperties(

hwnd,

D2D1::SizeU(rc.right - rc.left,rc.bottom - rc.top)),

&pRenderTarget) ;

if(!SUCCEEDED(hr))

{

MessageBox(hwnd,"创建失败2","Error",0);

}

hr = pRenderTarget->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::Red),&pBlackBrush);//这里创建的是红色画笔

if(!SUCCEEDED(hr))

{

MessageBox(hwnd,"创建失败3",0);

}

pRenderTarget->BeginDraw() ;//开始画图

pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White,0));

pRenderTarget->DrawRectangle(

D2D1::RectF(

rc.left + 100.0f,

rc.top + 100.0f,

rc.right - 100.0f,

rc.bottom - 100.0f),

pBlackBrush);//进行绘图

hr = pRenderTarget->EndDraw() ;//结束画图

if(!SUCCEEDED(hr))

{

MessageBox(hwnd,"绘图失败","Error",0);

}

SAFE_RELEASE(pBlackBrush) ;//释放指针

SAFE_RELEASE(pRadialGradientBrush);

}



然后在OnPaint()函数里面调用

如:DrawRectangle(m_hWnd);//参数是窗口句柄

实现的矩形如下图,当然,这样只是实现了效果,相关优化,可以熟悉了自己去修改。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: