第一个lambda过程
请先打开CaseStyudy目录下的文件"PDFCreator示例.Table"后再运行本节的示例代码。
在生成复杂文档时,使用lambda过程过程是必须的,否则代码会很冗长。
上一节我们以打印员工备注为例,介绍了测量文本的方法及应用,其代码就不够简洁。
想象一下,如果有数十个文本内容要绘制,难道要写数十段代码来测量和定位每个文本?
没必要,我们可以利用lambda过程优化, 将文本的测量、定位和绘制做成一个lambda过程,这样不管有多少文本要绘制,都只需依次调用该过程即可。
这是我写好的lambda过程:
Dim
DrawText =
Function
(tText
As
String,
tFont
As
Font, tRect
As
RectangleF, tUnderLine
As
Boolean,
tDistance
As
Integer)
tRect.Height = pdc.MeasureString(tText, tFont, tRect.Width).Height
'测量文本的高度,并设置为tRect的高度
If
tRect.Bottom > rcPage.Bottom
Then
'如果超过页面范围
pdc.NewPage()
'新增一页
tRect.Y = rcPage.Y
'重置tRect的起始位置
End
If
pdc.DrawString(tText, tFont, color.Black, tRect)
'绘制
文本内容
If
tUnderLine
Then
'绘制
要求有下划线
pdc.DrawLine(pens.Black, tRect.Left, tRect.Bottom, tRect.Right,
tRect.Bottom)
End
If
tRect.Offset(0, tRect.Height + tDistance)
'下移tRect到tDistance指定的位置,准备绘制下一个内容
Return
tRect
End
Function
参数 | 说明 |
tText | 文本内容 |
tFont | 文本字体 |
tRect | RectangleF类型,文本绘制区域 |
tUnderLine | 逻辑型,是否绘制下划线 |
tDistance | 用于指定本文本和下一个内容之间的垂直间距 |
这个lamda过程的关键在于tRect参数,绘制之前,将其高度设置为文本高度:
tRect.Height = pdc.MeasureString(tText, tFont, tRect.Width).Height '测量文本的高度,并设置为tRect的高度
绘制结束后,将其移动到下一个内容的绘制位置:
tRect.Offset(0, tRect.Height + tDistance)
等效于:
tRect.Y = tRect.Y + tRect.Height + tDistance
最后返回这个tRect给调用者,用于绘制下一个内容:
Return tRect
所以tRect除了用于指定绘制区域,还相当于一个位置游标。
示例
下面是完整的测试代码,可直接在命令窗口执行:
Dim
file
As
String
=
"c:\temp\test.pdf"
Dim
pdc
As
New
PDFCreator()
pdc.PaperKind = Drawing.Printing.PaperKind.B5
Dim
rcPage
As
RectangleF = pdc.PageRectangle()
'lambda过程要调用的外部变量,必须提前定义
rcPage.Inflate( - 72, - 72)
'设置页边距为72磅,也就是2.54厘米
'用于测量、定位和绘制文本的lambda过程
Dim
DrawText =
Function
(tText
As
String,
tFont
As
Font, tRect
As
RectangleF, tUnderLine
As
Boolean,
tDistance
As
Integer)
tRect.Height = pdc.MeasureString(tText, tFont, tRect.Width).Height
'计算内容的高度,并设置为tRect的高度
If
tRect.Bottom > rcPage.Bottom
Then
'如果超过页面范围
pdc.NewPage()
'新增一页
tRect.Y = rcPage.Y
'重置tRect的起始位置
End
If
pdc.DrawString(tText, tFont, color.Black, tRect)
'绘制
文本内容
If
tUnderLine
Then
'绘制
要求有下划线
pdc.DrawLine(pens.Black, tRect.Left, tRect.Bottom, tRect.Right,
tRect.Bottom)
End
If
tRect.Offset(0, tRect.Height + tDistance)
'下移tRect到tDistance指定的位置,准备绘制下一个内容
Return
tRect
End
Function
'以下为内容绘制代码,全部通过调用DrawText实现,代码变得整洁很多
Dim
rect
As
RectangleF = rcPage
'rect为绘制区域,我们将通过调整rect的位置和高度,来实现动态布局
Dim
fntTitle
As
New
Font("微软雅黑",
14, FontStyle.Bold)
'标题字体
Dim
fntName
As
New
Font("微软雅黑",
10, FontStyle.Bold)
'员工姓名字体
Dim
fntMemo
As
New
Font("宋体",
10)
'员工备注字体
rect = DrawText.Invoke("员工列表",
fntTitle, rect,
False,
30)
'绘制标题
For
Each
r
As
Row
In
Tables("员工").Rows
rect = DrawText.Invoke(r("姓名").ToString(),
fntTitle, rect,
True,
5)
'绘制员工姓名
rect = DrawText.Invoke(r("备注").ToString(),
fntMemo, rect,
False,
25)
'绘制员工备注
Next
pdc.Save(file)
Process.Start(file)
生成的文档为: