LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

【C#】WinForm自定义控件及窗体

admin
2025年3月29日 0:10 本文热度 29

【前言】                                                              
      WinForm(Windows Forms)是Microsoft.NET框架中的技术,用于开发Windows桌面应用程序。它提供了一套丰富的控件和组件。
    通过拖放控件、编写事件处理程序等方式快速构建用户界面。通过属性窗口定制这些控件的外观和行为。
    通过数据绑定,将UI控件与数据源连接,实现数据的展示和更新。    通过上面的方法可以帮助开发者高效地创建桌面窗体应用程序,尤其适合初学者和需要快速开发的项目。

​本文介绍了如何创建Winform窗体,并自定义窗体样式,及窗体基本功能。

    1、窗体关闭、最大化、最小化、适应。
    2、无边框窗体移动、调整窗体大小。
    3、菜单展开折叠。
【界面预览】                                                        
【代码】                                                              
    自定义按钮                              
    用户自定义按钮:
        SelectedState:用户点击后状态取反。
        Radius:按钮圆角半径。
        HoverColor:鼠标悬停时的背景色。
public class UCButton : Button{    #region  公共字段、属性    private bool _selectedState = false;
    [Category("UserProperty")]    [Description("选中状态")]    public bool SelectedState    {        get => _selectedState;        private set        {            _selectedState = value;            this.Invalidate();        }    }

