• (四十八)c#Winform自定义控件-下拉按钮-HZHControls


    官网

    http://www.hzhcontrols.com

    前提

    入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。

    GitHub:https://github.com/kwwwvagaa/NetWinformControl

    码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git

    如果觉得写的还行,请点个 star 支持一下吧

    欢迎前来交流探讨: 企鹅群568015492 企鹅群568015492

    麻烦博客下方点个【推荐】,谢谢

    NuGet

    Install-Package HZH_Controls

    目录

    https://www.cnblogs.com/bfyx/p/11364884.html

    用处及效果

    准备工作

    这个控件将继承自(三)c#Winform自定义控件-有图标的按钮,如不了解,请移步查看

    开始

    添加一个用户控件UCDropDownBtn,继承自UCBtnImg

    处理一些属性

     1 Forms.FrmAnchor _frmAnchor;
     2         private int _dropPanelHeight = -1;
     3         public new event EventHandler BtnClick;
     4         [Description("下拉框高度"), Category("自定义")]
     5         public int DropPanelHeight
     6         {
     7             get { return _dropPanelHeight; }
     8             set { _dropPanelHeight = value; }
     9         }
    10         private string[] btns ;
    11         [Description("按钮"), Category("自定义")]
    12         public string[] Btns
    13         {
    14             get { return btns; }
    15             set { btns = value; }
    16         }
    17         [Obsolete("不再可用的属性")]
    18         [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
    19         public override Image Image
    20         {
    21             get;
    22             set;
    23         }
    24         [Obsolete("不再可用的属性")]
    25         [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
    26         public override ContentAlignment ImageAlign
    27         {
    28             get;
    29             set;
    30         }

    点击时候显示下拉框

     1 void UCDropDownBtn_BtnClick(object sender, EventArgs e)
     2         {
     3             if (_frmAnchor == null || _frmAnchor.IsDisposed || _frmAnchor.Visible == false)
     4             {
     5 
     6                 if (Btns != null && Btns.Length > 0)
     7                 {
     8                     int intRow = 0;
     9                     int intCom = 1;
    10                     var p = this.PointToScreen(this.Location);
    11                     while (true)
    12                     {
    13                         int intScreenHeight = Screen.PrimaryScreen.Bounds.Height;
    14                         if ((p.Y + this.Height + Btns.Length / intCom * 50 < intScreenHeight || p.Y - Btns.Length / intCom * 50 > 0)
    15                             && (_dropPanelHeight <= 0 ? true : (Btns.Length / intCom * 50 <= _dropPanelHeight)))
    16                         {
    17                             intRow = Btns.Length / intCom + (Btns.Length % intCom != 0 ? 1 : 0);
    18                             break;
    19                         }
    20                         intCom++;
    21                     }
    22                     UCTimePanel ucTime = new UCTimePanel();
    23                     ucTime.IsShowBorder = true;
    24                     int intWidth = this.Width / intCom;
    25 
    26                     Size size = new Size(intCom * intWidth, intRow * 50);
    27                     ucTime.Size = size;
    28                     ucTime.FirstEvent = true;
    29                     ucTime.SelectSourceEvent += ucTime_SelectSourceEvent;
    30                     ucTime.Row = intRow;
    31                     ucTime.Column = intCom;
    32 
    33                     List<KeyValuePair<string, string>> lst = new List<KeyValuePair<string, string>>();
    34                     foreach (var item in Btns)
    35                     {
    36                         lst.Add(new KeyValuePair<string, string>(item, item));
    37                     }
    38                     ucTime.Source = lst;
    39 
    40                     _frmAnchor = new Forms.FrmAnchor(this, ucTime);
    41                     _frmAnchor.Load += (a, b) => { (a as Form).Size = size; };
    42 
    43                     _frmAnchor.Show(this.FindForm());
    44 
    45                 }
    46             }
    47             else
    48             {
    49                 _frmAnchor.Close();
    50             }
    51         }

    处理一下按钮事件

     1 void ucTime_SelectSourceEvent(object sender, EventArgs e)
     2         {
     3             if (_frmAnchor != null && !_frmAnchor.IsDisposed && _frmAnchor.Visible)
     4             {
     5                 _frmAnchor.Close();
     6 
     7                 if (BtnClick != null)
     8                 {
     9                     BtnClick(sender.ToString(), e);
    10                 }
    11             }
    12         }

    完整代码

      1 using System;
      2 using System.Collections.Generic;
      3 using System.ComponentModel;
      4 using System.Drawing;
      5 using System.Data;
      6 using System.Linq;
      7 using System.Text;
      8 using System.Windows.Forms;
      9 
     10 namespace HZH_Controls.Controls.Btn
     11 {
     12     [DefaultEvent("BtnClick")]
     13     public partial class UCDropDownBtn : UCBtnImg
     14     {
     15         Forms.FrmAnchor _frmAnchor;
     16         private int _dropPanelHeight = -1;
     17         public new event EventHandler BtnClick;
     18         [Description("下拉框高度"), Category("自定义")]
     19         public int DropPanelHeight
     20         {
     21             get { return _dropPanelHeight; }
     22             set { _dropPanelHeight = value; }
     23         }
     24         private string[] btns ;
     25         [Description("按钮"), Category("自定义")]
     26         public string[] Btns
     27         {
     28             get { return btns; }
     29             set { btns = value; }
     30         }
     31         [Obsolete("不再可用的属性")]
     32         [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
     33         public override Image Image
     34         {
     35             get;
     36             set;
     37         }
     38         [Obsolete("不再可用的属性")]
     39         [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
     40         public override ContentAlignment ImageAlign
     41         {
     42             get;
     43             set;
     44         }
     45 
     46         public UCDropDownBtn()
     47         {
     48             InitializeComponent();
     49             IsShowTips = false;
     50             this.lbl.Image=Properties.Resources.ComboBox;
     51             this.lbl.ImageAlign = ContentAlignment.MiddleRight;
     52             base.BtnClick += UCDropDownBtn_BtnClick;
     53         }
     54 
     55         void UCDropDownBtn_BtnClick(object sender, EventArgs e)
     56         {
     57             if (_frmAnchor == null || _frmAnchor.IsDisposed || _frmAnchor.Visible == false)
     58             {
     59 
     60                 if (Btns != null && Btns.Length > 0)
     61                 {
     62                     int intRow = 0;
     63                     int intCom = 1;
     64                     var p = this.PointToScreen(this.Location);
     65                     while (true)
     66                     {
     67                         int intScreenHeight = Screen.PrimaryScreen.Bounds.Height;
     68                         if ((p.Y + this.Height + Btns.Length / intCom * 50 < intScreenHeight || p.Y - Btns.Length / intCom * 50 > 0)
     69                             && (_dropPanelHeight <= 0 ? true : (Btns.Length / intCom * 50 <= _dropPanelHeight)))
     70                         {
     71                             intRow = Btns.Length / intCom + (Btns.Length % intCom != 0 ? 1 : 0);
     72                             break;
     73                         }
     74                         intCom++;
     75                     }
     76                     UCTimePanel ucTime = new UCTimePanel();
     77                     ucTime.IsShowBorder = true;
     78                     int intWidth = this.Width / intCom;
     79 
     80                     Size size = new Size(intCom * intWidth, intRow * 50);
     81                     ucTime.Size = size;
     82                     ucTime.FirstEvent = true;
     83                     ucTime.SelectSourceEvent += ucTime_SelectSourceEvent;
     84                     ucTime.Row = intRow;
     85                     ucTime.Column = intCom;
     86 
     87                     List<KeyValuePair<string, string>> lst = new List<KeyValuePair<string, string>>();
     88                     foreach (var item in Btns)
     89                     {
     90                         lst.Add(new KeyValuePair<string, string>(item, item));
     91                     }
     92                     ucTime.Source = lst;
     93 
     94                     _frmAnchor = new Forms.FrmAnchor(this, ucTime);
     95                     _frmAnchor.Load += (a, b) => { (a as Form).Size = size; };
     96 
     97                     _frmAnchor.Show(this.FindForm());
     98 
     99                 }
    100             }
    101             else
    102             {
    103                 _frmAnchor.Close();
    104             }
    105         }
    106         void ucTime_SelectSourceEvent(object sender, EventArgs e)
    107         {
    108             if (_frmAnchor != null && !_frmAnchor.IsDisposed && _frmAnchor.Visible)
    109             {
    110                 _frmAnchor.Close();
    111 
    112                 if (BtnClick != null)
    113                 {
    114                     BtnClick(sender.ToString(), e);
    115                 }
    116             }
    117         }
    118     }
    119 }
    View Code
     1 namespace HZH_Controls.Controls.Btn
     2 {
     3     partial class UCDropDownBtn
     4     {
     5         /// <summary> 
     6         /// 必需的设计器变量。
     7         /// </summary>
     8         private System.ComponentModel.IContainer components = null;
     9 
    10         /// <summary> 
    11         /// 清理所有正在使用的资源。
    12         /// </summary>
    13         /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
    14         protected override void Dispose(bool disposing)
    15         {
    16             if (disposing && (components != null))
    17             {
    18                 components.Dispose();
    19             }
    20             base.Dispose(disposing);
    21         }
    22 
    23         #region 组件设计器生成的代码
    24 
    25         /// <summary> 
    26         /// 设计器支持所需的方法 - 不要
    27         /// 使用代码编辑器修改此方法的内容。
    28         /// </summary>
    29         private void InitializeComponent()
    30         {
    31             System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(UCDropDownBtn));
    32             this.SuspendLayout();
    33             // 
    34             // lbl
    35             // 
    36             this.lbl.Font = new System.Drawing.Font("微软雅黑", 14F);
    37             this.lbl.ForeColor = System.Drawing.Color.White;
    38             this.lbl.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
    39             this.lbl.ImageList = null;
    40             this.lbl.Text = "自定义按钮";
    41             this.lbl.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
    42             // 
    43             // UCDropDownBtn
    44             // 
    45             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
    46             this.BtnFont = new System.Drawing.Font("微软雅黑", 14F);
    47             this.BtnForeColor = System.Drawing.Color.White;
    48             this.ForeColor = System.Drawing.Color.White;
    49             this.Image = ((System.Drawing.Image)(resources.GetObject("$this.Image")));
    50             this.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
    51             this.Margin = new System.Windows.Forms.Padding(2);
    52             this.Name = "UCDropDownBtn";
    53             this.ResumeLayout(false);
    54 
    55         }
    56 
    57         #endregion
    58     }
    59 }
    View Code

    最后的话

    如果你喜欢的话,请到 https://gitee.com/kwwwvagaa/net_winform_custom_control 点个星星吧

  • 相关阅读:
    Re: 求助:5道算法题
    AutoComplete的字典建立和单词查找算法实现
    求教大牛!关于后缀树
    Qt OpenGL教程
    调试宏
    if结合errorlevel使用:判断一个DOS命令执行成功与否
    写给自己,关于对纯技术的追求,以及为了金钱与前途的技术追求
    <转>我对菜鸟成长的看法
    看完电影有感。。。。。
    <转>标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast
  • 原文地址:https://www.cnblogs.com/bfyx/p/11417291.html
Copyright © 2020-2023  润新知