当前位置:文档之家› WinForm控件开发总结

WinForm控件开发总结

WinForm控件开发总结
WinForm控件开发总结

WinForm控件开发总结(一)------开篇

我本人不是专业的控件开发人员,只是在平常的工作中,需要自己开发一些控件。在自己开发WinForm控件的时候,没有太多可以借鉴的资料,只能盯着MSDN使劲看,还好总算有些收获。现在我会把这些经验陆陆续续的总结出来,写成一系列方章,希望对看到的朋友有所帮助。今天我来开个头。

其实开发WinForm控件并不是很复杂,.NET为我们提供了丰富的底层支持。如果你有M FC或者API图形界面的开发经验,那么学会WinForm控件可能只需要很短的时间就够了。

自己开发的WinForm控件通常有三种类型:复合控件(Composite Controls),扩展控件(Extended Controls),自定义控件(Custom Controls)。

复合控件:将现有的各种控件组合起来,形成一个新的控件,将集中控件的功能集中起来。

扩展控件:在现有控件的控件的基础上派生出一个新的控件,为原有控件增加新的功能或者修改原有控件的控能。

自定义控件:直接从System.Windows.Forms.Control类派生出来。Control类提供控件所需要的所有基本功能,包括键盘和鼠标的事件处理。自定义控件是最灵活最强大的方法,但是对开发者的要求也比较高,你必须为Control类的OnPaint事件写代码,你也可以重写Con trol类的WndProc方法,处理更底层的Windows消息,所以你应该了解GDI+和Windows API。

本系列文章主要介绍自定义控件的开发方法。

控件(可视化的)的基本特征:

1. 可视化。

2. 可以与用户进行交互,比如通过键盘和鼠标。

3. 暴露出一组属性和方法供开发人员使用。

4. 暴露出一组事件供开发人员使用。

5. 控件属性的可持久化。

6. 可发布和可重用。

这些特征是我自己总结出来,不一定准确,或者还有遗漏,但是基本上概括了控件的主要方面。

接下来我们做一个简单的控件来增强一下感性认识。首先启动VS2005创建一个ClassLi

brary工程,命名为CustomControlSample,VS会自动为我们创建一个solution与这个工程同名,然后删掉自动生成的Class1.cs文件,最后在Solution explorer里右键点击Custo mControlSample工程选择Add->Classes…添加一个新类,将文件的名称命名为FirstCont rol。下边是代码:

using System;

using System.Collections.Generic;

using System.Text;

using System.Windows.Forms;

using https://www.doczj.com/doc/bb12773498.html,ponentModel;

using System.Drawing;

namespace CustomControlSample

{

public class FirstControl : Control

{

public FirstControl()

{

}

// ContentAlignment is an enumeration defined in the System.Drawing

// namespace that specifies the alignment of content on a drawing

// surface.

private ContentAlignment alignmentValue = ContentAlignment.MiddleLeft;

[

Category("Alignment"),

Description("Specifies the alignment of text.")

]

public ContentAlignment TextAlignment

{

get

{

return alignmentValue;

}

set

{

alignmentValue = value;

// The Invalidate method invokes the OnPaint method described // in step 3.

Invalidate();

}

}

protected override void OnPaint(PaintEventArgs e)

{

base.OnPaint(e);

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;

}

// Call the DrawString method of the System.Drawing class to write // text. Text and ClientRectangle are properties inherited from

// Control.

e.Graphics.DrawString(

Text,

Font,

new SolidBrush(ForeColor),

ClientRectangle, style);

}

}

}

在上一篇文章里我们创建了一个简单的控件FirstControl,现在我来介绍一下怎么使用和调试自己的控件。我希望将过程写的尽可能的详细,让想学习控件开发的朋友容易上手,高手们见谅。

在同一个solution里添加一个Windows Application工程(在Solution Explorer 里右键点击CustomControlSample solution选择Add->New Project…),命名为TestControl。VS会为你自动生成一个Form,文件名为Form1.cs。在Solution Explorer 里双击Form1.cs文件进入到Form设计界面。现在我们将FirstControl控件添加到工具箱(ToolBox)里,在Toolbox上右键点击,在弹出的菜单中选择Choose Items…,在

