none
winform中关于自定义绘制控件的问题 RRS feed

  • 问题

  • 1,首先我明白了,一般性的自定义绘制,就是比如在一个继承自UserControl类的自定义控件中绘制一个ImageButton,

    但是复杂一些的自定义控件,小弟我还不是太懂,求大神们指点一下!

    比如,一个 hScrollBar控件中的滑块,在自定义绘制中,是怎么实现的。,并且绘制完了后,出来的效果是滑块还可以拖动,那么这个又是怎么做的呢?烦请各路路过的大神,解答一下小弟我的困惑!!

    2017年9月8日 7:44

全部回复

  • 下面说明下自定义绘制控件的概念(如果有符合你的答案也请把流程设定为解答):
    
    一、自定义控件的编写
    这里我给出一个能实现通过选择颜色对话框里的颜色实现字体颜色改变的控件。




    2017年9月8日 17:00
  • 实现的步骤:
    (1),新建项目模版中选择“windows控件库”。


    2017年9月8日 17:07
  • (2),把UserControl1的Name属性修改为“myStatusBar”,并如下设置控件的布局。

    其中,PictureBox1、PictureBox2、label1和Panel控件的Dock属性分别为Top,Buttom,Left,Fill。
    并为PictureBox1和PictureBox2控件加载两幅图片。


    2017年9月8日 17:10
  • (3),在UserControl1.cs类中写代码
    [System.Drawing.ToolboxBitmap(@"D:\Icon.png")]//设置控件的图标,放置的位置为类的前面

    这句代码是用来设置控件的图标,如果不写这一句,则系统会用其默认的图标,这里需要注意的是这句代码一定要放置在myStautsBar类的前面,代码组织如下图。


    2017年9月8日 17:12
  • (4),接着为自定义控件设置自己的专有属性myText,
    用于设置label的文本内容,代码写在myStatusBar类中。






    2017年9月8日 17:22
  • 其实这个时候控件就可以单独应用了,这是一个只含有一个自定义属性的控件。
    按F5运行这个项目,弹出“用户控件测试容器”。
    可以看到里面有myText属性,当我们点击它的时候下面会有我们自己写的属性提示说明。
    在其中输入文字,发现控件中的文字也随之改变了。

    2017年9月8日 17:28
  • 继续添加第二个属性myFontColor属性,用于设置字体的颜色,代码写在myStatusBar类中。
    



    2017年9月8日 17:29
  • 运行之后,效果图如下


    2017年9月8日 17:31
  • 是不是发现多了一个myFontColor属性,這就是自定义控件。
    (5)下面要做的事情就稍微复杂点了,为控件写自己的事件,就像button有Click,MouseMove和MouseDown事件一样,要为自己的控件写专门的事件,步骤如下:
    (Ⅰ),写一个事件的委托(或者叫代理,关键字delegate),代码写在myStatusBar类中
    
    //事件所需的委托。委托相当于可以实例化一个事件的类,委托中的参数必须同其委托的事件参数完全一致。
    public delegate void FontColorChangedEventHandler(object sender, FontColorChagedEventArgs e);
    注意:这里的FontColorChagedEventArgs类为继承自EventArgs类的一个自定义子类,后面会给出其具体实现的代码。
    并且委托的命名规则为:事件名(FontColorChanged)+EventHandler。
    里面的两个参数命名规则:第一个为sender,类型为object,第二个为e,类型为自定义类,事件名(FontColorChanged)+EventArgs。
    (Ⅱ),定义一个事件,这个事件需要(I)中所定义的委托作为代理,代码写在myStatusBar类中//定义一个FontColorChangedEventHandler事件。
    public event FontColorChangedEventHandler FontColorChanged;
    事件就是一个委托实例,可以想象成实例化一个类。
    注意:这里事件不带任何参数。
    (Ⅲ),定义一个方法,通过这个方法来触发(II)中定义的事件,代码写在myStatusBar类中。



    2017年9月8日 17:34
  • (Ⅳ)把事件同控件关联,代码写在myStatusBar类中。



    2017年9月8日 17:38
  • (Ⅴ)现在写以上步骤频繁用到的自定义类FontColorChagedEventArgs,代码写在myControl命名空间中。


    2017年9月8日 17:40
  • 到这里整个自定义控件的代码就写完了,F5运行。

    2017年9月8日 17:42
  • 在E:\myControl\bin\Debug目录下生成一名为myControl.dll的dll文件,这就是我们的自定义控件的引用集。
    下面是UserControl1.cs的代码:
    

    2017年9月8日 17:50
  • 代码第二段


    2017年9月8日 17:53
  • 代码第三段

    2017年9月8日 17:55
  • 代码第四段


    2017年9月8日 17:56
  • 二、自定义控件的引用
    (1),新建一windows应用程序,名为“testControl”。
    在在工具箱上右击鼠标,选择“选择项(I)…”打开“选择工具箱项”对话框,
    在”.NET Framework组件“选项卡中选择浏览,加载刚刚编译好的myControl.dll文件。
    在工具箱中发现多了一个名为myStatusBar的控件,这就是写好一个控件,还带有自己定义的图标。

    2017年9月8日 18:00
  • (2),拖拽myStatusBar控件至Form1中,设置好其myText和myFontColor属性后。
    在其事件列表中存在一名为FontColorChanged的事件,这其实就是我们自己写的事件。

    2017年9月8日 18:03
  • 在其FontColorChanged事件中写代码获取当前的颜色,并用消息框显示出来。



    2017年9月8日 18:06
  • 一个简单自定义控件的编写及应用已经完成。

    2017年9月8日 18:08
  • 非常感谢大神的回复,我待会来仔细看看,现在还有点事在忙!!
    2017年9月9日 1:53
  • 用.net reflector反编译下hScrollBar的源代码,是看到它的实现。


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2017年9月11日 0:31
  • Hi,

    感谢你在MSDN论坛发帖。

    关于创造自定义控件的步走,你可以下面的文档。里面有详细的介绍。

    http://www.c-sharpcorner.com/UploadFile/ehtesham.dotnet/how-to-create-a-custom-control/

    Writing your Custom Control: step by step 。

    如果你在开发中遇到什么问题,欢迎随时来发帖,我们一起探讨一下。

    Best Regards,

    Hart

    注意:此回复包含对第三方万维网站点的引用。 Microsoft提供此信息为您提供方便。 Microsoft不控制这些网站,并且没有测试在这些网站上发现的任何软件或信息; 因此,Microsoft不能对任何软件或信息的质量,安全性或适用性做任何声明。 使用互联网上发现的任何软件都存在固有的危险,Microsoft警告您,在从互联网检索任何软件之前,请确保您完全理解风险。


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.


    2017年10月4日 5:45
    版主