zoukankan      html  css  js  c++  java
  • (四十八)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 点个星星吧

  • 相关阅读:
    POJ 3672 水题......
    POJ 3279 枚举?
    STL
    241. Different Ways to Add Parentheses
    282. Expression Add Operators
    169. Majority Element
    Weekly Contest 121
    927. Three Equal Parts
    910. Smallest Range II
    921. Minimum Add to Make Parentheses Valid
  • 原文地址:https://www.cnblogs.com/bfyx/p/11417291.html
Copyright © 2011-2022 走看看