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);//参数是窗口句柄
实现的矩形如下图,当然,这样只是实现了效果,相关优化,可以熟悉了自己去修改。
很多人使用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);//参数是窗口句柄
实现的矩形如下图,当然,这样只是实现了效果,相关优化,可以熟悉了自己去修改。
相关文章推荐
- Direct2D (37) : 使用不同画刷绘制文本
- DXGI的使用 --Direct2D 和 Direct3D 互操作性概述
- 在 WinForm 中使用 Direct2D
- WPF 使用 Direct2D1 画图 绘制基本图形
- Windows桌面应用程序(1-2-4-8th) 在Direct2D中使用颜色
- 使用WIC将Direct2D绘制的图形保存为文件
- 在Unity中使用Direct2D
- Direct2D 1.1 开发笔记 特效篇(一) 使用D2D特效
- Direct2D 中ID2D1Bitmap 的使用
- Direct2D 中ID2D1Bitmap 的使用
- WinRT使用direct2d自由旋转图片
- 在Unity中使用Direct2D
- 使用WIC将Direct2D绘制的图形保存为文件
- Direct2D (39) : 使用 IDWriteTextLayout.Draw() 方法绘制文本
- Direct2D在VC中的使用
- Direct 9.0c 中使用ID3DXSprite来绘制2D动画
- Direct2D的使用
- 在Unity中使用Direct2D
- 使用DirectWrite测量Direct2D文字大小
- 使用WIC将Direct2D绘制的图形保存为文件