最近的项目开发中,同事开发界面时遇到了这样的问题。在一个容器内要同时显示50+的按钮。使用vs控件开发的效果是按钮刷新较慢,肉眼观察有明显的延迟。一开始,想通过在容器内控制控件的重绘来加快刷新速度,未能实现。分析主要原因是,按钮重绘的延迟是因为系统逐个调用了每个按钮的重绘,而这一过程可能涉及到了按钮的其他一些操作,导致整体重绘速度降低。由于知识所限,目前在控件内无法提高刷新速度。经询问,决定使用自定义控件。思路是:在面板上自绘多按钮,并实现其点击响应。绘图部分应用System.Drawing.Graphics的支持,通过自定义事件的引发和响应实现对单个按钮的点击响应。
部分代码如下:
{
public partial class UserControl1 : UserControl //自定义控件类
{
#region Members
private int rowNo = 4; //Button的行数
private int colNo = 4;//Button的列数
private int bHeight = 30;//按钮的高
private int bWidth = 20;//按钮的宽
private int bBorder = 1;//按钮的边界宽度
private Size iSize =new Size(120,80);//控件大小
private String[][] title = null;//每个按钮的文本内容
private MyButton[][] _buttons = null;//自定义MyButton类的数组,用于引发事件
//记录鼠标按下的位置。行列,XY
private int lastR = 4;
private int lastC = 4;
private int lastX = 0;
private int lastY = 0;
//自定义事件成员
public event MyButtonEventHandle MyButtonEventHandle;
#endregion
#region Properties
[Description("The no. of rows"),Browsable(true),DisplayName("Row No."),Category("Settings of Button")]
public int RowNo
{
get { return rowNo; }
set {
if (value > 1)rowNo = value;
ButtonHeight = (this.Height-2) / rowNo;
}
}
[Description("The no. of columns"), Browsable(true), DisplayName("Col. No."), Category("Settings of Button")]
public int ColNo
{
get { return colNo; }
set {
if (value > 1)colNo = value;
ButtonWidth = (this.Width-2) / colNo;
}
}
[Description("height of button"), Browsable(true), DisplayName("ButtomHeight"), Category("Settings of Button")]
public int ButtonHeight
{
get { return bHeight; }
set {
if (value > 1)bHeight = value;
if (ButtonHeight * RowNo+2 != Size.Height)
{
this.Height = ButtonHeight * RowNo+2;
this.Size = new Size(this.Size.Width, ButtonHeight * RowNo+2);
}
}
}
[Description("Width of button"), Browsable(true), DisplayName("ButtomWidth"), Category("Settings of Button")]
public int ButtonWidth
{
get { return bWidth; }
set {
if (value > 1)bWidth = value;
if (ButtonWidth * ColNo+2 !