文档章节

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
Python中turtle库的使用

Turtle图形库 Turtle库是Python内置的图形化模块,属于标准库之一,位于Python安装目录的lib文件夹下,常用函数有以下几种: 画笔控制函数 1. :抬起画笔; 2. :落下画笔; 3. :画笔宽度; 4....

村雨1943
10/01
0
0
关于Direct3D11里汉字显示的一些思考

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

长平狐
2012/11/12
690
0
3.14 使用斑点画笔工具绘制拖鞋图标 [Illustrator CC教程]

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

fzhlee
03/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

arcgis jsapi接口入门系列(2):图层基础操作

//图层相关demo layerFun: function () { //获取地图的所有图层(不包括的图层类型:底图图层(basemaps)) let layers = this.map.layers; ...

canneljls
18分钟前
1
0
MySQL忘记root密码--不重启mysqd重置root密码

先提个问题:如何不重启mysqld,且没有权限修改用户账号和权限的情况下,如何重新设置root密码?不知道没关系,在此之前我也是不知道如何操作的,先看看下面的几种重置root密码的方法。 1、s...

IT--小哥
20分钟前
1
0
php7不再支持HTTP_RAW_POST_DATA,微信支付$GLOBALS[‘HTTP_RAW_POST_DATA’]获取不到数据,

升级到php7后, 发现旧的web系统有些问题, 查看后才发现原来是php7不再支持HTTP_RAW_POST_DATA 原来系统一些地方, 使用$GLOBALS[‘HTTP_RAW_POST_DATA’]来获取数据, 在php7里无法获取了 ...

15834278076
21分钟前
1
0
Android--拨打电话功能

Intent callIntent = new Intent(); callIntent.setAction(Intent.ACTION_DIAL); callIntent.setData(Uri.parse("tel:" + "4008823823")......

lanyu96
28分钟前
1
0
iOS多种刷新样式、音乐播放器、仿抖音视频、旅游App等源码

iOS精选源码 企业级开源项目,模仿艺龙旅行App 3D立体相册,可以旋转的立方体 横竖屏切换工具,使用陀螺仪检测手机设备方向,锁屏状... Swift版Refresh(可以自定义多种样式)架构方面有所优化...

Android爱开源
32分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部