给ToolStrip工具栏扩展一个CheckBox单选框类型按钮的方法

心得体会,WinForm 2018-05-28 浏览:929

进行过winform开发的朋友,对toolStrip的工具栏肯定不陌生,但是,非常遗憾。toolStrip不自带CheckBox类型的菜单。
效果如下图:
1.jpg

本篇文章将指导如何完成这个扩展工具栏项目类的写法。直接上代码,如下:
首先,定义一个类名,叫ToolStripCheckBox,继承基类ToolStripItem

public partial class ToolStripCheckBox : ToolStripItem

然后,在类上面加上特写类写法,如下:

[ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.ToolStrip)]

添加后,就能正常的在设计时界面中,看到自己新增的特殊扩展类的按钮了。

接着,有三件事要做,首先,我们需要绘制一个单选框按钮,那么,需要重写绘制事件,具体代码如下:

protected override void OnPaint(PaintEventArgs e)
{
 if (base.Owner != null)
 {
   Point pLocation = new Point(e.ClipRectangle.X,e.ClipRectangle.Height / 2 - (13 / 2));
   Size txtSize = TextRenderer.MeasureText(this.Text, this.Font);
   Rectangle rectText = new Rectangle(pLocation.X + 13, pLocation.Y, txtSize.Width, txtSize.Height);
   CheckBoxState chkState = IsChecked ? CheckBoxState.CheckedNormal : CheckBoxState.UncheckedNormal;
   CheckBoxRenderer.DrawCheckBox(e.Graphics, pLocation, rectText, this.Text, this.Font, false, chkState);
  }
}

还要重写宽度与高度,以便适应大小,否则重绘后会出现文字超出边缘的情况,具体代码如下:

public override Size GetPreferredSize(Size constrainingSize)
{
 base.GetPreferredSize(constrainingSize);
 Size preferredSize = base.GetPreferredSize(constrainingSize);
 preferredSize.Width += 13; 
 return preferredSize;
}

那么,为了达到能够点击切换选中的效果,那么,必须要重写单击事件,并且定义一个选中属性,具体代码如下:

private bool IsChecked = false;
public bool HasChecked
{
  get
  {
    return IsChecked;
  }
  set
  {
    IsChecked = value;
    this.Invalidate();
  }
}
protected override void OnClick(EventArgs e)
{
  IsChecked = !IsChecked;
  base.OnClick(e);
}

基本上根据以上方法,就在工具栏上能扩展出一个单选框按钮,当然了,这个只是一个尝试,实际应用控件的话,你要考虑的更多!

示例下载:
ToolStripCheckBoxItem.zip

评论功能已关闭!