文档章节

Direct2D (42) : 在文本布局中嵌入图片 IDWriteTextLayout.SetInlineObject()

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

这段代码怎么也过不去了,反反复复找不到原因;有谁知道,万望提醒我一下。

上面是刚碰到错误时的求助信息;现在终于找到错误了:是 D2D1.pas 的代码有问题,修改方法如下:

{ 1、把 D2D1.pas 中 4142 行中的 var 修改为 const 或者去掉 }
function SetInlineObject(var inlineObject: IDWriteInlineObject;
  textRange: TDwriteTextRange): HResult; stdcall;

{ 2、重新编译 Direct2D.pas、D2D1.pas,最好在 Debug 和 Release 两种模式下分别编译 }

{ 3、把编译后的相关 dcu 分别覆盖到 \Program Files\Embarcadero\RAD Studio\8.0\lib\win32\ 的相应目录下 }


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Direct2D, D2D1, Wincodec, ActiveX;

type
  TForm1 = class(TForm)
    procedure FormPaint(Sender: TObject);
    procedure FormResize(Sender: TObject);
  end;

  {实现 IDWriteInlineObject 的类}
  TDWriteInlineObject = class(TInterfacedObject, IDWriteInlineObject)
  private
    FRenderTarge: ID2D1RenderTarget;
    FBitmap: ID2D1Bitmap;
  public
    constructor Create(ARenderTarge: ID2D1RenderTarget; ABitmap: ID2D1Bitmap);
    function Draw(clientDrawingContext: Pointer; var renderer: IDWriteTextRenderer; originX: Single;
      originY: Single; isSideways: LongBool; isRightToLeft: LongBool;
      const clientDrawingEffect: IInterface): HRESULT; stdcall;
    function GetMetrics(var metrics: DWRITE_INLINE_OBJECT_METRICS): HRESULT; stdcall;
    function GetOverhangMetrics(var overhangs: DWRITE_OVERHANG_METRICS): HRESULT; stdcall;
    function GetBreakConditions(var breakConditionBefore: DWRITE_BREAK_CONDITION;
      var breakConditionAfter: DWRITE_BREAK_CONDITION): HRESULT; stdcall;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{从指定文件建立 ID2D1Bitmap 的函数}
function GetD2D1Bitmap(RenderTarget: ID2D1RenderTarget; imgPath: string): ID2D1Bitmap;
var
  iWicFactory: IWICImagingFactory;
  iWICDecoder: IWICBitmapDecoder;
  iWICFrameDecode: IWICBitmapFrameDecode;
  iFormatConverter: IWICFormatConverter;
begin
  CoCreateInstance(CLSID_WICImagingFactory, nil, CLSCTX_INPROC_SERVER, IID_IWICImagingFactory, iWicFactory);
  iWicFactory.CreateDecoderFromFilename(PWideChar(imgPath), GUID_NULL, GENERIC_READ, WICDecodeMetadataCacheOnLoad, iWICDecoder);
  iWicDecoder.GetFrame(0, iWICFrameDecode);
  iWicFactory.CreateFormatConverter(iFormatConverter);
  iFormatConverter.Initialize(iWICFrameDecode, GUID_WICPixelFormat32bppPBGRA, WICBitmapDitherTypeNone, nil, 0, WICBitmapPaletteTypeMedianCut);
  RenderTarget.CreateBitmapFromWicBitmap(iFormatConverter, nil, Result);
end;

{构建 DWRITE_TEXT_RANGE 结构的函数}
function DWriteTextRange(pos,len: Cardinal): TDwriteTextRange;
begin
  Result.startPosition := pos;
  Result.length := len;
end;

procedure TForm1.FormPaint(Sender: TObject);
var
  cvs: TDirect2DCanvas;
  str: string;
  iTextFormat: IDWriteTextFormat;
  iTextLayout: IDWriteTextLayout;
  iInlineObject: IDWriteInlineObject;
  iBitmap: ID2D1Bitmap;
  iBrush: ID2D1SolidColorBrush;
begin
  str := 'Inline Object * Example';

  DWriteFactory.CreateTextFormat(
    'Gabriola',
    nil,
    DWRITE_FONT_WEIGHT_REGULAR,
    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);

  DWriteFactory.CreateTextLayout(
    PWideChar(str),
    Length(str),
    iTextFormat,
    ClientWidth,
    ClientHeight,
    iTextLayout
  );

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

  iBitmap := GetD2D1Bitmap(cvs.RenderTarget, 'C:\Temp\Test.jpg');
  iInlineObject := TDWriteInlineObject.Create(cvs.RenderTarget, iBitmap);