出现的Choose Toolbox Items对话框中点击Browse…按钮,在Open对话框中选择我们的控件工程生成的dll(我的dll在F:\Programs\C#\CustomControlSample\CustomControlSample\bin\Debug目录下,你可以根据实际情况去找)。完成这一步,在Toolbox就会出现我们设计的控件,图标是一个蓝色的齿轮(默认的都是这个,当然你也可以修改,后边的文章我会介绍),名称是FirstControl。

现在我们在Toolbox中选中FirstControl,在form设计器上左键点击,或者按住鼠标拖放。我们制作的控件出现在了Form设计器上,在Form设计器上选中这个控件,然后在属性浏览器中将Text属性设为Hello World,现在我们的控件上的文字变成了Hello World。接下来我们要运行测试的工程,看看实际的效果。在运行之前,将测试工程设为启动工程,具体做法是,在solution explorer中右键点击TestControl工程,选择“Set as Startup Project”。点击工具栏里的运行按钮,或者按键盘的F5功能键。实际效果如下图所示:

WinForm控件开发总结(三)------认识WinForm控件常用的Attribute

在前面的文章里我们制作了一个非常简单的控件。现在我们回过头来看看这些代码透露出什么信息。

这个类是直接从Control类派生出来的,自定义控件都是直接从Control类派生出来的。这个类定义了一个属性TextAlignment,用来控制文本在控件中显示的位置:

[

Category("Alignment"),

Description("Specifies the alignment of text.")

]

public ContentAlignment TextAlignment

{

get

{

return alignmentValue;

}

set

{

alignmentValue = value;

// The Invalidate method invokes the OnPaint method described

// in step 3.

Invalidate();

}

}

在这个属性之上有两个Attribute,这两个attribute描述了控件在设计时所表现出来的特征。我们来看看在控件设计中有哪些主要用到的设计时Attribute。

BrowsableAttribute:描述是否一个属性或事件应该被显示在属性浏览器里。CategoryAttribute:描述一个属性或事件的类别,当使用类别的时候,属性浏览器按类别将属性分组。

DescriptionAttribute:当用户在属性浏览器里选择属性的时候,description里指定的文本会显示在属性浏览器的下边,向用户显示属性的功能。

BindableAttribute:描述是否一个属性倾向于被绑定。

DefaultPropertyAttribute:为组件指定一个默认的属性,当用户在Form设计器上选择一个控件的时候,默认属性会在属性浏览器里被选中。

DefaultValueAttribute:为一个简单类型的属性设置一个默认值。

EditorAttribute:为属性指定一个特殊的编辑器。

LocalizableAttribute:指示一个属性是否能被本地化,任何有这个Attribute的属性将会被持久化到资源文件里。

DesignerSerializationVisibilityAttribute:指示一个属性是否或者如何持久化到代码里。TypeConverterAttribute:为属性指定一个类型转换器,类型转换器能将属性的值转化成其它的数据类型。

DefaultEventAttribute:为组件指定一个默认的事件,当用户在form设计其中选择一个控件的时候,在属性浏览器中这个事件被选中。

这些设计时的Attribute时很重要的,如果使用的好,将会对用户的使用带来很大的便利。

这一章我主要介绍了设计时的Attribute,接下来的文章我将通过代码来介绍这些Attribute。WinForm控件开发总结(四)-----控件属性的串行化

前一篇文章介绍了常用的设计时Attribute。其中BrowsableAttribute,CategoryAttri bute,DescriptionAttribute,DefaultPropertyAttribute,DefaultEventAttribute都是比较简单的,也是可有可无,但是为了提供更好的用户体验这些Attribute最好不要省掉,如果你对这些Attribute还不熟悉,可以参考我前一篇文章的描述或者查看MSDN,这里我就不在赘述了。

下来我们主要介绍一下DesignerSerializationVisibilityAttribute和TypeConverterA ttribute。

DesignerSerializationVisibilityAttribute的功能是指示一个属性是否串行化和如何串行化,它的值是一个枚举,一共有三种类型Content,Hidden,Visible。Content指示代码生成器为对象包含的内容生成代码,而不是为对象本身,Hidden指示代码生成器不为对象生成代码,visible指示代码生成器为对象生成代码。假如你的控件有一个集合属性,又想在设计时自动将集合属性的内容生成代码,那么就使用这个Attribute,并将值设为DesignerSerializa tionVisibility.Content。

TypeConverterAttribute的作用就更大一些,也稍微复杂一些。TypeConverterAttrib ute主要的目的是为属性指定一个类型转换器,这个转化器可以将属性的值转换城其它的类型。. NET框架已经为大部分常用的类型都提供了类型转换器,比如Color就有ColorConverter,

枚举类型就有EnumConverter,等等,所以一般情况下你没有必要写类型转换器,如果你的属性的特殊的类型或者自定义的类型那么就必须要写了。类型转换器都是从https://www.doczj.com/doc/bb12773498.html,pon entModel.TypeConverter派生出来的,你需要重写其中的一些方法来达到转换的目的,在我们开发的过程中,其实只关心属性的值如何转换成字符串(因为属性的值需要在属性浏览器里显示出来,属性浏览器里显示的都是字符串)和源代码(需要自动为属性的值生成源代码以实现持久化),当然反过来,也要将字符串和源代码转换成属性的值。另外使用TypeConverter也可以实现子属性,让属性的子属性也显示在属性浏览器里,并且可以折叠。

接下来我就写一个简单的控件来演示一下这个控件。代码如下:

using System;

using System.Collections.Generic;

using System.Text;

using System.Windows.Forms;

using System.Drawing;

using https://www.doczj.com/doc/bb12773498.html,ponentModel;

using System.Collections;

namespace CustomControlSample

{

public class MyListControl:System.Windows.Forms.Control

{

private List _list = new List();

public MyListControl()

{

}

[Browsable(true)]

public List Item

{

get

{

return _list;

}

set

{

_list = value;

}

}

protected override void OnPaint(PaintEventArgs e)

{

base.OnPaint(e);

Graphics g = e.Graphics;

//绘制控件的边框

g.DrawRectangle(Pens.Black,new Rectangle(Point.Empty,new Size(Size. Width-1,Size.Height-1)));

for (Int32 i = 0; i < _list.Count; i++)

{

g.DrawString(_list[i].ToString(), Font, Brushes.Black,1, i * FontHeigh t);

}

}

}

}

我创建了一个简单的List控件,将用户输入的数据显示在控件中,效果图如下:

在这个控件中,我声明了一个集合属性Item供用户输入要显示的整型数值。我们按照W inForm控件制作教程(二)中的方法将控件加到ToolBox里,然后拖到Form设计器中,然后选中控件,在属性浏览中查看控件的属性,属性中有一个Item的属性,属性右边的值显示为Collection,当你点击这个值的时候,值的右边出现一个小按钮,点击这个小按钮,就会出现弹出一个Collection Editor窗口,你可以在在这个编辑器里添加你想显示的整型值,如图:

添加完以后,关闭Collection Editor。现在我们看看Form设计器为我们生成了什么代码。对于用户在Form设计器中设计的内容,设计器的代码生成器会将代码生成到窗口类的Initi alizeComponent()方法中,对于vs2005来说,这个方法位于***.Designer.cs文件中,在我当前的工程中位于Form1.Designer.cs文件中。在solution浏览器中双击打开这个文件,看看Form设计器为我们生成了什么代码:

//

// myListControl1

//

this.myListControl1.BackColor = System.Drawing.SystemColors.ActiveCaptionText;

this.myListControl1.Item = ((System.Collections.Generic.List)(resources.GetObject("m yListControl1.Item")));

this.myListControl1.Location = new System.Drawing.Point(12, 34);

https://www.doczj.com/doc/bb12773498.html, = "myListControl1";

this.myListControl1.Size = new System.Drawing.Size(220, 180);

this.myListControl1.TabIndex = 1;

this.myListControl1.Text = "myListControl1";

设计器将Item的内容串行化到了资源文件里。现在我们修改控件的代码,让设计器将Item 的内容串行化到源代码里。我们为Item属性添加DesignerSerializationVisibilityAttribute,代码片断如下:

[Browsable(true)]

[DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Content)] public List Item

{

get

{

return _list;

}

set

{

_list = value;

}

}

编辑完以后,Build控件工程,回到测试工程里,将Item属性里的值,删掉重新添加,添加完以后,我们再来看看设计器生成的代码:

//

// myListControl1

this.myListControl1.BackColor = System.Drawing.SystemColors.ActiveCaptionText;

this.myListControl1.Item.Add(1);

this.myListControl1.Item.Add(2);

