首页 > 其他分享 >winform--下拉菜单

winform--下拉菜单

时间:2024-07-22 15:08:37浏览次数:14  
标签:set get -- Drop 下拉菜单 Color Title public winform

新建一个用户控件:

 直接上代码:

 /*
     * 作者:pengyan zhang
     * 邮箱:[email protected]
     * 博客:https://www.cnblogs.com/zpy1993-09
     * 时间:2024-04-12 20:03
     */
    public partial class UCDropControl : UserControl
    {
        #region 事件
        /// <summary>
        /// 委托
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public delegate void DropEventHandler(object sender, DataEventArgs e);
        /// <summary>
        /// 开关状态发生改变时引发的事件
        /// </summary>
        public event DropEventHandler DrophEvent;
        #endregion
        #region 属性
        [Category("SimpleUI"), Description("下拉框的边框颜色"), DefaultValue(typeof(Color), "138, 238, 238")]
        public Color UC_BorderColor { get { return borderColor; } set { borderColor = value; Invalidate(); } }
        private Color borderColor { get; set; } = Color.FromArgb(138, 238, 238);
        [Category("SimpleUI"), Description("下拉框边框的大小"), DefaultValue(typeof(int), "5")]
        public int UC_BorderSize { get { return borderSize; } set { borderSize = value; Invalidate(); } }
        private int borderSize { get; set; } = 2;
        [Category("SimpleUI"), Description("下拉框的默认Text")]
        public string UC_Title { get { return Title; } set { Title = value; this.Drop_Title.Text = value; Invalidate(); } }
        private string Title { get; set; } = "请选择";
        [Category("SimpleUI"), Description("当鼠标进入下拉框子项,显示的颜色"), DefaultValue(typeof(Color), "0, 159, 149")]
        public Color UC_EnterDropItemBackColor { get { return EnterDropItemBackColor; } set { EnterDropItemBackColor = value; } }
        private Color EnterDropItemBackColor { get; set; } = Color.FromArgb(0, 159, 149);
        [Category("SimpleUI"), Description("当鼠标离开时,或者默认颜色"), DefaultValue(typeof(Color), "255, 255, 255")]
        public Color UC_LeaveDropItemBackColor { get { return LeaveDropItemBackColor; } set { LeaveDropItemBackColor = value; } }
        private Color LeaveDropItemBackColor { get; set; } = Color.FromArgb(255, 255, 255);
        [Category("SimpleUI"), Description("当鼠标进入的时候,字体颜色"), DefaultValue(typeof(int), "255, 255, 255")]
        public Color UC_EnterDropItemFontColor { get { return EnterDropItemFontColor; } set { EnterDropItemFontColor = value; } }
        private Color EnterDropItemFontColor { get; set; } = Color.FromArgb(255, 255, 255);
        [Category("SimpleUI"), Description("当鼠标离开的时候,或者默认字体颜色"), DefaultValue(typeof(int), "0, 0,0")]
        public Color UC_LeaveDropItemFontColor { get { return LeaveDropitemFontColor; } set { LeaveDropitemFontColor = value; } }
        private Color LeaveDropitemFontColor { get; set; } = Color.FromArgb(0, 0, 0);
        private int UCHeight { get; set; } = 30;
        private FlowLayoutPanel flowLayoutPanel { get; set; }
        private DropOption dropOption { get; set; }
        public string DropName { 
            get {
                if (dropOption == null) return this.Title;
                return dropOption.Title;
            }
        }
        public string DropValue
        {
            get
            {
                if (dropOption == null) return "";
                return dropOption.Id.ToString();
            }
        }

        #endregion
        public UCDropControl()
        {
            InitializeComponent();
            this.Drop_Back.Paint += Drop_Back_Paint;
            Drop_Title.Click += Drop_Click;
            Drop_Pic.Click += Drop_Click;
            Drop_Title.MouseEnter += Drop_MouseEnter_Click;
            Drop_Pic.MouseEnter += Drop_MouseEnter_Click;
            this.Drop_Title.Text = this.Title;
        }
        public void SetDrop(List<DropOption> options)
        {
            //创建FlowLayoutPanel对象
            flowLayoutPanel = new FlowLayoutPanel();
            //放开滚动条
            flowLayoutPanel.AutoScroll = true;
            //禁止横向滚动条
            SetScrollBar(flowLayoutPanel.Handle, 1, 0);//隐藏下、右滚动条
            SetScrollBar(flowLayoutPanel.Handle, 0, 0);
            //计算下拉框子项行高
            int height = 0;
            flowLayoutPanel.Width = this.Width;
            if (options.Count > 0)
            {
                //定义子项
                options.ForEach(item =>
                {
                    //创建子项对象
                    Label label = new Label();
                    label.Tag = item;
                    label.Name = "DropItem";
                    label.AutoSize = false;
                    label.Height = this.Height;
                    label.Width = this.Width;
                    label.BackColor = LeaveDropItemBackColor;
                    label.ForeColor = LeaveDropitemFontColor;
                    if (item.dropType == DropType.文本和图标)
                    {
                        label.ImageAlign = ContentAlignment.MiddleLeft;
                        label.Image = item.image;
                    }
                    label.TextAlign = ContentAlignment.MiddleCenter;
                    if (item.dropType == DropType.字体图标)
                    {
                        label.UseCompatibleTextRendering = true;
                        label.Text = IconfontHelper.GetIconFont(item.StrImage) + "    " + item.Title;
                    }
                    else label.Text = item.Title;
                    label.Click += Drop_Click;
                    label.MouseEnter += Drop_MouseEnter_Click;
                    label.MouseLeave += Drop_MouseLeave_Click;
                    label.Paint += DropItem_Paint;
                    height += this.Height;
                    flowLayoutPanel.Controls.Add(label);
                });
            }
            //如果子项的高大于下拉框的4倍高度,某人为4倍高度
            if (height > this.Height * 4) flowLayoutPanel.Height = this.Height * 4;
            else flowLayoutPanel.Height = height;//如果小于4倍高度,那么就等于累计高度
        }
        private void DropItem_Paint(object? sender, PaintEventArgs e)
        {
            Control control = sender as Control;
            ControlPaint.DrawBorder(e.Graphics,//获取进行绘制的图形
           new Rectangle(0, 0, control.Width, control.Height),//绘制控件所在工作区域
            Color.FromArgb(224, 224, 224), 1, ButtonBorderStyle.Solid,//边框类型,选择实线边框,也有虚线等种类;下面这四个重复的传参是设置工作区上下左右边框的功能
            Color.FromArgb(224, 224, 224), 1, ButtonBorderStyle.Solid,
            Color.FromArgb(224, 224, 224), 1, ButtonBorderStyle.Solid,
            Color.FromArgb(224, 224, 224), 1, ButtonBorderStyle.Solid);
        }
        public void Drop_MouseLeave_Click(object? sender, EventArgs e)
        {
            var control = sender as Control;
            control.BackColor = LeaveDropItemBackColor;
            control.ForeColor = LeaveDropitemFontColor;
        }
        private void Drop_MouseEnter_Click(object? sender, EventArgs e)
        {
            var control = sender as Control;
            control.Cursor = Cursors.Hand;
            if (control.Name == "DropItem")
            {
                control.BackColor = EnterDropItemBackColor;
                control.ForeColor = EnterDropItemFontColor;
            }
        }
        private void Drop_Click(object? sender, EventArgs e)
        {
            if (flowLayoutPanel == null || flowLayoutPanel.Controls.Count == 0) return;
            var control = sender as Control;
            Popup pop;
            switch (control.Name)
            {
                case "Drop_Title":
                case "Drop_Pic":
                    pop = new Popup(flowLayoutPanel);
                    flowLayoutPanel.Tag = pop;
                    pop.Show(this);
                    break;
                case "DropItem":
                    var drop = control.Tag as DropOption;
                     dropOption=drop;
                    this.Drop_Title.Text = drop.Title;
                    pop = flowLayoutPanel.Tag as Popup;
                    if (DrophEvent != null) DrophEvent.Invoke(control, new DataEventArgs(drop));
                    pop.Close();
                    break;
            }
        }
        protected override void OnResize(EventArgs ea)
        {
            this.Height = this.UCHeight;
            base.OnResize(ea);
        }
        private void Drop_Back_Paint(object? sender, PaintEventArgs e)
        {
            ControlPaint.DrawBorder(e.Graphics,//获取进行绘制的图形
            new Rectangle(0, 0, Drop_Back.Width, Drop_Back.Height),//绘制控件所在工作区域
              this.borderColor, this.borderSize, ButtonBorderStyle.Solid,//边框类型,选择实线边框,也有虚线等种类;下面这四个重复的传参是设置工作区上下左右边框的功能
              this.borderColor, this.borderSize, ButtonBorderStyle.Solid,
              this.borderColor, this.borderSize, ButtonBorderStyle.Solid,
              this.borderColor, this.borderSize, ButtonBorderStyle.Solid);
        }
        #region 设置滚动条显示
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern int ShowScrollBar(IntPtr hWnd, int bar, int show);

        private class SubWindow : NativeWindow
        {
            private int m_Horz = 0;
            private int m_Show = 0;

            public SubWindow(int p_Horz, int p_Show)
            {
                m_Horz = p_Horz;
                m_Show = p_Show;
            }
            protected override void WndProc(ref Message m_Msg)
            {
                ShowScrollBar(m_Msg.HWnd, m_Horz, m_Show);
                base.WndProc(ref m_Msg);
            }
        }
        /// <summary>
        /// 设置滚动条是否显示
        /// </summary>
        /// <param name="p_ControlHandle">句柄</param>
        /// <param name="p_Horz">0横 1列 3全部</param>
        /// <param name="p_Show">0隐 1显</param>
        public static void SetScrollBar(IntPtr p_ControlHandle, int p_Horz, int p_Show)
        {
            SubWindow _SubWindow = new SubWindow(p_Horz, p_Show);
            _SubWindow.AssignHandle(p_ControlHandle);
        }

        #endregion
    }
    public class DropOption
    {
        public object Id { get; set; }
        public DropType dropType { get; set; } = DropType.文本;
        public Image image { get; set; }
        public string Title { get; set; }
        public string StrImage { get; set; }
    }
   public enum DropType
    {
        文本,
        文本和图标,
        字体图标
    }
 private void InitData()
        {
            var optlist = new List<DropOption>()
            {
                new DropOption(){Id="1",dropType=DropType.文本,Title="标题1"},
                 new DropOption(){Id="2",dropType=DropType.文本,Title="标题2"},
                new DropOption(){Id="3",dropType=DropType.文本,Title="标题3"},
                new DropOption(){Id="4",dropType=DropType.文本,Title="标题4"},


            };
            ucDropControl1.SetDrop(optlist);

        }

 

