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来重写。大家可以自行测试。