文档章节

Direct2D (14) : 画笔

涂孟超
 涂孟超
发布于 2014/09/26 15:37
字数 448
阅读 16
收藏 0

画笔类 TDirect2DPen 的 Brush 属性是 TDirect2DBrush,现在的单色画笔其实是调用的实心画刷。
因为画刷的强大,所以让画笔丰富起来不是难事。

TDirect2DPen 的 StrokeStyle 属性是 ID2D1StrokeStyle 类型,它决定着线帽、拐角样式等;但遗憾的是该属性是只读的,基本无用。
但 TDirect2DPen 的 Style 属性还是巧妙实现了 psSolid, psDash, psDot, psDashDot, psDashDotDot。

测试代码:

uses Direct2D, D2D1;

procedure TForm1.FormPaint(Sender: TObject);
var
  cvs: TDirect2DCanvas;
  R: TRect;
begin
  cvs := TDirect2DCanvas.Create(Canvas, ClientRect);
  R := ClientRect;
  InflateRect(R, -ClientWidth div 6, -ClientHeight div 6);

  cvs.Pen.Color := clRed;
  cvs.Pen.Style := psDash;

  cvs.BeginDraw;
  cvs.Ellipse(R);
  cvs.EndDraw;
  cvs.Free;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  Repaint;
end;


效果图:



下面是较原始的实现方法(效果同上):

uses Direct2D, D2D1;

procedure TForm1.FormPaint(Sender: TObject);
var
  cvs: TDirect2DCanvas;
  iBrush: ID2D1SolidColorBrush;
  iStrokeStyle: ID2D1StrokeStyle;
  rStrokeStyleProperties: TD2D1StrokeStyleProperties;
  R: TRect;
  rEllipse: TD2D1Ellipse;
begin
  cvs := TDirect2DCanvas.Create(Canvas, ClientRect);
  R := ClientRect;
  InflateRect(R, -ClientWidth div 6, -ClientHeight div 6);
  rEllipse := D2D1Ellipse(D2D1PointF((R.Right-R.Left)/2+R.Left, (R.Bottom-R.Top)/2+R.Top), (R.Right-R.Left)/2, (R.Bottom-R.Top)/2);

  cvs.BeginDraw;
  cvs.RenderTarget.CreateSolidColorBrush(D2D1ColorF(clRed), nil, iBrush);
  rStrokeStyleProperties := D2D1StrokeStyleProperties(); //获取 StrokeStyle 属性的默认值
  rStrokeStyleProperties.dashStyle := D2D1_DASH_STYLE_DASH;
  D2DFactory.CreateStrokeStyle(rStrokeStyleProperties, nil, 0, iStrokeStyle);
  cvs.RenderTarget.DrawEllipse(rEllipse, iBrush, 1, iStrokeStyle);
  cvs.EndDraw;
  cvs.Free;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  Repaint;
end;


自定义虚线:

uses Direct2D, D2D1;

procedure TForm1.FormPaint(Sender: TObject);
var
  cvs: TDirect2DCanvas;
  iBrush: ID2D1SolidColorBrush;
  iStrokeStyle: ID2D1StrokeStyle;
  rStrokeStyleProperties: TD2D1StrokeStyleProperties;
  R: TRect;
  rEllipse: TD2D1Ellipse;
  arrSingle: array[0..3] of Single;
begin
  cvs := TDirect2DCanvas.Create(Canvas, ClientRect);
  R := ClientRect;
  InflateRect(R, -ClientWidth div 6, -ClientHeight div 6);
  rEllipse := D2D1Ellipse(D2D1PointF((R.Right-R.Left)/2+R.Left, (R.Bottom-R.Top)/2+R.Top), (R.Right-R.Left)/2, (R.Bottom-R.Top)/2);

  cvs.BeginDraw;
  cvs.RenderTarget.CreateSolidColorBrush(D2D1ColorF(clRed), nil, iBrush);
  rStrokeStyleProperties := D2D1StrokeStyleProperties();

  rStrokeStyleProperties.dashStyle := D2D1_DASH_STYLE_CUSTOM;
  arrSingle[0] := 10;
  arrSingle[1] := 5;
  arrSingle[2] := 1;
  arrSingle[3] := 5;
  D2DFactory.CreateStrokeStyle(rStrokeStyleProperties, @arrSingle[0], Length(arrSingle), iStrokeStyle);

  cvs.RenderTarget.DrawEllipse(rEllipse, iBrush, 2, iStrokeStyle);
  cvs.EndDraw;
  cvs.Free;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  Repaint;
end;


效果图:




自定义拐角样式:

