在单元格绘制按钮
本节内容可以参考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提示:这个例子绘制的按钮有两个状态,分别是正常和鼠标经过时,如果你要绘制有三个状态的按钮,也就是正常、鼠标经过时和鼠标按下时,可以用系统变量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