在单元格中直接绘图

在介绍表事件DrawCell的时候,我们了解了通过更改文本和样式,让单元格的显示变得丰富多彩。
其实这只是DrawCell事件的最基础用法,在此之外,该事件还提供了通过GDI+绘图的功能。

DrawCell事件的完整e参数属性:

Table:      准备绘制的表
Row:        准备绘制的行
Col:        准备绘制的列
Style:     指定自定义样式的名称,如果用默认的样式绘制单元格,无须设置Style属性。
Text:      字符型,获得或者设置要绘制的文本内容
X:          要绘制单元格的水平坐标位置,单位为像素
Y:          要绘制单元格的垂直坐标位置,单位为像素
Width:     要绘制单元格的宽度,单位为像素
Height:    要绘制单元格的高度,单位为像素
Graphics:  返回一个Graphics对象,通过这个对象可以在单元格中绘制图形。
MouseHover: 逻辑型,如果鼠标停在此单元格,则返回True,否则返回False。
IsPrint:   逻辑型,是否是因为打印表而触发了DrawCell事件。

此外该事件的e参数还提供了两个方法:

StartDraw:开始绘图
EndDraw:  结束绘图

所有的绘图代码,必须在这两个方法之间。
有关绘图的基本知识,可以参考GDI+快速入门

示例

此示例可以参考CaseStudy目录下的文件“单元格绘图.Table”。

假定表中有两列,分别是项目和进度,希望能够直接在项目列的单元格中用条形图表示进度,DrawCell事件的代码为:

If e.Col.Name = "进度" AndAlso e.Row.IsNull("进度") = False Then
    e.StartDraw()

    Dim
Width As Integer = (e.Width - 2 )* e.Row("进度") \ 100
   
If e.Row("进度") = 100 Then
        e.Graphics.FillRectangle(Brushes.Green,e.x +
1,e.y + 1, Width, e.Height - 2)
    Else

        e.Graphics.FillRectangle(Brushes.Red,e.x +
1,e.y + 1, Width, e.Height - 2)
    End
If
    e.EndDraw()

End
If

绘制出的效果为:

提示:一些复杂的单元格绘图,可能需要修改行高,DrawCell事件并没有设置行高的参数,必须借助BeforeDrawRow事件。

有了DrawCell事件,我们可以在单元格绘制任意复杂的图片,例如下图是一个建筑用的钢筋计算表:


本页地址:http://www.foxtable.com/webhelp/topics/1493.htm