winCE 自定义控件开发之groupBox

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

第二步:测试控件

winCE 自定义控件开发之groupBox_第1张图片

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


你可能感兴趣的:(C#,自定义控件,WinCE,groupbox)