winCE 自定義控制元件開發之groupBox
阿新 • • 發佈:2019-02-14
2016-1-11 22:08:18 後面補充了一些對控制元件的修改
百度文庫有一篇非常適合學習的文件:c#自定義控制元件開發
wince裡用不了groupbox控制元件。所以只能自己寫。
思路就是簡單的組合控制元件:panel和label 後來發現直接用一個label就得了
第一步:vs2008中進行控制元件庫程式設計
shift+F6生成控制元件的dll//建構函式 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)); } }
第二步:測試控制元件
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來重寫。大家可以自行測試。