C# Use define Controls library spec.doc_第1页
C# Use define Controls library spec.doc_第2页
C# Use define Controls library spec.doc_第3页
C# Use define Controls library spec.doc_第4页
C# Use define Controls library spec.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

CEControls library Develop spec一. C# 自定义控件开发概述基控件类Control 类是 Windows 窗体控件的基类。它提供了在 Windows 窗体应用程序中进行可视显示所需的基础结构。Control 类执行下列任务:1)公开窗口句柄。2)管理消息路由。3)提供鼠标和键盘事件,以及许多其他用户界面事件。4)提供高级布局功能。5)包含特定于可视显示的许多属性,如 ForeColor、BackColor、Height 和 Width。6)为 Windows 窗体控件充当 Microsoft ActiveX控件提供必需的安全和线程支持。 由于基类提供了很多基础结构,使得开发自己的 Windows 窗体控件变得相对简单。控件的种类及适用情况Windows 窗体支持三种用户定义的控件:复合、扩展和自定义。1)复合控件是封装在公共容器内的 Windows 窗体控件的集合。在下列情况下,从 UserControl 类继承:要将若干个 Windows 窗体控件的功能合成一个可重新使用的单元。2)扩展控件是从任何现有的 Windows 窗体控件继承。处于下列情况时继承 Windows 窗体控件:1.大多数所需的功能已经与现有的 Windows 窗体控件相同。2.不需要自定义图形用户界面,或者想为现有控件设计一个新的图形用户界面。3)自定义控件是通过从 Control 继承头开始创建一个控件。Control 类提供控件所需的所有基本功能(包括鼠标和键盘处理事件),但不提供控件特定的功能或图形界面。 若要实现自定义控件,必须编写该控件的 OnPaint 事件的代码,以及所需的任何功能特定的代码。还可以重写 WndProc 方法并直接处理窗口消息。在下列情况下,从 Control 类继承:1.想要提供控件的自定义图形化表示形式。2.需要实现无法从标准控件获得的自定义功能。二. 资源管理图形对象非常昂贵,它们占用很多系统资源,应该仅在需要时才创建图形资源,并在使用完毕后立即将其释放.(Graphics,Brush,Pen,等)所有的资源应尽可能在使用时才创建,使用结束之后手动释放。除非此资源要重复使用。SolidBrush brush3 = new SolidBrush(this.ForeColor);/do something with this brushbrush3.Dispose();1.不包含托管资源时的资源释放 / / Clean up any resources being used. / protected override void Dispose(bool disposing) if (disposing) if (components != null) components.Dispose(); /Release other manage resources base.Dispose(disposing); 2. 包含非托管资源的资源释放 Static Handle for IO handle(打开一次,同步使用)Relay,Modbus,IPCam等。 请参考清理非托管资源 - 实现 Dispose 方法 3.打包资源。如字符串(多语言管理)等三.在“自定义工具箱”对话框中显示控件 1.将控件程序集安装到全局程序集缓存中。有关附加信息,请参见如何:将程序集安装到全局程序集缓存2.修改注册表在 HKEY_LOCAL_MACHINESoftwareMicrosoft.NETFrameworkv2.0.xAssemblyFoldersExPublic Assemblies 处创建注册表项,并将“默认”字符串值设置为您的程序集所在的文件位置。 可以是您希望设置的任何值。 在 Visual Studio .NET 2003 中,此注册表项应该在 HKEY_LOCAL_MACHINESoftwareMicrosoftVisual Studio7.1AssemblyFolders 处创建。在 Visual Studio .NET 2002 中,此注册表项应该在 HKEY_LOCAL_MACHINESoftwareMicrosoft.NETAssemblyFolders 处创建。四.控件要素1.将属性应用于控件的属性Category、Description、Editor、DefaultValue如果属性不具有简单的默认值,则可以为属性提供可选方法 ShouldSerialize 和 Reset。如果属性 (Property) 具有简单的默认值,则应用 DefaultValueAttribute 设计器可使用 ShouldSerializePropertyName 方法来检查属性是否已不再使用其默认值,并仅在属性发生改变的情况下将代码写入到窗体中,从而更有效地生成代码。这两种方法不能同时使用 private Font thefont = null; / The MyFont property. public Font MyFont / Note that the MyFont property never/ returns null.get if (thefont != null) return thefont;if (Parent != null) return Parent.Font;return Control.DefaultFont;set thefont = value; public bool ShouldSerializeMyFont() return thefont != null; public void ResetMyFont() MyFont = null; 2.property-changed 事件如果希望控件在名为 PropertyName 的属性发生更改时发送通知,则请定义一个名为 PropertyNameChanged 的事件以及一个名为 OnPropertyNameChanged 的方法来引发该事件3.重写 OnEventName 方法 如OnPaint应该调用基类的OnEventName 方法,以使注册的委托能够接收相应事件.在重写OnPaint 时,如果本OnPaint 负责全部重绘,则不要调用基类的OnPaint.4.定义事件如果您定义的事件没有任何关联的数据,则使用事件数据的基类型 EventArgs,并使用 EventHandler 作为事件委托public class FlashTrackBar : Control / The event does not have any data, so EventHandler is adequate as the event delegate.private EventHandler valueChangedEvent;/ Define the event member using the event keywordpublic event EventHandler ValueChanged add valueChangedEvent += value; remove valueChangedEvent -= value; / The protected method that raises the ValueChanged event when the value has actually / changed. Derived controls can override this method. protected virtual void OnValueChanged(EventArgs e) if (ValueChanged != null) ValueChanged(this, e); 五.透明控件,不规则控件的实现1.在初始化时为控件重新定义重绘区域2. 用背景图片重绘并指定透明范围。ImageAttributes m_ImageAttr; /指定透明范围graphics.DrawImage(normalImage, rectangle, 0, 0, normalImage.Width, normalImage.Height, GraphicsUnit.Pixel, this.m_ImageAttr);6. 必须遵守的规则1.命名规则变量 private bool enableTransparent = true;常量 private bool EnableTransparent = true;属性 Category(Display), DefaultValue(true), Description(Enable/disable Transparent.)public bool EnableTransparent get set2. Wrap resouce for auto dispose. And wrap resource that critical.7. 问题/ 必需的设计器变量。private System.ComponentModel.IContainer components = null; ?控件定义ITransparent 接口Public interface ITransparent 所有控件和窗体都实现此接口,取得Parent 的背景来重绘自身背景,实现透明处理。方法Public Image GetTransparentImage()取得父控件的背景,如果父控件也实现了透明处理,则返回父控件的父控件的背景。如果没有背景则以SolidBrush(Color.LightGray) 填充Public Point GetImagePoint(Point pt)出入重绘控件相对与其父控件的位置(屏幕坐标),返回重绘控件在背景上的位置(Client坐标)ImageProvider 类internal class ImageProvider:IDisposable为所有的控件提供背景图片包含imageInfo 列表,不同的控件可以引用到同一个Image, 而在内存中只有一个image 实例,只增加相应的imageInfo.refCount。ImageInfo 类internal class ImageInfo : IDisposableImage 的信息,包含引用次数和Image 对象当对某个图片的RefCount = 0 时,马上释放该资源属性private int referCount对该图片的引用次数private Image realImageImage 对象方法public void Dispose()当RefCount 为 0时,释放ImageVTImage 类 public class VTImage: IDisposable可以自动释放Image 资源的类ImageName 属性对应与ImageProvider的ImageInfo。对某个图片的引用,只是增加ImageInfo的RefCount,当RefCount 等于0时自动释放该资源。属性private string imageName;ImageName 属性对应与ImageProvider的ImageInfo。VTForm 窗体类Public class VTForm:Form, ITransparent 所有窗体的基类,支持控件的透明处理属性public override Image BackgroundImage设置或取得背景图片,Layout 效果public override ImageLayout BackgroundImageLayoutSystem.Windows.Forms.ImageLayout固定为ImageLayout.None;重载protected override void Dispose(bool disposing)释放资源:BackgroundImage方法public Image GetTransparentImage()实现ITransparent 接口方法return BackgroundImagepublic Point GetImagePoint(Point pt)实现ITransparent 接口方法背景的位置 等于控件的屏幕坐标 减 用窗体的屏幕坐标VTLabel public class VTLabel : Control, ITransparent静态文本框类属性public bool EnableTransparent是否支持透明处理,默认为truepublic ContentAlignment TextAlignment文本对齐方式,默认为ContentAlignment.MiddleLeft重载protected override void OnPaint(PaintEventArgs e)实现控件重绘1.判断是否透明处理, 是取得父控件的BackgroundImage,和 背景的位置并用该Image 重绘控件2.根据对齐方式DrawString方法public Image GetTransparentImage()实现ITransparent 接口方法取得父控件的背景非透明return nulllReturn IParent.GetTransparentImage();public Point GetImagePoint(Point pt)实现ITransparent 接口方法返回背景的位置非透明return new Point(-1, -1); return IParent.GetImagePoint(pt);VTPanelpublic class VTPanel : Panel, ITransparent控件分组框属性public bool EnableTransparent是否支持透明处理,默认为truepublic override Image BackgroundImage设置或取得背景图片,Layout 效果public override ImageLayout BackgroundImageLayoutSystem.Windows.Forms.ImageLayout固定为ImageLayout.None;重载protected override void OnPaint(PaintEventArgs e)实现控件重绘1.判断是否透明处理, 是取得父控件的BackgroundImage 和 背景的位置并用该Image 重绘控件方法public Image GetTransparentImage()实现ITransparent 接口方法取得父控件的背景enableTransparent = f

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论