//  DWriteFactory.CreateEllipsisTrimmingSign(iTextLayout, iInlineObject); //使用这行代码可以生成表示 "..." 符号的 IDWriteInlineObject
  iTextLayout.SetInlineObject(iInlineObject, DWriteTextRange(14, 1)); {!!!}

  cvs.RenderTarget.CreateSolidColorBrush(D2D1ColorF(clBlack), nil, iBrush);
  cvs.RenderTarget.DrawTextLayout(D2D1PointF(0,0), iTextLayout, iBrush);
  cvs.RenderTarget.EndDraw();
  cvs.Free;
end;

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

{ TDWriteInlineObject }

constructor TDWriteInlineObject.Create(ARenderTarge: ID2D1RenderTarget; ABitmap: ID2D1Bitmap);
begin
  inherited Create;
  FRenderTarge := ARenderTarge;
  FBitmap := ABitmap;
end;

function TDWriteInlineObject.Draw(clientDrawingContext: Pointer; var renderer: IDWriteTextRenderer; originX,
  originY: Single; isSideways, isRightToLeft: LongBool; const clientDrawingEffect: IInterface): HRESULT;
var
  rSizeF: TD2DSizeF;
  rRectF: TD2DRectF;
begin
  FBitmap.GetSize(rSizeF);
  rRectF := D2D1RectF(originX, originY, originX+rSizeF.width, originY+rSizeF.height);
  FRenderTarge.DrawBitmap(FBitmap, @rRectF);
  Result := S_OK;
end;

function TDWriteInlineObject.GetBreakConditions(var breakConditionBefore,
  breakConditionAfter: DWRITE_BREAK_CONDITION): HRESULT;
begin
  breakConditionBefore := DWRITE_BREAK_CONDITION_NEUTRAL;
  breakConditionAfter := DWRITE_BREAK_CONDITION_NEUTRAL;
  Result := S_OK;
end;

function TDWriteInlineObject.GetMetrics(var metrics: DWRITE_INLINE_OBJECT_METRICS): HRESULT;
var
  rSizeF: TD2DSizeF;
begin
  FBitmap.GetSize(rSizeF);
  metrics.width := rSizeF.width;
  metrics.height := rSizeF.height;
  metrics.baseline := rSizeF.height;
  Result := S_OK;
end;

function TDWriteInlineObject.GetOverhangMetrics(var overhangs: DWRITE_OVERHANG_METRICS): HRESULT;
begin
  overhangs.left := 0;
  overhangs.top := 0;
  overhangs.right := 0;
  overhangs.bottom := 0;
  Result := S_OK;
end;

end.


效果图:



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

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

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

吞吞吐吐的
2017/10/17
0
0
Windows桌面应用程序(1-2-4-7th) DPI和设备无关的像素

要使用Windows图形进行有效编程,您必须了解两个相关的概念: 每英寸点数(DPI) 设备无关像素(DIP)。 我们从DPI开始。这将需要短暂的绕行排版。在印刷术中,类型的大小以称为点的单位来测量。一点...

qq_37422196
01/12
0
0
关于Direct3D11里汉字显示的一些思考

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

长平狐
2012/11/12
690
0
深度解读 - Windows 7核心图形架构细致分析(转贴)

原帖地址:http://technet.microsoft.com/zh-cn/library/ee921514.aspx 如现在大家所想的那样, Windows7 其实是 Windows Vista 的改进版。 Windows 7 在 Windows Vista 的基础上进行了大量的...

迈克老狼1
2012/12/23
0
0
如何在 PDF Transformer+中进行FB2和EPUB转换设置

作为可创建、编辑及将PDF文件转换为其他可编辑格式的通用工具,ABBYY PDF Transformer+为受支持的输出格式提供多种转换设置,选定的转换设置影响生成文档的外观,本文具体为大家讲解ABBYY P...

ABBYY
2016/01/22
65
0

没有更多内容

加载失败,请刷新页面

加载更多

c++ 开源算法库 (持续更新)

最近在做算法方面的研究,发现很难找到一个全面而优质的科学计算算法库。不过还是找到一些,在此记录一下,将来也许自己写一个把所有这些整合在一起。本列表会持续不定期更新。 GSL http://w...

propagator
19分钟前
4
0
Mysql Binlog三种格式介绍及分析

一.Mysql Binlog格式介绍 Mysql binlog日志有三种格式,分别为Statement,MiXED,以及ROW! 1.Statement:每一条会修改数据的sql都会记录在binlog中。 优点:不需要记录每一行的变化,减少了b...

rechardchensir
20分钟前
1
0
apache顶级项目(五) - J~L

apache顶级项目(五) - J~L https://www.apache.org/ Jackrabbit The Apache Jackrabbit™ content repository is a fully conforming implementation of the Content Repository for Java......

晨猫
25分钟前
1
0
压力测试工具记录

Siege Siege官网: https://www.joedog.org/siege-home/ Siege是一个Linux系统下多线程http负载测试和基准测试工具。 使用理由:可跟踪详细请求信息,信息比较全。 安装 wget http://downlo...

兜兜毛毛
30分钟前
1
0
Zookeeper分析

沉稳2018
40分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部