在单元格绘制按钮

本节内容可以参考CaseStudy目录下的文件:绘制单元格按钮.Table

本节的任务是在表的左侧显示一列,该列的每个单元格显示一个删除按钮,双击此按钮即可删除对应的行。

设计步骤:

1、将设计好的图标文件delete1.ico和delete2.ico复制到项目文件所在目录的Images子目录下。

delete1.ico 默认图标
delete2.ico 鼠标经过时的图标

2、在全局代码中加入以下代码:

Public delimg1 As Image = GetImage("delete1.ico")
Public
delimg2 As Image = GetImage("delete2.ico")

上述代码获得两个图标的图片,并赋值给 两个全局变量delimg1和delimg2。

3、在项目事件AfterOpenProject加入代码:

If DataTables("表A").DataCols.Contains("删") = False Then
    DataTables("表A").DataCols.Add("删",Gettype(String),1)
    Tables("表A").Cols("删").Width = 24
    Tables("表A").Cols("删").Move(0)

End
If

上述代码在表A中增加一列,名称"删",宽度设置为24,并将其移至第一列的位置。

4、将表的PrepareEdit事件加入以下代码

If e.Col.Name = "删" Then
   e.Cancel =
True

End
If

5、将表的DrawCell事件加入以下代码:

If e.Col.name= "删" Then
    e.StartDraw
    If e.MouseHover = False '如果鼠标不在此单元格
        e.Graphics.DrawImage(delimg1, e.x + 3,e.y + 3) '绘制第一个图标
    Else '如果鼠标在此单元格
        e.Graphics.DrawImage(delimg2, e.x + 2,e.y + 2) '绘制第二个图标
    End If
    e.
EndDraw

End
If

6、在表的DoubleClick事件加入以下代码:

If e.Col.name = "删" Then
    e.
Row.Delete()
End
If

提示:这个例子绘制的按钮有两个状态,分别是正常和鼠标经过时,如果你要绘制有三个状态的按钮,也就是正常、鼠标经过时和鼠标按下时,可以用系统变量MouseButton来判断鼠标是否按下。

效率探讨

我们也可以删除全局代码,直接将DrawCell事件改为:

If e.Col.name= "删" Then
    e.StartDraw
    If e.MouseHover = False '如果鼠标不在此单元格
        e.Graphics.DrawImage(GetImage("delete1.ico"), e.x + 3,e.y + 3) '绘制第一个图标
    Else '如果鼠标在此单元格
        e.Graphics.DrawImage(GetImage("delete2.ico"), e.x + 2,e.y + 2) '绘制第二个图标
    End If
    e.
EndDraw

End
If

但是这样每次绘制单元格的时候,都要读取图标文件来生成图片,效率会低一些。

所以实际应用的时候,我们在全局代码中读取图标文件生成图片,并赋值给全局变量

Public delimg1 As Image = GetImage("delete1.ico")
Public
delimg2 As Image = GetImage("delete2.ico")

这样每次绘制单元格的时候,可以直接使用全局变量来绘制图片,无需反复读取图标文件,所以效率会高一些:

If e.Col.name= "删" Then
    e.StartDraw
    If e.MouseHover = False '如果鼠标不在此单元格
        e.Graphics.DrawImage(delimg1, e.x + 3,e.y + 3) '绘制第一个图标
    Else '如果鼠标在此单元格
        e.Graphics.DrawImage(delimg2, e.x + 2,e.y + 2) '绘制第二个图标
    End If
    e.
EndDraw

End
If


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