文档章节

Direct2D (37) : 使用不同画刷绘制文本

涂孟超
 涂孟超
发布于 2014/09/26 15:35
字数 248
阅读 7
收藏 0

uses Direct2D, D2D1;

{建立位图画刷的函数}
function GetBitmapBrush(Canvas: TDirect2DCanvas; filePath: string): ID2D1BitmapBrush;
var
  rBBP: TD2D1BitmapBrushProperties;
  bit: TBitmap;
begin
  bit := TBitmap.Create;
  bit.LoadFromFile(filePath);
  rBBP.extendModeX := D2D1_EXTEND_MODE_WRAP;
  rBBP.extendModeY := D2D1_EXTEND_MODE_WRAP;
  rBBP.interpolationMode := D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR;
  Canvas.RenderTarget.CreateBitmapBrush(Canvas.CreateBitmap(bit), @rBBP, nil, Result);
  bit.Free;
end;

{建立线性渐变画刷的函数}
function GetLinearGradientBrush(RenderTarget: ID2D1RenderTarget; Colors: array of TColor): ID2D1LinearGradientBrush;
var
  rLinear: TD2D1LinearGradientBrushProperties;
  rGradientStops: array of TD2D1GradientStop;
  iGradientStops: ID2D1GradientStopCollection;
  rSizeF: TD2DSizeF;
  count,i: Integer;
begin
  RenderTarget.GetSize(rSizeF);
  rLinear.startPoint := D2D1PointF(0, rSizeF.height/2);
  rLinear.endPoint := D2D1PointF(rSizeF.width, rSizeF.height/2);
  count := Length(Colors);
  SetLength(rGradientStops, count);
  for i := 0 to count - 1 do
  begin
    rGradientStops[i].position := i * (1 / (count-1));
    rGradientStops[i].color := D2D1ColorF(Colors[i]);
  end;
  RenderTarget.CreateGradientStopCollection(
    @rGradientStops[0], count, D2D1_GAMMA_2_2, D2D1_EXTEND_MODE_CLAMP, iGradientStops
  );
  RenderTarget.CreateLinearGradientBrush(rLinear, nil, iGradientStops, Result);
end;

procedure TForm1.FormPaint(Sender: TObject);
var
  cvs: TDirect2DCanvas;
  str: string;
  iTextFormat: IDWriteTextFormat;
  iBrush: ID2D1Brush;
begin
  str := 'Hello World using DirectWrite!';
  DWriteFactory.CreateTextFormat(
    'Gabriola',
    nil,
    DWRITE_FONT_WEIGHT_ULTRA_BLACK,
    DWRITE_FONT_STYLE_NORMAL,
    DWRITE_FONT_STRETCH_NORMAL,
    72.0,
    'en-us',
    iTextFormat
  );
  iTextFormat.SetTextAlignment(DWRITE_TEXT_ALIGNMENT_CENTER);
  iTextFormat.SetParagraphAlignment(DWRITE_PARAGRAPH_ALIGNMENT_CENTER);

  cvs := TDirect2DCanvas.Create(Canvas, ClientRect);
  cvs.RenderTarget.BeginDraw;
  cvs.RenderTarget.Clear(D2D1ColorF(clWhite));

  if Tag = 0 then
    iBrush := GetLinearGradientBrush(cvs.RenderTarget, [clRed, clYellow])
  else
    iBrush := GetBitmapBrush(cvs, 'C:\Temp\Test.bmp'); //!

  cvs.RenderTarget.DrawText(PWideChar(str), Length(str), iTextFormat, ClientRect, iBrush);
  cvs.RenderTarget.EndDraw();
  cvs.Free;
end;

{鼠标单击转换画刷}
procedure TForm1.FormClick(Sender: TObject);
begin
  Tag := not Tag;
  Repaint;
end;

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


效果图:



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

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

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

吞吞吐吐的
2017/10/17
0
0
Direct2D教程(十二)图层

什么是Layers? Layer,中文译成图层,在Direct2D中可以用来完成一些特殊效果,使用Layer的时候,先将Layer Push到render target,然后进行绘制,此时是直接绘制在Layer上的,绘制完毕后,将...

吞吞吐吐的
2017/10/26
0
0
WPF 使用 Direct2D1 画图 绘制基本图形

本文来告诉大家如何在 Direct2D1 绘制基本图形,包括线段、矩形、椭圆 本文是一个系列 WPF 使用 Direct2D1 画图入门 WPF 使用 Direct2D1 画图 绘制基本图形 本文的组织参考Direct2D,对大神表...

lindexi_gd
04/19
0
0
Direct2D教程(十一)几何变换

什么是几何变换(Transform) 在图形学中,主要有三种几何变换,分别是平移(Translate),旋转(Rotation)和缩放(Scaling)。在D2D中,这三种变换都有实现,而且还有一种不太常见的变换,...

吞吞吐吐的
2017/09/12
0
0
Direct2D教程(八)梯度色画刷

概述 单色画刷产生的颜色是单一的,比如一个红色画刷只能输出红色,而渐变画刷则不同,它可以输出多种颜色,这些颜色通常是连续的,从一个颜色平滑过渡到另一个颜色,看起来有渐变的效果。渐...

吞吞吐吐的
2017/08/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java提高班(六)反射和动态代理(JDK Proxy和Cglib)

反射和动态代理放有一定的相关性,但单纯的说动态代理是由反射机制实现的,其实是不够全面不准确的,动态代理是一种功能行为,而它的实现方法有很多。要怎么理解以上这句话,请看下文。 一、...

王磊的博客
20分钟前
1
0
Ext grid 渲染

// 单元格字体颜色渲染function renderer_Meta_useStatus(value, cellmeta, record,rowIndex, columnIndex, store){ var color = ""; if("空闲"==value){ color = "green";......

MoksMo
29分钟前
4
0
log4j2在spring中的配置

<?xml version="1.0" encoding="UTF-8"?><!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --><!--Configuration后面的status,这个用于设置l......

TonyTaotao
35分钟前
3
0
java 中间变量缓存机制(i++,++i)

public class Test { public static void main(String[] args) { int i = 0; i = i ++ ; System.out.println(i); } } 答案是 0 如果是 i = ++......

shzwork
42分钟前
5
0
初识多线程及其原理-笔记

什么情况下应该使用多线程? 通过并行计算提高程序执行性能 需要等待网络、I/O响应导致耗费大量的执行时间, 可以采用异步线程的方式来减少阻塞 tomcat7 以前的io模型 客户端阻塞 线程级别阻...

Java搬砖工程师
54分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部