none
.NET 控件库有很多可用控件,我想知道这些控件是怎么绘制的? RRS feed

  • 问题

  • 反编译控件(TextBox)后并没有看到有关于绘制的内容,我想应该是在某个特别的地方有绘制方法。

    比如TextBox控件,具体绘制这个控件的方法在什么地方?

    2012年6月20日 6:41

答案

  • 以下是一种方案:

    编写一个控件命名为MyTreeView(重写自己需要的属性),继承自TreeView,这样以后再使用就不需要TreeView了,直接将MyTreeView生成DLL,引用到VS工具箱,当加强版的TreeView使用。

    假期中间出去玩了,回复较晚,希望能给你有所启发

    举个简单的例子:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;// 命名空间提供用于实现组件和控件运行时和设计时行为的类。此命名空间包括用于实现属性和类型转换器、绑定到数据源以及授权组件的基类和接口。
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    namespace ClassLibraryDemo
    {
        public partial class MyLabel : Label
        {
            public MyLabel()
            {
                InitializeComponent();
            }
            //定义一个新的属性TextAlignment
            private ContentAlignment alignmentValue = ContentAlignment.MiddleLeft;
            [Category("Alignment")]
            [Description("Specifies the alignment of text.")]
            [DefaultValue("MyNew")]
            public ContentAlignment TextAlignment
            {
                get
                {
                    return alignmentValue;
                }
                set
                {
                    alignmentValue = value;
                    Invalidate();
                }
            }
            //重写
            protected override void OnPaint(PaintEventArgs pe)
            {
                // TODO: 在此处添加自定义绘制代码
                // 调用基类 OnPaint
                base.OnPaint(pe);
                StringFormat style = new StringFormat();
                style.Alignment = StringAlignment.Near;
                switch (alignmentValue)
                {
                    case ContentAlignment.MiddleLeft:
                        style.Alignment = StringAlignment.Near;
                        break;
                    case ContentAlignment.MiddleRight:
                        style.Alignment = StringAlignment.Far;
                        break;
                    case ContentAlignment.MiddleCenter:
                        style.Alignment = StringAlignment.Center;
                        break;
                }
                pe.Graphics.DrawString(
                    Text,
                    Font,
                    new SolidBrush(ForeColor),
                    ClientRectangle, style);
            }
        }
    }

    效果如下:你会看到新属性

    2012年6月25日 2:14

全部回复

  • 你的意思是扩展此控件吗即在已有Textbox基础上增进去新的属性和功能?如果是这样可以新建一个类比如命名为TextBoxNew,继承自TextBox(所以命名空间要加上UI及相关controls(web还是winform不一样))。

    在这个类中可以嵌入资源,增加属性,自定义方法,重写父类(甚至是基类,如control类)方法······

    增加属性时可以使用元数据修饰。

    几个常用元数据:

    ToolboxData - 指定当从 Microsoft Visual Studio 等工具中的工具箱拖动自定义控件时为它生成的默认标记;

    DefaultValue - 指定属性 (Property) 的默认值;

    Category - 给属性或事件分组的类别的名称;

    建议参考:http://msdn.microsoft.com/zh-cn/library/6hws6h2t.aspx  和  http://msdn.microsoft.com/zh-cn/library/6hws6h2t.aspx

    2012年6月20日 8:58
  • 今天突然想到一点,上面说的主要是web控件重写······Winform控件是重写Onpaint事件。

    MSDN说的很详细了········http://msdn.microsoft.com/zh-cn/library/cksxshce.aspx

    2012年6月21日 9:03
  • 是这样的,我需要一个TreeView控件,但TreeNode有个进度属性,并且在节点名称后面把这个进度条绘制出来。

    我重写TreeNode没有问题,但我怎么让TreeView使用我重写的MyTreeNode,并且怎样在TreeView中重写绘制TreeNode的方法,将进度条绘制出来。

    我表达的可能不太清楚- -!

    2012年6月21日 9:05
  • 以下是一种方案:

    编写一个控件命名为MyTreeView(重写自己需要的属性),继承自TreeView,这样以后再使用就不需要TreeView了,直接将MyTreeView生成DLL,引用到VS工具箱,当加强版的TreeView使用。

    假期中间出去玩了,回复较晚,希望能给你有所启发

    2012年6月25日 1:25
  • 重点在于,我想让Node多加几个属性,所以我要重写TreeNode,问题是怎样才能让TreeView添加节点时使用我重写的MyTreeNode对象?

    2012年6月25日 2:07
  • 以下是一种方案:

    编写一个控件命名为MyTreeView(重写自己需要的属性),继承自TreeView,这样以后再使用就不需要TreeView了,直接将MyTreeView生成DLL,引用到VS工具箱,当加强版的TreeView使用。

    假期中间出去玩了,回复较晚,希望能给你有所启发

    举个简单的例子:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;// 命名空间提供用于实现组件和控件运行时和设计时行为的类。此命名空间包括用于实现属性和类型转换器、绑定到数据源以及授权组件的基类和接口。
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    namespace ClassLibraryDemo
    {
        public partial class MyLabel : Label
        {
            public MyLabel()
            {
                InitializeComponent();
            }
            //定义一个新的属性TextAlignment
            private ContentAlignment alignmentValue = ContentAlignment.MiddleLeft;
            [Category("Alignment")]
            [Description("Specifies the alignment of text.")]
            [DefaultValue("MyNew")]
            public ContentAlignment TextAlignment
            {
                get
                {
                    return alignmentValue;
                }
                set
                {
                    alignmentValue = value;
                    Invalidate();
                }
            }
            //重写
            protected override void OnPaint(PaintEventArgs pe)
            {
                // TODO: 在此处添加自定义绘制代码
                // 调用基类 OnPaint
                base.OnPaint(pe);
                StringFormat style = new StringFormat();
                style.Alignment = StringAlignment.Near;
                switch (alignmentValue)
                {
                    case ContentAlignment.MiddleLeft:
                        style.Alignment = StringAlignment.Near;
                        break;
                    case ContentAlignment.MiddleRight:
                        style.Alignment = StringAlignment.Far;
                        break;
                    case ContentAlignment.MiddleCenter:
                        style.Alignment = StringAlignment.Center;
                        break;
                }
                pe.Graphics.DrawString(
                    Text,
                    Font,
                    new SolidBrush(ForeColor),
                    ClientRectangle, style);
            }
        }
    }

    效果如下:你会看到新属性

    2012年6月25日 2:14