1. 程式人生 > >winCE 自定義控制元件開發之groupBox

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

第二步:測試控制元件

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來重寫。大家可以自行測試。