Direct2D的使用(1)
教大家怎么使用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);//参数是窗口句柄
实现的矩形如下图,当然,这样只是实现了效果,相关优化,可以熟悉了自己去修改。
Direct2D的使用(1)相关推荐
- Direct2D (15) : 剪辑
为什么80%的码农都做不了架构师?>>> 绘制在 RenderTarget.PushAxisAlignedClip() 与 RenderTarget.PopAxisAligne ...
- Direct2D开发:Direct2D 和 GDI 互操作性概述
本主题说明如何结合使用 Direct2D 和 GDI(可能为英文网页).有两种方法可以结合使用 Direct2D 和 GDI:您可以将 GDI 内容写入与 Direct2D GDI 兼容的呈现器目标, ...
- Direct2D教程(三)简单几何图形
从本章开始,我们介绍D2D几何图形. D2D图形分类 Direct2D支持多种类型的几何图形,包括 Simple Geometry(简单几何图形) 矩形 圆角矩形 椭圆 Path Geometry(路 ...
- Direct2D (23) : 复合几何对象之 ID2D1GeometryGroup
为什么80%的码农都做不了架构师?>>> uses Direct2D, D2D1;procedure TForm1.FormPaint(Sender: TObject); va ...
- Direct2D介绍
什么是Direct2D 一言以蔽之,就是Windows 7平台上的一个2D图形API,可以提供高性能,高质量的2D渲染.大多数人对Direct2D可能都比较陌生,以至于我之前在论坛上提到这个词的时候, ...
- Direct2D教程(九)渲染位图
概述 这篇的标题更确切的说应该叫位图画刷,这样才好和前几篇对应起来.在Direct2D中,位图的渲染也是通过画刷来实现的. Direct2D中并没有直接操作位图的接口,而是借助WIC(Windows ...
- Direct2D (25) : 将画笔线条所占用的区域转换为路径 - ID2D1Geometry.Widen()
uses Direct2D, D2D1;procedure TForm1.FormPaint(Sender: TObject); varcvs: TDirect2DCanvas;iGeometry: ...
- TeeChart.Direct2D.dll的使用
这个dll本身依赖于第三方的控件,SlimDX ,可以从 http://slimdx.org/ 下载. .net4.0的版本区分x86和x64 帧数的概念 我们通常说帧数,简单地说,就是在1秒钟时间 ...
- Direct2D (11) : 画刷之 ID2D1LinearGradientBrush
TDirect2DCanvas.Brush 的类型是 TDirect2DBrush,它和 GDI 的 TBrush 的区别主要有两点: 1.只保留了 TBrush.Style 中的 bsSolid.b ...
- Direct2D教程(一)Direct2D已经来了,谁是GDI的终结者?
什么是Direct2D 一言以蔽之,就是Windows 7平台上的一个2D图形API,可以提供高性能,高质量的2D渲染.大多数人对Direct2D可能都比较陌生,以至于我之前在论坛上提到这个词的时候, ...
最新文章
- 开发日记-20190518 关键词 函数式编程(二)
- 1057. 数零壹(20)
- Java编程 的动态性,第 2部分: 引入反射--转载
- Shell学习笔记 - 环境变量配置文件(转)
- VS2013 生成时复制文件或目录到指定目录
- vi常用命令与设置(不断修改中)
- 欢迎来到 C# 9.0(Welcome to C# 9.0)
- 【先生】丘成桐:中国人可以做世界一流学者
- twisted mysql_在Twisted下用MySQLadbapi获取自增id
- 第四范式完成超10亿元C轮融资,估值12亿美元
- 数学建模(NO.9斯皮尔曼相关系数)
- hd计算机技术,BD和HD的区别是什么?
- lzg_ad: SQL SERVER2000安装问题
- 抽屉新热榜html源码,利用scrapy获取抽屉新热榜的标题和内容以及新闻地址保存到本地...
- Android App 启动优化全记录
- 移动互联网App推广的十大难题
- EasyUI DataGrid 隐藏其中一列
- PB12.6INI配置文件乱码问题(ansi|utf8)
- 抖音seo,抖音企业号管理,抖音搜索排名源码搭建
- 深入浅出WPF知识点汇总一
热门文章
- NVIDIA支持CUDA的显卡选型简述
- 嵌入式培训c语言编程,嵌入式C语言学习秘诀
- 时间序列分析之一次指数平滑法
- 【Navicat】Navicat:Navicat 导出表结构(表设计)为 EXCEL 格式
- Java使用EasyExcel导出简单、复杂excel,以及多个excel打包导出下载zip
- 播放FLV文件的方法
- java导出各种PDF文件(图片、表格、字体)
- ELK+Filebeat 部署安装
- 学计算机南昌哪个中专比较好,南昌中专计算机主要学什么
- codeforces contest 985E. Pencils and Boxes+思维