2016-1-11 22:08:18 后面补充了一些对控件的修改
百度文库有一篇非常适合学习的文档:c#自定义控件开发
wince里用不了groupbox控件。所以只能自己写。
思路就是简单的组合控件:panel和label 后来发现直接用一个label就得了
第一步:vs2008中进行控件库编程
//构造函数 public MyGroupBox() { InitializeComponent(); BorderColor = Color.Black; } private string TextStr; private bool bBorder; private Color BorderColor; //设置或获取前景色 public Color ClockForeColor { get { return this.ForeColor; } set { this.ForeColor = value; this.label1.ForeColor = value; } } //获取或设置text public string ClockText { get { return this.TextStr; } set { this.TextStr = value; this.label1.Text = value; Graphics g = this.CreateGraphics(); StringFormat sf = new StringFormat(); sf.FormatFlags = StringFormatFlags.NoWrap; SizeF sizeF = g.MeasureString(value, this.Font); this.label1.Width = (int)sizeF.Width; } } //border public bool ClockBorder { get { return this.bBorder; } set { this.bBorder = value; } } //主要是为了画边框 要考虑label的高度 protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); if (bBorder) { Graphics dc = e.Graphics; int yStart = this.label1.Height / 2; Pen p = new Pen(this.BorderColor); dc.DrawRectangle(p, new Rectangle(0, yStart, this.Width-1, this.Height - yStart-1)); } }shift+F6生成控件的dll
第二步:测试控件
ClockBorder设为true后保存一下就会出现边框
ClockForeColor是设置label上的颜色的
ClockText是设置label的文字的 label的宽度根据文字字符的宽度自动改变
至于groupbox里的控件不随groupbox移动:在design.cs 中this.controls.add(this.label1);改为this.myGroupBox1.Controls.Add(this.label1);
修改:
1.关于Textstr变量。可以不要
ClockText函数修改如下,(主要是解决控件在使用时更改Text有时候中文在布局显示总是少一个字,关闭design.cs再打开才正常)
//获取或设置text public string ClockText { get { return this.label1.Text; } set { Graphics g = this.CreateGraphics(); StringFormat sf = new StringFormat(); sf.FormatFlags = StringFormatFlags.NoWrap; SizeF sizeF = g.MeasureString(value, this.label1.Font); this.label1.Width = 2 + (int)sizeF.Width; this.label1.Text = value;//就是将位置放到最后就行了 } }
2.bBorder 是否显示边框。在构造函数中应该初始化为true。
3.groupbox的label字体。这个省不得,必须加上
//设置字体大小和粗细 public Font ClockFont { get { return this.label1.Font; } set { this.label1.Font = value; } }4.关于名称。如ClockText ClockForeColor,过于冗长,前面加Clock前缀是为了和本身存在的区分开。其实最好的解决办法是通过override来重写。大家可以自行测试。