教大家怎么使用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)相关推荐

  1. Direct2D (15) : 剪辑

    为什么80%的码农都做不了架构师?>>>    绘制在 RenderTarget.PushAxisAlignedClip() 与 RenderTarget.PopAxisAligne ...

  2. Direct2D开发:Direct2D 和 GDI 互操作性概述

    本主题说明如何结合使用 Direct2D 和 GDI(可能为英文网页).有两种方法可以结合使用 Direct2D 和 GDI:您可以将 GDI 内容写入与 Direct2D GDI 兼容的呈现器目标, ...

  3. Direct2D教程(三)简单几何图形

    从本章开始,我们介绍D2D几何图形. D2D图形分类 Direct2D支持多种类型的几何图形,包括 Simple Geometry(简单几何图形) 矩形 圆角矩形 椭圆 Path Geometry(路 ...

  4. Direct2D (23) : 复合几何对象之 ID2D1GeometryGroup

    为什么80%的码农都做不了架构师?>>>    uses Direct2D, D2D1;procedure TForm1.FormPaint(Sender: TObject); va ...

  5. Direct2D介绍

    什么是Direct2D 一言以蔽之,就是Windows 7平台上的一个2D图形API,可以提供高性能,高质量的2D渲染.大多数人对Direct2D可能都比较陌生,以至于我之前在论坛上提到这个词的时候, ...

  6. Direct2D教程(九)渲染位图

    概述 这篇的标题更确切的说应该叫位图画刷,这样才好和前几篇对应起来.在Direct2D中,位图的渲染也是通过画刷来实现的. Direct2D中并没有直接操作位图的接口,而是借助WIC(Windows ...

  7. Direct2D (25) : 将画笔线条所占用的区域转换为路径 - ID2D1Geometry.Widen()

    uses Direct2D, D2D1;procedure TForm1.FormPaint(Sender: TObject); varcvs: TDirect2DCanvas;iGeometry: ...

  8. TeeChart.Direct2D.dll的使用

    这个dll本身依赖于第三方的控件,SlimDX ,可以从 http://slimdx.org/ 下载.  .net4.0的版本区分x86和x64 帧数的概念 我们通常说帧数,简单地说,就是在1秒钟时间 ...

  9. Direct2D (11) : 画刷之 ID2D1LinearGradientBrush

    TDirect2DCanvas.Brush 的类型是 TDirect2DBrush,它和 GDI 的 TBrush 的区别主要有两点: 1.只保留了 TBrush.Style 中的 bsSolid.b ...

  10. Direct2D教程(一)Direct2D已经来了,谁是GDI的终结者?

    什么是Direct2D 一言以蔽之,就是Windows 7平台上的一个2D图形API,可以提供高性能,高质量的2D渲染.大多数人对Direct2D可能都比较陌生,以至于我之前在论坛上提到这个词的时候, ...

最新文章

  1. 开发日记-20190518 关键词 函数式编程(二)
  2. 1057. 数零壹(20)
  3. Java编程 的动态性,第 2部分: 引入反射--转载
  4. Shell学习笔记 - 环境变量配置文件(转)
  5. VS2013 生成时复制文件或目录到指定目录
  6. vi常用命令与设置(不断修改中)
  7. 欢迎来到 C# 9.0(Welcome to C# 9.0)
  8. 【先生】丘成桐:中国人可以做世界一流学者
  9. twisted mysql_在Twisted下用MySQLadbapi获取自增id
  10. 第四范式完成超10亿元C轮融资,估值12亿美元
  11. 数学建模(NO.9斯皮尔曼相关系数)
  12. hd计算机技术,BD和HD的区别是什么?
  13. lzg_ad: SQL SERVER2000安装问题
  14. 抽屉新热榜html源码,利用scrapy获取抽屉新热榜的标题和内容以及新闻地址保存到本地...
  15. Android App 启动优化全记录
  16. 移动互联网App推广的十大难题
  17. EasyUI DataGrid 隐藏其中一列
  18. PB12.6INI配置文件乱码问题(ansi|utf8)
  19. 抖音seo,抖音企业号管理,抖音搜索排名源码搭建
  20. 深入浅出WPF知识点汇总一

热门文章

  1. NVIDIA支持CUDA的显卡选型简述
  2. 嵌入式培训c语言编程,嵌入式C语言学习秘诀
  3. 时间序列分析之一次指数平滑法
  4. 【Navicat】Navicat:Navicat 导出表结构(表设计)为 EXCEL 格式
  5. Java使用EasyExcel导出简单、复杂excel,以及多个excel打包导出下载zip
  6. 播放FLV文件的方法
  7. java导出各种PDF文件(图片、表格、字体)
  8. ELK+Filebeat 部署安装
  9. 学计算机南昌哪个中专比较好,南昌中专计算机主要学什么
  10. codeforces contest 985E. Pencils and Boxes+思维