this.myListControl1.Item.Add(3);

this.myListControl1.Item.Add(6);

this.myListControl1.Item.Add(8);

this.myListControl1.Item.Add(9);

this.myListControl1.Location = new System.Drawing.Point(12, 34);

https://www.doczj.com/doc/bb12773498.html, = "myListControl1";

this.myListControl1.Size = new System.Drawing.Size(220, 180);

this.myListControl1.TabIndex = 1;

this.myListControl1.Text = "myListControl1";

现在设计器将Item的内容串行化到源代码里了。

时间有限,今天就写到这里,下一篇文章我来介绍TypeConverterAttribute。WinForm控件开发总结(五)-----为控件的复杂属性提供类型转换器

上一篇文章我已经介绍了TypeConverterAttribute元数据的作用,本文将通过代码向你展示具体的实现。在这个例子中,我要给控件添加一个复杂的属性,这个属性对这个控件没有什么功用,纯粹是为了演示,有些牵强附会了。

现在在前一篇文章中的创建的控件代码中添加一个Scope属性:

[Browsable(true)]

public Scope Scope

{

get

{

return _scope;

set

{

_scope = value;

}

}

这个属性的类型是Scope类,代码如下:public class Scope

{

private Int32 _min;

private Int32 _max;

public Scope()

{

}

public Scope(Int32 min, Int32 max)

{

_min = min;

_max = max;

}

[Browsable(true)]

public Int32 Min

{

get

{

return _min;

}

set

{

_min = value;

}

}

[Browsable(true)]

public Int32 Max

{

get

{

return _max;

}

set

{

_max = value;

}

}

}

添加完属性后,build控件工程,然后在测试的工程里选中添加的控件,然后在属性浏览器里观察它的属性,发现Scope属性是灰的,不能编辑。前一篇文章提到了,在属性浏览器里可以编辑的属性都是有类型转换器的,而.NET框架为基本的类型和常用的类型都提供了默认的类型转换器。接下来我们为Scope类添加一个类型转换器,以便这个属性能够被编

辑,而且也可以在源代码文件里自动生成相应的代码。下面是类型转换器的代码:

public class ScopeConverter : TypeConverter

{

public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) {

if (sourceType == typeof(String)) return true;

return base.CanConvertFrom(context, sourceType);

}

public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) {

if (destinationType == typeof(String)) return true;

if (destinationType == typeof(InstanceDescriptor)) return true;

return base.CanConvertTo(context, destinationType);

}

public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.Cultur eInfo culture, object value, Type destinationType)

{

String result = "";

if (destinationType == typeof(String))

{

Scope scope = (Scope)value;

result = scope.Min.ToString()+"," + scope.Max.ToString();

return result;

}

if (destinationType == typeof(InstanceDescriptor))

{

ConstructorInfo ci = typeof(Scope).GetConstructor(new Type[] {typeof(Int32),typeof(Int 32) });

Scope scope = (Scope)value;

return new InstanceDescriptor(ci, new object[] { scope.Min,scope.Max });

}

return base.ConvertTo(context, culture, value, destinationType);

}

public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.Cul tureInfo culture, object value)

{

if (value is string)

{

String[] v = ((String)value).Split(',');

if (v.GetLength(0) != 2)

{

throw new ArgumentException("Invalid parameter format");

}

Scope csf = new Scope();

csf.Min = Convert.ToInt32(v[0]);

csf.Max = Convert.ToInt32(v[1]);

return csf;

}

return base.ConvertFrom(context, culture, value);

}

}

现在我们为类型提供类型转换器,我们在类型前面添加一个TypeConverterAttribute,如下:

[TypeConverter(typeof(ScopeConverter))]

public class Scope

添加完以后build工程,然后切换到测试工程,选中控件,在属性浏览器里查看属性,现在的Scope属性可以编辑了,如下图所示:

我们修改默认的值,然后看看Form设计器为我们生成了什么代码:

this.myListControl1.BackColor = System.Drawing.SystemColors.ActiveCaptionText;

this.myListControl1.Item.Add(1);

this.myListControl1.Item.Add(2);

this.myListControl1.Item.Add(3);

this.myListControl1.Item.Add(6);

this.myListControl1.Item.Add(8);

this.myListControl1.Item.Add(9);

this.myListControl1.Location = new System.Drawing.Point(12, 34);

https://www.doczj.com/doc/bb12773498.html, = "myListControl1";

this.myListControl1.Scope = new CustomControlSample.Scope(10, 200);

this.myListControl1.Size = new System.Drawing.Size(220, 180);

this.myListControl1.TabIndex = 1;

this.myListControl1.Text = "myListControl1";

关键是这一行this.myListControl1.Scope = new CustomControlSample.Scope(10, 200),Scope类的类型转换器为属性提供了实例化的代码。

WinForm控件开发总结(六)-----控件属性类型转换器代码详解

在上一篇文章,我为控件添加一个一个复杂属性,并且为这个属性的类型的编写了一个类型转换器,现在我们来看看这个类型转换器的代码,并解释一下这些代码的意义。

要实现一个类型转换器,我们必须要重写(override)四个方法:

CanConvertFrom()――根据类型参数进行测试,判断是否能从这个类型转换成当前类型,在本例中我们只提供转换string和InstanceDescriptor类型的能力。

CanConvertTo()――根据类型参数进行测试,判断是否能从当前类型转换成指定的类型。

ConvertTo()――将参数value的值转换为指定的类型。

ConvertFrom()――串换参数value,并返回但书类型的一个对象。

public override object ConvertTo(ITypeDescriptorContext context, System.Glob alization.CultureInfo culture, object value, Type destinationType)

{

String result = "";

if (destinationType == typeof(String))

{

Scope scope = (Scope)value;

result = scope.Min.ToString()+"," + scope.Max.ToString();

return result;

}

if (destinationType == typeof(InstanceDescriptor))

{

ConstructorInfo ci = typeof(Scope).GetConstructor(new Type[] {ty peof(Int32),typeof(Int32) });

Scope scope = (Scope)value;

return new InstanceDescriptor(ci, new object[] { scope.Min,scope. Max });

}

return base.ConvertTo(context, culture, value, destinationType);

}

上面是ConvertTo的实现,如果转换的目标类型是string,我将Scope的两个属性转换成string类型,并且用一个“,”连接起来,这就是我们在属性浏览器里看到的表现形式,如图:

如果转换的目标类型是实例描述器(InstanceDescriptor,它负责生成实例化的代码),我们需要构造一个实例描述器,构造实例描述器的时候,我们要利用反射机制获得Scope类的构造器信息,并在new的时候传入Scope实例的两个属性值。实例描述器会为我们生成这样的代码:this.myListControl1.Scope = new CustomControlSample.Scope(10, 200);在最后不要忘记调用 base.ConvertTo(context, culture, value, destinationType),你不需要处理的转换类型,交给基类去做好了。

C# WinForm自定义控件开发实例

C# WinForm自定义控件开发实例 最近做一个图象的采集,需要一个图形的选择控件,但是在.net下没有类似vb中的shape控件,所以考虑了自己写一个控件。下面我将从头创建控件,这个控件主要是用来选择图形的Rectangle,有一下几个属性Color BorderColor:边框颜色,Color BackColor:背景颜色,bool ReSizeble:是否可移动,Rectangle SelectRectangle:选择区域。 打开vs2003(我用的这个版本),新建一个c#控件库,ok,拷贝如下代码到你的代码里。using System;using System.Collections;using https://www.doczj.com/doc/bb12773498.html,ponentModel;using System.Drawing;using System.Data;using System.Windows.Forms;namespace WindowsExtendedControls{ /// /// 控件/// public class ShapeEx : System.Windows.Forms.Control { /// /// 必需的设计器变量。/// /// private Color _BorderColor=new Color(); private Color _BackColor=new Color(); private bool _ReSizeble; private Point _SelfLocation=new Point(); private Point _MouseLocation=new Point(); private int _SelfWidth; private int _SelfHeight; private int _SelectSelctedIndex;//0-8,0:SizeAll private Rectangle

WinForm控件开发基础教程四控件属性

WinForm控件开发基础教程四控件属性 前一篇文章介绍了常用的设计时Attribute。其中BrowsableAttribute,CategoryAttribute,DescriptionAttribute,DefaultPropertyAttribute,DefaultEventAttribute都是比较简单的,也是可有可无,但是为了提供更好的用户体验这些Attribute最好不要省掉,如果你对这些Attribute还不熟悉,可以参考我前一篇文章的描述或者查看MSDN,这里我就不在赘述了。下来我们主要介绍一下DesignerSerializationVisibilityAttribute和TypeConverterAttribute。 DesignerSerializationVisibilityAttribute的功能是指示一个属性是否串行化和如何串行化,它的值是一个枚举,一共有三种类型Content,Hidden,Visible。Content指示代码生成器为对象包含的内容生成代码,而不是为对象本身,Hidden指示代码生成器不为对象生成代码,visible指示代码生成器为对象生成代码。假如你的控件有一个集合属性,又想在设计时自动将集合属性的内容生成代码,那么就使用这个Attribute,并将值设为DesignerSerializationVisibility.Content。 TypeConverterAttribute的作用就更大一些,也稍微复杂一些。TypeConverterAttribute主要的目的是为属性指定一个类型转换器,这个转化器可以将属性的值转换城其它的类型。.NET 框架已经为大部分常用的类型都提供了类型转换器,比如Color就有ColorConverter,枚举类型就有EnumConverter,等等,所以一般情况下你没有必要写类型转换器,如果你的属性的特殊的类型或者自定义的类型那么就必须要写了。类型转换器都是从https://www.doczj.com/doc/bb12773498.html,ponentModel.TypeConverter派生出来的,你需要重写其中的一些方法来达到转换的目的,在我们开发的过程中,其实只关心属性的值如何转换成字符串(因为属性的值需要在属性浏览器里显示出来,属性浏览器里显示的都是字符串)和源代码(需要自动为属性的值生成源代码以实现持久化),当然反过来,也要将字符串和源代码转换成属性的值。另外使用TypeConverter也可以实现子属性,让属性的子属性也显示在属性浏览器里,并且可以折叠。 接下来我就写一个简单的控件来演示一下这个控件。代码如下: using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using System.Drawing; using https://www.doczj.com/doc/bb12773498.html,ponentModel; using System.Collections; namespace CustomControlSample { public class MyListControl:System.Windows.Forms.Control { private List_list=new List(); public MyListControl()

C# WinForm窗体及其控件的自适应

C# WinForm窗体及其控件的自适应 C# WinForm窗体及其控件自适应各种屏幕分辨率 一。说明 我们自己编写程序的界面,会遇到各种屏幕分辨率,只有自适应才能显的美观。实际上,做到这点也很简单,就是首先记录窗体和它上面控件的初始位置和大小,当窗体改变比例时,其控件的位置和大小也按此比例变化即可。因为窗体上控件的位置和大小是相对于自己所在的窗体的,也就是所谓的窗口坐标。 在这里我们只考虑相对于自己窗体的窗口坐标更简单,也就是成比例变化。为了多个窗体共用,我在这里创建一个类AutoSizeFormClass ,1.使用它去记录窗体和其控件的初始位置和大小,2.根据窗体变化了的大小,成比例地实现其控件的水平和垂直方向的变化,也就是自适应。 二。使用方法 使用方法很简单, 1.把自适应的类整体复制到你的工程命名空间里, 然后在需要自适应的窗体中做3步即可: 2.声明自适应类实例。 3.为窗体添加Load事件,并在其方法Form1_Load中,调用类的初始化方法,记录窗体和其控件初始位置和大小 4.为窗体添加SizeChanged事件,并在其方法Form1_SizeChanged中,调用类的自适应方法,完成自适应 三。完整代码如下: (一)。自适应窗体的代码: using System; using System.Collections.Generic;

using https://www.doczj.com/doc/bb12773498.html,ponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace WindowsApplication1 { public partial class Form1 : Form { //1.声明自适应类实例 AutoSizeFormClass asc = new AutoSizeFormClass(); public Form1() { InitializeComponent(); } //2. 为窗体添加Load事件,并在其方法Form1_Load中,调用类的初始化方法,记录窗体和其控件的初始位置和大小 private void Form1_Load(object sender, EventArgs e) { asc.controllInitializeSize(this); } //3.为窗体添加SizeChanged事件,并在其方法Form1_SizeChanged中,调用类的自适应方法,完成自适应 private void Form1_SizeChanged(object sender, EventArgs e) { asc.controlAutoSize(this); } } }

winform窗体和控件自适应

有时winform窗体的大小会改变,此时窗体上的控件会很混乱,如何可以使控件自适应窗体呢?以 下就是方法: 1、首先在自己的命名空间里先建一个Autosize.cs类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; namespace 自己的命名空间 { class Autosize { public void setTag(Control cons) { foreach (Control con in cons.Controls) { con.Tag = con.Width + ":" + con.Height + ":" + con.Left + ":" + con.Top + ":" + con.Font.Size; if (con.Controls.Count > 0) setTag(con); } } string[] mytag; public void setControls(float newx, float newy, Control cons) { foreach (Control con in cons.Controls) { if (con.Tag != null) { mytag = con.Tag.ToString().Split(new char[] { ':' }); float a = Convert.ToSingle(mytag[0]) * newx; con.Width = (int)a; a = Convert.ToSingle(mytag[1]) * newy; con.Height = (int)(a); a = Convert.ToSingle(mytag[2]) * newx; con.Left = (int)(a); a = Convert.ToSingle(mytag[3]) * newy; con.Top = (int)(a); Single currentSize = Convert.ToSingle(mytag[4]) * Math.Min(newx, newy); }

如何在WPF中使用Windows Form控件

如何在WPF中使用Windows Form控件 由于WPF中没有没有DateTimePicker控件,网上有人写的又不太好用,而在WinForm中有此控件,因此想到了从.net中借用此控件。 首先,我们需要向项目中的引用(reference)中添加两个动态库dll,一个是.NET库中的System.Windows.Forms,另外一个是WindowsFormsIntegration。组件不好找,排一下序就比较容易了。

添加完两个动态dll以后,就可以在控件库中找到WindowsFormsHost这个控件了。这个控件是我们添加Windows Form控件的基础。跟别的其他的控件一样,它也是可控的,可以自定义它在窗口中的位置、控件大小颜色等属性。 将这个控件放入窗体,放置完以后在xmal代码中会自动生成相应代码: 然后,需要在xmal的开始处添加两行代码 xmlns:WinFormHost="clr-namespace:System.Windows.Forms.Integration;assembly=W indowsFormsIntegration" xmlns:WinFormControls="clr-namespace:System.Windows.Forms;assembly=System.Wi ndows.Forms"

WinForm界面布局

WinForm界面布局 Dock&Anchor Dock和Anchor是水火不容的,同时给控件设置Dock和Anchor属性时后设置的会覆盖前面的设置。 Dock 我初接触WinForm的时候发现控件的Width和Height只能是int,不能设置为百分比,那个时候就想子控件如何跟着父控件而变化呢?父控件变大就变大,而且还填满那个区域。甚至以为这个需要通过代码来解决,如是在SizeChanged事件里…… 后来才发现我要的就是Dock给的,Dock是停靠的意思。Dock属性的类型是DockStyle枚举: 1:public enum DockStyle 2:{ 3:None=0, 4:Top=1, 5:Bottom=2, 6:Left=3, 7:Right=4, 8:Fill=5 9:} 默认是None,当为Left的时,就表示子控件停靠在父控件的左边区域,并把左区域填充满: 上图中的Panel总是会停靠在Form的左边区域,不管如何调整Form的高度,它总是能把左边区域填满。Dock麻烦的地方在于多个控件碰到一起时,比如有两个Panel都设置为Left 该怎么办?我们会发现向父控件的Controls集合中添加子控件,越晚添加具有更高的“优先级”(不知道有没有这个说法,这是我杜撰的)。这里的优先级指的是,子控件“优先级”越高,

越靠近父控件边缘,其他子控件就得避让: [我的见解;通过选中控件,一般是pannel,右键选择置为底层,来决定控件间的优先级] this.Controls.Add(this.panel1); this.Controls.Add(this.panel2); Panel2后添加进去,所以它具有更高的优先级,更靠近Form的边缘。这个规则不仅仅对于Dock都设为Left的有效,对Dock属性不同,但是碰到一起的子控件也适用: 1:this.panel1.Dock=DockStyle.Left; 2:this.panel2.Dock=DockStyle.Left; 3:this.panel3.Dock=DockStyle.Top; 4: 5:this.Controls.Add(this.panel1); 6:this.Controls.Add(this.panel2); 7:this.Controls.Add(this.panel3); panel3的Dock设置为Top,最后添加到Controls集合中,所以具有最高的优先级,其他两个panel都得避让:

Winform常用控件

1.数据显示:DataGridView(DataGridView 控件提供用来显示数据的可自定义表。使用 DataGridView 类,可以自定义单元格、行、列和边框)。 文本编辑:TextBox(显示设计时输入的文本,它可由用户在运行时编辑或以编程方式更改)。 RichTextBox(使文本能够以纯文本或 RTF 格式显示)。MaskedTextBox(约束用户输入的格式)。 2.信息显示:Label(显示用户无法直接编辑的文本)。LinkLabel(将文本显示为 Web 样式的链接,并在用户单击该特殊文本时触发事件。该文本通常是到另一个窗口或网站的链接)。 StatusStrip(通常在父窗体的底部使用有框架的区域显示有关应用程序的当前状态的信息)。ProgressBar(向用户显示操作的当前进度)。 3.从列表中选择:CheckedListBox(显示一个可滚动的项列表,每项旁边都有一个复选框)。 ComboBox(显示一个下拉式项列表)。DomainUpDown(显示用户可用向上和向下按钮滚动的文本项列表)。ListBox(显示一个文本项和图形项(图标)列表)。ListView(在四个不同视图之一中显示项。这些视图包括纯文本视图、带有小图标的文本视图、带有大图标的文本视图和详细信息视图)。NumericUpDown(显示用户可用向上和向下按钮滚动的数字列表)。TreeView (显示一个节点对象的分层集合,这些节点对象由带有可选复选框或图标的文本组成)。 4.图形显示:PictureBox(在一个框架中显示图形文件(如位图和图标)。 5.图形存储:ImageList(充当图像储存库。ImageList 控件和及其包含的图像可以在不同的应用程序中重用)。 6.值的设置:CheckBox(显示一个复选框和一个文本标签。通常用来设置选项)。CheckedListBox(显示一个可滚动的项列表,每项旁边都有一个复选框)。RadioButton(显示一个可打开或关闭的按钮)。TrackBar(允许用户通过沿标尺移动“滚动块”来设置标尺上的值)。 7.数据的设置:DateTimePicker(显示一个图形日历以允许用户选择日期或时间)。MonthCalendar(显示一个图形日历以允许用户选择日期范围)。 8.对话框:ColorDialog(显示允许用户设置界面元素的颜色的颜色选择器对话框) ColorDialog 显示允许用户设置界面元素的颜色的颜色选择器对话框。 FontDialog 显示允许用户设置字体及其属性的对话框。 OpenFileDialog 显示允许用户定位文件和选择文件的对话框。 PrintDialog 显示允许用户选择打印机并设置其属性的对话框。 PrintPreviewDialog 显示一个对话框,该对话框显示 PrintDocument 组件在打印出来后的外观。 FolderBrowserDialog 显示用来浏览、创建以及最终选择文件夹的对话框SaveFileDialog 显示允许用户保存文件的对话框。 9.菜单控件: MenuStrip 创建自定义菜单 ContextMenuStrip Bitmap 创建自定义上下文菜单。 10.命令: Button Bitmap 启动、停止或中断进程。 LinkLabel 将文本显示为 Web 样式的链接,并在用户单击该特殊文本时触发事件。该文本通常是到另一个窗口或网站的链接。 NotifyIcon 在表示正在后台运行的应用程序的任务栏的状态通知区域中显示一个图标。

C#制作WinForm用户自定义控件实例教程

C#制作WinForm用户自定义控件实例教程 本文将教大家如何使用C#开发WinForm用户自定义控件,自定义控件有好多好处,下面请跟本文一同来学习下吧。 .Nt用户自定义控件继承UserControl类,设计很简单的,像平时在窗体上拖控件一样。 操作步骤: 1. 建立一个工程,添加用户控件。 2.在打开的窗体内输入控件名称,如:"ucButton",按确定按钮。接下来在空白区域拖放3个.Net控件。 如下图:

3.代码 C# code ///

/// C#.Net 设计用户自定义控件 /// /// [ToolboxBitmap(typeof(CustomControl.ucButton), "ucButton.bmp")] public partial class ucButton : UserControl { private bool _IsFocused = false; //标记按钮是否为焦点状态 public ucButton() { InitializeComponent(); this.DoHideFocusedTag(); this.MyCatpionText = https://www.doczj.com/doc/bb12773498.html,; } private EventHandler _OnButtonClick = null; private string _MyCatpionText = "ucButton1"; /// /// 按钮标题 /// [EditorBrowsable(EditorBrowsableState.Always)] [Browsable(true)] [DefaultValue("ucButton1")] public string MyCatpionText { get { return _MyCatpionText; } set { _MyCatpionText = value; lblCaption.Text = _MyCatpionText; } } /// /// 用户自定义Click事件 /// [EditorBrowsable(EditorBrowsableState.Always)] [Browsable(true)] public event EventHandler OnButtonClick { add { _OnButtonClick = new EventHandler(value); } remove { _OnButtonClick -= new EventHandler(value); } } private void lblCaption_Click(object sender, EventArgs e) { //转移Click事件, 触发用户自定义事件 if (_OnButtonClick != null) _OnButtonClick(this, e); } private void lblCaption_MouseDown(object sender, MouseEventArgs e) { if (_IsFocused) { lblCaption.Font = new Font(lblCaption.Font.FontFamily, lblCaption.Font.Size, FontStyle.Bold); } } private void lblCaption_MouseUp(object sender, MouseEventArgs e) { if (_IsFocused) { lblCaption.Font = new Font(lblCaption.Font.FontFamily, lblCaption.Font.Size, FontStyle.Regular); } } private void ucButton_SizeChanged(object sender, EventArgs e) { lblUnderLine.Top = this.Height - 1; lblUnderLine.Width = this.Width - 15; } /// /// 还原按钮状态 /// public void DoHideFocusedTag() { this.pictureBox1.Image = global::vjsdn.CustomControl.Properties.Resources.GrayTag; this.lblUnderLine.Visible = false; lblCaption.ForeColor = Color.Black; } /// /// 设计按钮为焦点状态 /// public void DoShowFocusedTag() { this.pictureBox1.Image =

使用C#开发数据库应用系统(Winform及相关的控件)

第一章初识windows程序 对于winform窗体的相关解释: Form.cs:窗体文件,程序员对窗体编写的代码一般都放在这个文件中; Form.Designer.cs:窗体设计文件,其中的代码是由Visual Studio自动生成的, 一般不需要修改; Form.resx:资源文件,用来配置当前窗体所使用的字符串、图片等资源; Program.cs:主程序文件,其中包括程序入口的main方法; Winform应用窗体文件有两种编辑视图:窗体设计器(进行窗体界面设计,拖放控件等的操作)和代码编辑器。 在代码编辑器中,窗体类的前面多了一个partial,partial是部分的意思,为了方便对代码的管理和编辑,可以使用partial关键字将同一个类的 代码分开放在多个文件中,每个文件都是类的一部分代码,叫做分布 类; 窗体都继承自From类,下面显示的是窗体的主要属性和方法: 属性:说明 Name 窗体对象的名称 BackColor 窗体背景色 BackgroundImage 窗体背景图 FormBorderStyle 窗体显示的边框样式, 七值可选,默认SizaBle ShowInTaskbar 确定窗体是否出现在 windouws任务中,默认true Text 显示文本 TopMost 指示次窗体是否始终显示在 此属性未设置为True的所有窗体 之上 windowState 确定窗体的初始化可视状 态,(normal, Maximized,Minimized,默认为 Normal) 方法说明 Close 关闭 Show 显示窗体

ShowDialog 模式化显示窗体 Hide 隐藏窗体 如果不希望窗体运行后,用户通过鼠标拖拽改变窗体大小,在设计 窗体时可将窗体的FormBorderStyle设置为FixedSingle 使用窗体的show()和Hide()属性来设置窗体的显示和隐藏; 基本控件: Lable:使用他对窗体上的其他控件进行说明和注释;其主要属性是 image(在标签上显示的图像)和text; TextBox:获取用户输入的信息或是显示的信息其主要属性有:MaxLenth:指定可以在文本框中输入的组大字符串(输入数) Multiline:可在文本框中输入多行文本(true or false) PasswordChar:指示在作为密码框时,文本框中显示的字符(而不是实际输入的,只有密码框有此项) ReadOnly(是否允许编辑文本框的文本) Text:与文本框关联的文本 ComboBox:允许用户在组合框内输入文本或从列表中进行选择, 属性: Items:组合框中的项 Item:检索集合中指定索引的项 Count:获得集合中项的数目 isReadOnly:能否修改 DropDowmStyle:组合框的风格,是否允许客户编辑, Text:文本 SelectedIndex:当前选定的索引号,列表中每一项都有 索引,0开始 SelectedItem:获取当前选定的项 方法: add()向组合框中的项列表中添加项 Clear()从组合框中移除所有的项 Remove()从组合框中移除指定项

Winform常用控件的常用属性

常用控件的常用属性 长用 Name :表示一个控件或者窗体的名称。 Anchor:表示窗体拉大后控件会随这窗体的4个方向随之变化。 BackColor:控件和窗体的背景颜色。 BackgroundImage:窗体的背景图片。 Cursor:鼠标经过控件时,鼠标的图标所发生的变化。 ContextMenuStrip:鼠标单击右键,所出先的菜单。 Dock:表示该控件在窗体的那个位置的停靠。 Enabled:表示该控件是否有用默认值Ture 。选False该控件则没有任何作用。 Font:设置控件里字体的大小、字号、字体、和下划线。 ForeColor:在控件里输入字体时,字体的颜色。(默认值为黑色)。 Location:表示该控件在窗体中的位置。X坐标数值越大则控件会越往右,Y坐标数值越大则控件越往下。 Size:该控件的大小width 表示控件的宽度heigth表示控件的高度。 Visible:是否隐藏该控件。选False控件是看不见的。 Tag: Text:控件上显示的字体。 Form窗体 ControlBox:表示窗体的标题栏中时候有最大化、最小化和关闭的按钮选false则不会看见这些按钮。 FormBorderStyle:表示窗体的边框线的样式和标题栏的样式和标题栏按钮显示方式。 Icon:窗体标题栏左边显示的图片。 MaximizeBox:确认标题栏里是否有最大化按钮。 MinimizeBox:确认标题栏里是否有最小化按钮。 StartPosition:运行窗体时窗体在屏幕前在那个位置显示。 WindowState:运行窗体时,窗体的显示方式(比如全屏幕显示、最小化显示、正常显示)。 Label标签 BorderStyle:表示该标签的边框样式。 Image:在该标签上显示的图片。 ImageAlign:要显示图片以什么方式在标签的背景上显示。 ImageList: TextBox文本框 BorderStyle:表示该文本框的边框样式。 MaxLength:可以输入多少个字符。 MultiLine:是否可以拉大文本框的高度。 PasswordChar:你输入文本框的字体是以什么方式进行显示的。(比如输入¥就全部都显示¥)。

C# 实现Winform控件dataGridView的打印与分页

本文档是参考网上的资料,稍加修改,经过实际编译,可实现Winform上dataGridView控件的打印,并实现分页,下面为程序代码,仅供参考。本程序不需要在界面上添加任何打印相关控件。 public partial class Example : Form { //打印文檔 PrintDocument pdDocument = new PrintDocument(); //打印格式設置頁面 PageSetupDialog dlgPageSetup = new PageSetupDialog(); //打印頁面 PrintDialog dlgPrint = new PrintDialog(); //實例化打印預覽 PrintPreviewDialog dlgPrintPreview = new PrintPreviewDialog(); public Example() { InitializeComponent(); pdDocument.PrintPage += new PrintPageEventHandler(OnPrintPage); //頁面設置的打印文檔設置為需要打印的文檔 dlgPageSetup.Document = pdDocument; //打印界面的打印文檔設置為被打印文檔 dlgPrint.Document = pdDocument; //打印預覽的打印文檔設置為被打印文檔 dlgPrintPreview.Document = pdDocument; } ///

/// //顯示打印預覽界面,此处需要添加一个打印预览的按钮 /// /// /// private void btnPrintView_Click(object sender, EventArgs e) { dlgPrintPreview.ShowDialog(); }

winform中控件的自适应

好久没有写文章了,每次当自己用到一些自己不是很擅长或者没接触的技术,都会做一个总结。好,废话少说。切入正题。 在winform中,有时候会程序遇到分辨率的问题,每台电脑都有不同的显示分辨率,有些人喜欢把程序调到最大化或者随意的拉拽,那窗体上的控件就应该跟随着做一些相应的调整,其实实现并不难。有些控件可能直接设置它的Anchor,Dock,SizeMode等属性来进行调整,像pictureBox这种控件可以通过设置它的Anchor属性为Top,Buttom,Left,Right.然后在设置它的SizeMode为strethImage,就可以实现跟随窗体进行不同的调整,像有一些第三方控件或者像lable中字体等不太好去控制,那应该怎样做呢,其实所有的控件最好还是按照窗体的具体比例来进行调整最好,不多说了,直接上代码,具体如下: 首先创建一个windows窗体应用程序,我这里把它命名为:frm_demo 再创建一个处理控件按照相应比例变化的类:我把它命名为:Autosize using System; using System.Collections.Generic; using https://www.doczj.com/doc/bb12773498.html,ponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; public class Autosize { public void setTag(Control cons) { foreach (Control con in cons.Controls) { con.Tag = con.Width + ":"+ con.Height + ":"+ con.Left + ":"+ con.Top + ":" + con.Font.Size; if (con.Controls.Count > 0) setTag(con); } } public void setControls(float newx, float newy, Control cons) { foreach (Control con in cons.Controls) { string[] mytag = con.Tag.ToString().Split(new char[] { ':' }); float a = Convert.ToSingle(mytag[0]) * newx; con.Width = (int)a; a = Convert.ToSingle(mytag[1]) * newy; con.Height = (int)(a); a = Convert.ToSingle(mytag[2]) * newx;

winform 分页控件经典

winform 分页控件 以前都是从事B/S开发,由于公司有个比较大的C/S项目,在使用DATAGRIDVIEW的时候,显示数据量比较大,所以才用分页模式,也不知道这样是否正确。 想找个C/S下面的分页控件,都没有什么好的,就自己跟B/S下的分页控件,修改成WINFORM 下面的。 首先创建一个用户控件名称为pager,在控件中拖入bindingNavigator和bindingSource,修改bindingNavigator,加入必要的一些控件。 效果如下: 代码实现如下: namespace WindowsApp.MyControl { ///

///申明委托 /// /// /// public delegate int EventPagingHandler(EventPagingArg e); /// ///分页控件呈现 /// public partial class Pager : UserControl { public Pager() { InitializeComponent(); }

public event EventPagingHandler EventPaging; ///

///每页显示记录数 /// private int _pageSize = 20; /// ///每页显示记录数 /// public int PageSize { get { return _pageSize; } set { _pageSize = value; GetPageCount(); } } private int _nMax = 0; /// ///总记录数 /// public int NMax { get { return _nMax; } set { _nMax = value; GetPageCount(); } }

winform自定义控件开发

自定义控件开发 一般而言,Visual Studio 2005中自带的几十种控件已经足够我们使用了,但是,在一些特殊的需求中,可能需要一些特殊的控件来与用户进行交互,这时,就需要我们自己开发新的、满足用户需求的控件。 要开发自己的控件,有几种方法: ?复合控件(Composite Controls):将现有的各种控件组合起来,形成一个新的控件,来满足用户的需求。 ?扩展控件(Extended Controls):就是在现有的控件基础上,派生出一个新的控件,增加新的功能,或者修改原有功能,来满足用户需求。 ?自定义控件(Custom Controls):就是直接从System.Windows.Forms.Control 类派生,也就是说完全由自己来设计、实现一个全新的控件,这是最灵活、最强大的方法,但是,对开发者的要求也是最高的。要实现一个自定义控件,必须为Control类的的OnPaint事件编写代码,在OnPaint事件中实现自定义控件的绘制工作。同时,还可以重写Control类的WndProc方法,来处理底层的Windows消息。所以说,要实现一个自定义控件,对开发者的要求较高,要求开发者必须了解GDI+和Windows API的知识。 下面我们就分别给大家介绍这三种方法。 ?复合控件(Composite Controls) 复合控件实际上是控件的集合,类似于堆积木。因此,可以按照用户的需求,把VS 2005工具箱中的控件任意组合起来,形成一个复合控件。在以后使用中,将生成的这个复合控件作为一个控件来对待。 复合控件一般都是从UserControl类派生而来,因此复合控件(用户控件)可以在“UserControl测试容器”中进行测试。 复合控件的创建步骤: 第一步:新建一个Windows控件库项目“CompositeControlDemo”

Winform 控件教案

组合框、选项卡控件和选项卡页面、日期、日历和进度条、滑动条——讲解 按照如下学习目标进行学习: 1、掌握TabControl控件的使用方法包括重要属性,方法和事件的了解。动态生成选项卡,动态为选项卡添加控件。 2、掌握MonthCalender控件的使用。 3、掌握DateTimePicker控件的使用,了解与MonthCalender控件的区别。 4、掌握ComboBox控件的使用,重点掌握其重要方法与重要属性。 第一部分讲解TabControl控件、MonthCalender控件和DateTimePicker控件的的使用。TabControl控件 在这一部分重点让学生了解什么是TabControl,TabControl能做什么。有哪些使用用途引入:我们先来认识一下这个TabControl控件,看看它到底长什么样.

TabContorl概述:Windows 窗体TabControl 显示多个选项卡,这些选项卡类似于笔记 本中的分隔卡和档案柜文件夹中的标签。选项卡中可包含图片和其他控件。您可以使用 该选项卡控件来生成多页对话框,这种对话框在Windows 操作系统中的许多地方(例 如控制面板的“显示”属性中)都可以找到。此外,TabControl 还可以用来创建用于设 置一组相关属性的属性页。 接下来我们看看如何控制TabControl,来让它为我们进行服务。 1)属性介绍: 接下来介绍TabControl中常见的属性,这一部分主要是以控制TabControl 外观和显示特性,主要包括:Alignment、Appearance、HotTrack、Multiline、 1.Alignment控制标签在标签控件的什么位置显示。默认的位置为控件的 顶部。 首先我们来看看TabControl的外观设置,通过Alignment可以控制每一个标签页头的显示顺序。接下来通过编程的方式来设置Alignment属性 来演示效果。 例子: switch(btn.Text) { case"Top": this.tabControl1.Alignment = TabAlignment.Top; break; case"Bottom": this.tabControl1.Alignment = TabAlignment.Bottom; break; case"Left": this.tabControl1.Alignment = TabAlignment.Left; break; case"Right": this.tabControl1.Alignment = TabAlignment.Right; break; default: MessageBox.Show("输入的格式不正确!", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Error); break; } 2.Appearance:控制标签的显示方式。标签可以显示为一般的按钮或带 有平面样式。 刚才展示了如何控制标签页的现实顺序,我们还可以通过Appearance 属性来设置标签页按钮的基本外观。 接下来通过编程的方式来设置TablControl控件来设置外观看看效 果。

WinForm控件开发总结

WinForm控件开发总结(一)------开篇 我本人不是专业的控件开发人员,只是在平常的工作中,需要自己开发一些控件。在自己开发WinForm控件的时候,没有太多可以借鉴的资料,只能盯着MSDN使劲看,还好总算有些收获。现在我会把这些经验陆陆续续的总结出来,写成一系列方章,希望对看到的朋友有所帮助。今天我来开个头。 其实开发WinForm控件并不是很复杂,.NET为我们提供了丰富的底层支持。如果你有M FC或者API图形界面的开发经验,那么学会WinForm控件可能只需要很短的时间就够了。 自己开发的WinForm控件通常有三种类型:复合控件(Composite Controls),扩展控件(Extended Controls),自定义控件(Custom Controls)。 复合控件:将现有的各种控件组合起来,形成一个新的控件,将集中控件的功能集中起来。 扩展控件:在现有控件的控件的基础上派生出一个新的控件,为原有控件增加新的功能或者修改原有控件的控能。 自定义控件:直接从System.Windows.Forms.Control类派生出来。Control类提供控件所需要的所有基本功能,包括键盘和鼠标的事件处理。自定义控件是最灵活最强大的方法,但是对开发者的要求也比较高,你必须为Control类的OnPaint事件写代码,你也可以重写Con trol类的WndProc方法,处理更底层的Windows消息,所以你应该了解GDI+和Windows API。 本系列文章主要介绍自定义控件的开发方法。 控件(可视化的)的基本特征: 1. 可视化。 2. 可以与用户进行交互,比如通过键盘和鼠标。 3. 暴露出一组属性和方法供开发人员使用。 4. 暴露出一组事件供开发人员使用。 5. 控件属性的可持久化。 6. 可发布和可重用。 这些特征是我自己总结出来,不一定准确,或者还有遗漏,但是基本上概括了控件的主要方面。 接下来我们做一个简单的控件来增强一下感性认识。首先启动VS2005创建一个ClassLi

相关主题
文本预览
相关文档 最新文档