C#自訂控制項3中方式

來源:互聯網
上載者:User

很多時候我們需要使用到自訂控制項 而在C#中 我們主要以3中方式建立自訂控制項,還有些需要注意的地方時常被忽略 比如Click事件,使用者控制項的Click並不像系統的Button單擊1.繼承自.NET類庫中已有的控制項 如TextBox MenuStrip Pannel2.繼承自Control類3.繼承自UserControl類 下面是3個小樣本1.繼承自類庫中現有的控制項下面自訂一個ExtendTextBox 該控制項擴充了一個屬性,可以現在文字框只能輸入數字,字母或者所有字元 1 public class ExtendTextBox
: System.Windows.Forms.TextBox 2 { 3 private AllowType _allowType = AllowType.All; 4 public AllowType AllowType 5 { 6 get { return _allowType; } 7 set { _allowType = value; } 8 } 9 10 protected override void OnKeyPress(System.Windows.Forms.KeyPressEventArgs
e)11 {12 //設定此屬性為true 基方法將不再處理此KeyPress事件13 e.Handled = true;14 15 if (_allowType == AllowType.Number)16 {17 //如果輸入是0-9 交由基方法處理 允許輸入18 if (e.KeyChar >= '0' && e.KeyChar <= '9')19 e.Handled = false;20 }21 else if (_allowType == AllowType.Letter)22 {23 //如果輸入是A-Z或a-z
交由基方法處理 允許輸入24 if (e.KeyChar >= 'A' && e.KeyChar <= 'z')25 e.Handled = false;26 }27 else if (_allowType == AllowType.All)28 {29 e.Handled = false;30 }31 base.OnKeyPress(e);32 }33 }34 public enum AllowType35 {36 Number,37 Letter,38 All39 } 2.繼承自UserControl類
此方法主要用於編寫群組控制項 UserControl容器可以提供其組成控制項的所有功能。可以編寫代碼指定新的使用者控制項可公開其子控制項的哪些屬性UserControl支援直接將背景色設定為透明 而Control則不支援 public class UserControl1 : Usercontrol{} 3.繼承自Control類 Control類提供基本控制項功能,但不提供圖形介面或任何特定功能 ,必須編寫代碼指定控制項的屬性 方法 事件,還必須重寫OnPaint和OnPaintBackground方法以建立介面,通常需要使用到GDI+Control
類實現向使用者顯示資訊的類所需的最準系統。它處理使用者通過鍵盤和指標裝置所進行的輸入。它還處理訊息路由和安全。雖然它並不實現繪製,但是它定義控制項的邊界(其位置和大小)。它提供視窗控制代碼 (hWnd)。 下面是一個橢圓按鈕簡單的例子 但是有幾個地方是要引起注意的,關於自訂控制項裡由基類繼承而來的Click事件,包括UserControl和Control Click事件是按一下滑鼠事件 滑鼠左鍵單擊和按右鍵都將觸發這個事件 如果沒有定義雙擊事件 則雙擊控制項將兩次觸發Click事件。這裡的Click和.Net類庫中的Button的Click事件是區別的
傳統的Button按鈕,滑鼠左鍵單擊才會響應 聚焦後按Enter鍵也會響應。而自訂控制項裡的Click事件不會響應鍵盤的Enter 並且滑鼠左鍵或者右鍵的單擊都會觸發它 。所以要對其進行一些處理,例子中自訂了一個橢圓按鈕 並且它不會對按右鍵產生反應1 public class EllipesButton : System.Windows.Forms.Control欄位和重寫OnPaint和OnPaintBackground 1 private bool _mouseEntered; 2 protected
override void OnPaint(PaintEventArgs e) 3 { 4 //將文本繪製到正中央 5 SizeF stringSize = e.Graphics.MeasureString(Text, Font); 6 float startx = (Width - stringSize.Width) / 2; 7 float starty = (Height - stringSize.Height) / 2; 8 e.Graphics.DrawString(Text, Font, new
SolidBrush(ForeColor), startx, starty); 9 base.OnPaint(e);10 }11 protected override void OnPaintBackground(PaintEventArgs pevent)12 {13 //繪製過程為 控制項整體背景色->控制項有效區背景色->控制項狀態表示地區->控制項外框14 15 //**********16 //控制項整體背景色17 //**********18 if (this.Parent != null)19 pevent.Graphics.FillRectangle(new
SolidBrush(Parent.BackColor), 0, 0, this.Width, this.Height);20 //使用高品質平滑模式消除橢圓邊緣鋸齒21 pevent.Graphics.SmoothingMode = SmoothingMode.HighQuality;22 23 //***********24 //控制項有效區背景色25 //************** Control.MouseButtons靜態成員26 if (_mouseEntered && (MouseButtons
& MouseButtons.Left) == MouseButtons.Left)27 {28 Color mouseDownColor = Color.FromArgb(128, BackColor);29 pevent.Graphics.FillEllipse(new SolidBrush(mouseDownColor), 0, 0, Width - 1, Height - 1);30 }31 else32 pevent.Graphics.FillEllipse(new SolidBrush(BackColor),
0, 0, Width - 1, Height - 1);33 34 //***********35 //控制項狀態表示地區36 //************37 //左鍵未按下時繪製狀態表示地區38 if ((MouseButtons & MouseButtons.Left) != MouseButtons.Left)39 {40 //滑鼠進入 繪製橙色邊框41 if (_mouseEntered)42 {43 Pen mouseEnterPen = new Pen(Color.Orange, 2);44
pevent.Graphics.DrawEllipse(mouseEnterPen, 1, 1, Width - 3, Height - 3);45 mouseEnterPen.Dispose();46 }47 //控制項獲得焦點 但滑鼠未進入 繪製藍色邊框48 else if (Focused)49 {50 Pen focusedPen = new Pen(Color.PowderBlue, 2);51 pevent.Graphics.DrawEllipse(focusedPen, 1, 1, Width
- 3, Height - 3);52 focusedPen.Dispose();53 }54 }55 //如果有焦點,繪製焦點框56 if (Focused)57 {58 Pen focusedDotPen = new Pen(Color.Black);59 focusedDotPen.DashStyle = DashStyle.Dot;60 pevent.Graphics.DrawEllipse(focusedDotPen, 3, 3, Width - 7, Height - 7);61 focusedDotPen.Dispose();62
}63 64 //*********65 //控制項外框66 //**********67 pevent.Graphics.DrawEllipse(Pens.Black, 0, 0, Width - 1, Height - 1);68 69 //base.OnPaintBackground(pevent);70 } 非關鍵代碼 1 protected override void OnMouseEnter(EventArgs e) 2 { 3 _mouseEntered = true; 4 this.Refresh();
5 base.OnMouseEnter(e); 6 } 7 protected override void OnMouseLeave(EventArgs e) 8 { 9 _mouseEntered = false;10 this.Refresh();11 base.OnMouseLeave(e);12 }13 protected override void OnGotFocus(EventArgs e)14 {15 this.Refresh();16 base.OnGotFocus(e);17 }18 protected
override void OnLostFocus(EventArgs e)19 {20 this.Refresh();21 base.OnLostFocus(e);22 } 需要注意的地方 1 //這裡需要判斷是左鍵還是右鍵按下 2 protected override void OnMouseDown(MouseEventArgs e) 3 { 4 if (e.Button == MouseButtons.Left) 5 { 6 this.Focus(); 7 this.Refresh(); 8 } 9
base.OnMouseDown(e);10 }11 protected override void OnMouseUp(MouseEventArgs e)12 {13 if (e.Button == MouseButtons.Left)14 this.Refresh();15 base.OnMouseUp(e);16 }17 //這裡將訊息對象強制轉換為滑鼠訊息 判斷是哪個鍵單擊 只有當左鍵單擊的時候才18 //執行,Click事件的委託是由OnClick來調用的 所以通過判斷訊息決定是否觸發Click19
protected override void OnClick(EventArgs e)20 {21 MouseEventArgs m = (MouseEventArgs)e;22 if (m.Button == MouseButtons.Left)23 base.OnClick(e);24 }

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.