效果:

 

标签:set,get,--,Drop,下拉菜单,Color,Title,public,winform
From: https://www.cnblogs.com/zpy1993-09/p/18316037

相关文章

  • Go语言中使用K8s API及一些常用API整理
    Go语言中使用K8sAPI及一些常用API整理发布于 2022-05-0915:54:402K0举报文章被收录于专栏:devops_k8sGoClient在进入代码之前,理解k8s的goclient项目是对我们又帮助的。它是k8sclient中最古老的一个,因此具有很多特性。Client-go没有使用Swagger......
  • 广东注塑mes系统功能_mes系统服务商_盈致mes系统
    广东mes系统是一种用于管理和监控注塑生产过程的信息化系统,其作用和优势如下:作用:生产计划管理:注塑MES可以根据订单需求和生产能力进行生产计划排程,优化生产计划,提高生产效率。工单管理:管理注塑生产中的工单信息,包括工单状态、工单进度、工单完成情况等,实现生产过程的跟踪和控制......
  • 代码随想录算法训练营第一天leetcode704二分查找27移除元素
    leetcode704,这是leetcode提交四次后通过的结果:classSolution{  publicintsearch(int[]nums,inttarget){    if(nums.length==1&&nums[0]==target)      return 0;    if(nums.length==2)      if(nums[0]==target)......
  • USB_IAP例程讲解及移植步骤
    IAP是InApplicationProgramming的缩写,‌含义为应用编程技术,此方式允许用户在自己的程序运行过程中对Flash存储器的部分区域进行烧写,‌方便地通过预留的通信口对产品中的固件程序进行更新升级。‌此外,USB_IAPDemo中的两个工程可通过预留的jumpApp接口和jumpToIap接口进行地址指......
  • 为什么 hatch 不将虚拟环境保存在我正在工作的同一目录中?
    为什么hatch不将虚拟环境保存在我正在工作的同一目录中?我浏览了文档,但找不到实现这一目标的方法。也许这样是有道理的,但我真的想不出为什么。有没有办法在项目目录中创建它?或者有一个不想这样做的充分理由?Hatch没有将虚拟环境存储在你的项目目录中的原因有很多。......
  • iOS开发基础135-Core Data
    Objective-C(OC)中使用CoreData是iOS应用开发中管理模型层对象的一种有效工具。CoreData使用ORM(对象关系映射)技术来抽象化和管理数据。这不仅可以节省时间,还能减少编程错误。以下是使用CoreData的详细介绍,包括示例代码,以及深入底层的一些分析。基本概念持久化......
  • 【mitmproxy】使用mitmproxy录制http流量并写入文件
    一、场景   就是想用python脚本录制相关请求流量,然后回放给服务 二、脚本importmitmproxyimportjsonclassHttpFlowRecorder:def__init__(self):self.traffic=[]defrequest(self,flow):request_info={"url":fl......
  • 场景题
    分表设计分表是为了提高数据库的性能和扩展性。通过将数据分散到多个表中,可以减少单个表的大小,从而提高查询效率。跨库Join跨库Join可以通过应用层进行数据合并,或者使用分布式数据库中间件来实现。数据量突增数据量突增可以通过增加数据库实例、分库分表、使用缓存等方式来解......
  • sqlalchemy.exc.InvalidRequestError
    我收到此错误,但我不明白如何解决它。当我使用uvicorn运行FastApi时出现此错误。要注意利用循环模型导入的错误,我使用了TYPE_CHEKINGsqlalchemy.ext.InvalidRequestError:Oneormoremappersfailedtoinitialize-can'tproceedwithinitializationofotherm......
  • 凤凰项目(Phoenix Project)精要 - 2 - 概念
    事项管理工作事项类型解决疲于奔命而无法自拔的困境,避免计划外的工作不期而至,减少事项上的“黑锅”。正确区分工作事项类型是合理规划实施的必要前提。业务事项:开发及业务类(来自开发团队、业务等相关团队)内部事项:运维类(运维基础架构、运维建设项目、运维开发项目)变更事项:......