    private int radius = 15;
    [Category("UserProperty")]    [Description("圆角半径")]    public int Radius    {        get { return radius; }        set        {            radius = value;            this.Invalidate();        }    }    private Color _defaultColor;
    private Color _hoverColor = Color.LightBlue;
    [Category("UserProperty")]    [Description("鼠标悬停时的背景色")]    public Color HoverColor     {         get => _hoverColor;         set => _hoverColor = value;     }    #endregion    public UCButton()    {        Initialize();    }    private void Initialize()    {        this.DoubleBuffered = true;        this.FlatStyle = FlatStyle.Flat;        this.FlatAppearance.BorderSize = 0;        this.SetStyle(ControlStyles.UserPaint            | ControlStyles.AllPaintingInWmPaint            | ControlStyles.OptimizedDoubleBuffer            | ControlStyles.ResizeRedraw            | ControlStyles.SupportsTransparentBackColor, true);        _defaultColor = BackColor;
        this.MouseEnter += UCButton_MouseEnter;        this.MouseLeave += UCButton_MouseLeave;    }    private void UCButton_MouseEnter(object sender, EventArgs e)    {        this.BackColor = HoverColor; // 鼠标进入时更改背景色    }    private void UCButton_MouseLeave(object sender, EventArgs e)    {        this.BackColor = _defaultColor; // 鼠标离开时恢复默认背景色    }    protected override void OnClick(EventArgs e)    {        base.OnClick(e);        _selectedState = !_selectedState;    }    protected override void OnPaint(PaintEventArgs e)    {        base.OnPaint(e);        e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;                     // 设置抗锯齿        e.Graphics.CompositingQuality = CompositingQuality.HighQuality;         // 高质量合成        e.Graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;    // 高质量插值        // 绘制圆角矩形        using (GraphicsPath path = new GraphicsPath())        {            path.AddArc(00, radius, radius, 18090);                         // 左上角            path.AddArc(this.Width - radius, 0, radius, radius, 27090);       // 右上角            path.AddArc(this.Width - radius, this.Height - radius, radius, radius, 090);  // 右下角            path.AddArc(0this.Height - radius, radius, radius, 9090);                   // 左下角            path.CloseFigure();
            this.Region = new Region(path); // 设置按钮的区域为圆角矩形        }        // 绘制按钮文本        using (Brush brush = new SolidBrush(this.ForeColor))        {            SizeF textSize = e.Graphics.MeasureString(this.Text, this.Font);            PointF textLocation = new PointF((this.Width - textSize.Width) / 2, (this.Height - textSize.Height) / 2);            e.Graphics.DrawString(this.Text, this.Font, brush, textLocation);        }    }}
    窗体代码                              
    窗体关闭、最大化、最小化、适应。
    无边框窗体移动、调整窗体大小。
    菜单展开折叠。
public partial class MainForm : Form{    private int ButtonWidth = 62;
    #region 窗体初始化、加载、关闭    public MainForm()    {        InitializeComponent();        this.CenterToParent();        this.CenterToScreen();    }    private void MainForm_Load(object sender, System.EventArgs e)    {        WinMoveBinding(panel_TopBorderItem);        WinMoveBinding(pic_WinIcon);        this.WindowState = FormWindowState.Normal;        this.MinimumSize = new System.Drawing.Size(150150);        panel_MenuItemText.Hide();        ButtonWidth = btn_Expand.Width;    }    private void MainForm_FormClosing(object sender, FormClosingEventArgs e)    {
    }    #endregion
    /// <summary>    /// 窗体移动功能事件绑定    /// </summary>    private void WinMoveBinding(Control control)    {        control.MouseDown += topBorderPanel_MouseDown;        control.MouseMove += topBorderPanel_MouseMove;        control.MouseUp += topBorderPanel_MouseUp;    }
    #region 窗体拖动    private Point mouseOffset;    private void topBorderPanel_MouseDown(object sender, MouseEventArgs e)    {        if (e.Button == MouseButtons.Left)        {            mouseOffset = new Point(-e.X, -e.Y);        }    }
    private void topBorderPanel_MouseMove(object sender, MouseEventArgs e)    {        if (e.Button == MouseButtons.Left)        {            Point mousePos = Control.MousePosition;            mousePos.Offset(mouseOffset.X, mouseOffset.Y);            this.Location = mousePos;        }    }
    private void topBorderPanel_MouseUp(object sender, MouseEventArgs e)    {        mouseOffset = Point.Empty;    }    #endregion
    #region 无边框窗体随意拖动和改变尺寸    const int WM_NCHITTEST = 0x0084;    const int HTLEFT = 10;    const int HTRIGHT = 11;    const int HTTOP = 12;    const int HTTOPLEFT = 13;    const int HTTOPRIGHT = 14;    const int HTBOTTOM = 15;    const int HTBOTTOMLEFT = 0x10;    const int HTBOTTOMRIGHT = 17;    protected override void WndProc(ref Message m)    {        base.WndProc(ref m);        switch (m.Msg)        {            case WM_NCHITTEST:                Point vPoint = new Point((int)m.LParam & 0xFFFF,                    (int)m.LParam >> 16 & 0xFFFF);                vPoint = PointToClient(vPoint);                if (vPoint.X <= 5)                    if (vPoint.Y <= 5)                        m.Result = (IntPtr)HTTOPLEFT;                    else if (vPoint.Y >= ClientSize.Height - 5)                        m.Result = (IntPtr)HTBOTTOMLEFT;                    else m.Result = (IntPtr)HTLEFT;                else if (vPoint.X >= ClientSize.Width - 5)                    if (vPoint.Y <= 5)                        m.Result = (IntPtr)HTTOPRIGHT;                    else if (vPoint.Y >= ClientSize.Height - 5)                        m.Result = (IntPtr)HTBOTTOMRIGHT;                    else m.Result = (IntPtr)HTRIGHT;                else if (vPoint.Y <= 5)                    m.Result = (IntPtr)HTTOP;                else if (vPoint.Y >= ClientSize.Height - 5)                    m.Result = (IntPtr)HTBOTTOM;                break;        }    }    #endregion
    #region 窗体关闭、最大化、最小化    private void btn_ClosingWindow_Click(object sender, System.EventArgs e)    {        if (MessageBox.Show("是否关闭窗体!""关闭", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.OK)        {            this.Close();        }    }
    private void btn_Maximize_Click(object sender, System.EventArgs e)    {        Button button = sender as Button;        if (this.WindowState == FormWindowState.Maximized)        {            this.WindowState = FormWindowState.Normal;            button.Image = global::ModbusDemo.Properties.Resources.maximize_blue_32;        }        else        {            this.WindowState = FormWindowState.Maximized;            button.Image = global::ModbusDemo.Properties.Resources.restore_blue_32;
        }    }
    private void btn_Minimize_Click(object sender, System.EventArgs e)    {        this.WindowState = FormWindowState.Minimized;    }
    #endregion
    /// <summary>    /// 折叠按钮    /// </summary>    private void btn_Expand_Click(object sender, System.EventArgs e)    {        //展开        if (!btn_Expand.SelectedState)        {            btn_Expand.Image = global::ModbusDemo.Properties.Resources.collapse_left_blue_32;            panel_MenuItemIcon.Width = ButtonWidth;            panel_MenuItemText.ScrollControlIntoView(btn_Expand);            panel_MenuItemText.Show();            panel_LeftMenuItem.Width = 256;        }        //折叠        else        {            btn_Expand.Image = global::ModbusDemo.Properties.Resources.collapse_right_blue_32;
            panel_MenuItemIcon.Width = ButtonWidth;            panel_LeftMenuItem.Width = ButtonWidth;            panel_MenuItemText.Hide();        }    }
    /// <summary>    /// 首页按钮    /// </summary>    private void btn_Home_Click(object sender, EventArgs e)    {
    }}

阅读原文:原文链接


该文章在 2025/3/31 11:40:51 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved