首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WinForm 控件開發總結(一):開篇——控件類型分類與首個自定義控件實作

     編輯:關於.NET

系列緣起

作者非專業控件開發者,但在實務中需自行開發控件,苦於資料稀少,僅能研讀 MSDN。現將經驗整理成系列,冀助同好。

三大控件類型對比

類型定義特點
複合控件 組合現有控件形成新控件 整合既有功能,開發門檻較低
擴展控件 繼承現有控件並增強/修改功能 復用基礎邏輯,擴充特定行為
自定義控件 直接繼承 System.Windows.Forms.Control 最靈活強大,需自行實作 OnPaint、可重寫 WndProc 處理 Windows 訊息,要求 GDI+ 與 Win32 API 基礎

本系列專注於自定義控件開發。

可視化控件六大核心特徵

  1. 可視化呈現
  2. 支援鍵盤/滑鼠互動
  3. 暴露屬性與方法供開發者使用
  4. 暴露事件供開發者訂閱
  5. 屬性可持久化(設計器序列化)
  6. 可發布、可重用(DLL 部署)

實作第一個控件:FirstControl

建立 Class Library 專案 CustomControlSample,新增 FirstControl.cs:

using System;
using System.Windows.Forms;
using System.ComponentModel;
using System.Drawing;

namespace CustomControlSample {
    public class FirstControl : Control {
        public FirstControl() { }

        private ContentAlignment alignmentValue = ContentAlignment.MiddleLeft;

        [Category("Alignment"), Description("Specifies the alignment of text.")]
        public ContentAlignment TextAlignment {
            get { return alignmentValue; }
            set {
                alignmentValue = value;
                Invalidate(); // 觸發重繪
            }
        }

        protected override void OnPaint(PaintEventArgs e) {
            base.OnPaint(e);
            StringFormat style = new StringFormat();
            switch (alignmentValue) {
                case ContentAlignment.MiddleLeft:   style.Alignment = StringAlignment.Near;   break;
                case ContentAlignment.MiddleRight:  style.Alignment = StringAlignment.Far;    break;
                case ContentAlignment.MiddleCenter: style.Alignment = StringAlignment.Center; break;
            }
            e.Graphics.DrawString(Text, Font, new SolidBrush(ForeColor), ClientRectangle, style);
        }
    }
}

核心要點:

  • 繼承 Control,複寫 OnPaint 進行 GDI+ 繪圖
  • 屬性變更呼叫 Invalidate() 觸發重繪
  • 使用 StringFormat 控制文字對齊

下一步

下一篇將介紹如何使用與偵錯這個剛寫好的控件。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved