Winform中的自定义组件开发(附带一些Windows GDI编程)

在实际开发中,我们会经常遇到系统给定的控件无法满足我们的需求,或者是重复机械去拖同样的控件,这样就很难控制它的位置或者样式,所以我们需要为自己定制一个合适项目的组件!

我个人在使用的过程中,使用的习惯是,如果是自己的项目就会直接在项目里建立一个组件,方便维护代码,如果是专门写给别人用的又不想给别人看代码,则在建立项目时直接选择建立用户自定义控件。

如图:

组件的建立 直接在项目中进行

自定义控件的创建是在项目开始时

这两种的区别还有:自定义的Windows窗体控件库,最后在/Bin文件下生成的是dll,将其拖到要使用的项目中的【工具箱】里就可以直接使用了。组件的话则是你写好代码之后,编译整个项目,就可以直接在工具栏中看到它。

(组件)

大家可以根据实际需求选择这两种方式!

我就我的DEMO讲解一下,这个DEMO是使用组件的,大家各取所需吧!

我的需求是这样的:我需要在检查的时候反馈四种状态:尚未检查、正在检查、通过检查、存在问题四种状态

在检查完一项是要更新它的状态,那么需要的两个参数,就是这个检查项的状态,如果它存在问题,那么要传过来它存在的问题数量,将它画在界面上,看下这种情况的控件样式:

 (使用windows GDI的好处就是全部画上去,我想画在哪都可以,而控件之间存在遮挡 或者边框难看之类的问题)

定义两个属性:

        //第一个属性  检查状态
        public enum StateInspection
        {
            /// <summary>
            /// 尚未检查
            /// </summary>
            uncheck,
            /// <summary>
            /// 检查中
            /// </summary>
            checking,
            /// <summary>
            /// 查到错误
            /// </summary>
            check_error,
            /// <summary>
            /// 检查通过
            /// </summary>
            check_pass
        }


        private StateInspection fECheckState;


        [EditorBrowsable(EditorBrowsableState.Always)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        [Browsable(true)]
        [Description("检查状态"), Category("数据"), DefaultValue(StateInspection.uncheck)]
        public StateInspection FECheckState
        {
            get
            {
                return fECheckState;
            }


            set
            {
                fECheckState = value;
            }
        }

        //第二个属性  错误数量 
        private int fEerrorCount;
        [EditorBrowsable(EditorBrowsableState.Always)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        [Browsable(true)]
        [Description("错误数量"), Category("数据"), DefaultValue(0)]
        public int FEerrorCount
        {
            get
            {
                return fEerrorCount;
            }
            set
            {
                if (FECheckState == StateInspection.check_error)
                {
                    fEerrorCount = value;
                }
            }
        }

检查状态使用枚举类型,因为这个状态属性只能有四种。

自定义的属性显示在工具栏中:

   在使用的时候后台赋值:

以check_error状态为例

这样我们就完成了自定义组件的属性的定义及使用。在自定义之前,我们需要考虑清楚,哪些值是需要用户给我们的,我们就将其定义为属性,接受参数,然后在组件中去考虑内部实现,外部使用时只调用就好。

在这个项目中还有另一个值得写入的问题,固定这个组件大小,我们选择去覆盖OnResize的方法。

//将其大小固定为140*120

        protected override void OnResize(EventArgs e)
        {
            this.Height = 140;
            this.Width = 120;
            base.OnResize(e);

        }

项目中建立组件和项目外建立自定义控件最后使用dll方式的两种DEMO我都会打包上传,请大家移步我上传的资源文件中下载一下,其实我不想要积分的…但是最少也要选2个积分…,代码已经过调试,希望可以给大家一些思路。

祝好。

谢谢!

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值