uses Direct2D, D2D1;

procedure TForm1.FormPaint(Sender: TObject);
var
  cvs: TDirect2DCanvas;
  iBrush: ID2D1SolidColorBrush;
  iStrokeStyle: ID2D1StrokeStyle;
  rStrokeStyleProperties: TD2D1StrokeStyleProperties;
  R: TRect;
begin
  cvs := TDirect2DCanvas.Create(Canvas, ClientRect);
  R := ClientRect;
  InflateRect(R, -ClientWidth div 5, -ClientHeight div 5);

  cvs.BeginDraw;
  cvs.RenderTarget.CreateSolidColorBrush(D2D1ColorF(clGray), nil, iBrush);

  rStrokeStyleProperties := D2D1StrokeStyleProperties();
  rStrokeStyleProperties.lineJoin := D2D1_LINE_JOIN_BEVEL;
  D2DFactory.CreateStrokeStyle(rStrokeStyleProperties, nil, 0, iStrokeStyle);

  cvs.RenderTarget.DrawRectangle(R, iBrush, 25, iStrokeStyle);
  cvs.EndDraw;
  cvs.Free;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  Repaint;
end;


效果图:



本文转载自:http://www.cnblogs.com/del/archive/2011/04/02/2003982.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
Direct2D教程(十)绘制文本

概述 在Direct2D中,文本的绘制是通过DirectWrite来实现的,DirectWrite实际上已经是一个独立的DirectX组件了。关于DirectWrite,我摘录了MSDN的一段文字。 DirectWrite介绍 当今的应用程序应...

吞吞吐吐的
2017/10/17
0
0
使用ChemDraw Std 14如何绘制曲线

ChemDraw可以说是世界上最好的化学绘图工具。它能轻松绘制有机材料、有机金属、聚合材料和生物聚合物(包括氨基酸、肽、DNA 及 RNA 序列等),以及处理立体化学等高级形式。chemdraw14.0序列...

学术研究软件
2016/04/11
55
0
关于Direct3D11里汉字显示的一些思考

本系列文章由zhmxy555(毛星云)编写,转载请注明出处。 http://blog.csdn.net/zhmxy555/article/details/8147234 作者:毛星云 邮箱: happylifemxy@163.com 这篇文章里,浅墨希望与大家一起...

长平狐
2012/11/12
690
0
硬件加速:浏览器大战的新前沿

硬件加速:浏览器大战的新前沿 作者:Frederic Lardinois / 2009年11月24日 9:04AM 微软在本月初召开的专业开发者大会(Professional Developers Conference)上宣布了其最新的IE9计划,微软在...

老枪
2009/11/26
189
0
3.14 使用斑点画笔工具绘制拖鞋图标 [Illustrator CC教程]

原文:http://coolketang.com/staticDesign/5a979d2d128fe1189bd26913.html 1. 本节课将为您详细讲解[斑点画笔工具]的用法。[斑点画笔工具]所绘制的路径,会自动扩展和合并堆叠顺序中,相邻的...

fzhlee
03/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

SpringCloud SpringBoot mybatis分布式Web应用的统一异常处理

我们在做Web应用的时候,请求处理过程中发生错误是非常常见的情况。Spring Boot提供了一个默认的映射:/error,当处理中抛出异常之后,会转到该请求中处理,并且该请求有一个全局的错误页面用...

itcloud
12分钟前
0
0
c++ std::bind和std::function

定义于头文件 <functional> std::bind 函数绑定,https://zh.cppreference.com/w/cpp/utility/functional/bind // bind 用例#include <iostream>#include <functional> // 自定义的一......

SibylY
14分钟前
0
0
SecureCRT的安装与破解(过程很详细!!!)

SecureCRT的安装与破解(过程很详细!!!) SecureCRT的安装与破解(过程很详细!!!) 使用SecureCRT可以方便用户在windows环境下对linux主机进行管理,这里为大家讲一下SecureCRT的破解方...

DemonsI
19分钟前
0
0
介绍几款可用的web应用防火墙

目前有两款,基于软件和基于应用程序的web应用防火墙。基于软件的产品布置在Web服务器上,而基于应用程序的产品放置在Web服务器和互联网接口之间。两种类型的防火墙都会在数据传入和传出web...

上树的熊
25分钟前
1
0
用Visual Studio开发以太坊智能合约

区块链和以太坊 自从我熟悉区块链、以太坊和智能合约以来,一直失眠。 我一直在阅读,阅读和阅读,最后我能够使用一些工具,他们建议使用以太坊网站官方客户端应用程序(Ethereum Wallet)也...

geek12345
27分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部