WindowsForms进阶写一个定制控件课件_第1页
WindowsForms进阶写一个定制控件课件_第2页
WindowsForms进阶写一个定制控件课件_第3页
WindowsForms进阶写一个定制控件课件_第4页
WindowsForms进阶写一个定制控件课件_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

内容WindowsFormsFrameworkWindowsForms&GDI+编写一个例子控件-(AlarmClock)描绘控件添加属性(Properties)添加事件(Events)使用该控件添加Collection属性-(AlarmTimesCollection)快速通过-(类型转换、属性编辑器)总结Windows

Forms的优势WinForm具有CLR的开发优势:GC,语言无关,底层操作,安全框架在WindowsForms,WebForms,System.Net等类库都具有相同的设计模式丰富的,可扩展的设计时支持简洁!没有一大堆的头文件,IDL,libs,

obj,等等.Web感知的,data感知的真正的,丰富的运行时类型信息WindowsForms

控件的设计原则控件是非模式的使用已有的设计模式控件的功能是显而易见的用一种方法达到目的用CLS类型–控件的功能可以被任何CLS语言访问WindowsForms继承关系ComponentStandardIComponentImplControlBasicHWNDWrapperTimerButtonBaseListViewScrollableControlListControlButtonCheckBoxRadioButtonContainerControlUserControlDesignableFormTopLevelWindowComboBoxListBoxComponentAndIComponentComponent对IComponent接口进行了标准的实现IComponent包含一个Site属性,Site是Component和Container之间的通信接口提供一个Events属性-包含所有连接到该组件的事件处理者Control–

WindowsForms的核心Control包含窗口句柄(HWNDwrapper)处理主要的一些窗口消息(WM_*)为用户的输入,描绘和布局提供一些事件包装ActiveX负责句柄的创建和重建通过Handle属性暴露HWND如果HWND不存在,在访问该属性时会立刻建立一个如果重载WndProc()方法,那么可以处理任何窗口消息访问底层系统可以从Graphics得到HDC重载protectedvirtualWndProc方法访问底层系统WndProc的例子:privateconstintWM_COMPACTING=0x041;protectedoverridevoidWndProc(refMessagem){ case(m.msg){ caseWM_COMPACTING: OnCompacting(); break; } base.WndProc(m); }ScrollableControl

AndContainerControlScrollableControlControl支持自动滚动(AutoScroll,VScroll,HScroll)AutoScrollMargin,AutoScrollMinSize属性定义滚动的范围等信息ContainerControl实现一个Control的容器管理控件的焦点(Tab)-本身不接受焦点实现所有ScrollableControl的功能支持布局(Dock,Anchor)DemoRootDesignableTypes:UserControlAndFormUserControl组合控件的基类型(ComboBox)自定义控件的基类型FormWindowsForms顶层控件提供一些属性来操作Systemmenu,minimize/maximize按钮,菜单等GDI+简介全新的完全面向对象的2-D图形系统GDI+对象能够和GDI对象互操作无状态–drawing对象在每次操作时都必须出现添加了很多新特性:抗锯齿,纹理&渐进填充,文本特效,alpha混合…使用GDI+Drawing类的基类是System.Drawing.Graphics可以从Control.Paint事件的参数获得,或者用Control.CreateGraphics建立和HDC类似对象在结束使用时自动清理(GC),但是最好手工调用Dispose。(Win9x平台必须手工处理!)有很多系统标准对象例如:SystemColors,SystemBrushes,SystemIcons,SystemPensControlPaint封装了一些画Control的公共功能简单的GDI+操作写一段文本Graphicsg=someCtl.CreateGraphics();g.DrawString(“HelloWorld!”,someCtl.Font,SystemBrushes.WindowText,0,0);g.Dispose();简单的GDI+操作画一个绿色的圆Graphicsg=someCtl.CreateGraphics();Brushb=newSolidBrush(Color.Green);g.FillEllipse(b,0,0,100,100);b.Dispose();g.Dispose();GDI+:特殊效果Imageimg=newBitmap(“myimage.bmp”); TextureBrushtBrush=newTextureBrush(img); BrushwashBrush=new SolidBrush(Color.FromArgb(180, Color.White));g.FillRectangle(tBrush,0,0,100,100);g.FillRectangle(washBrush,0,0,100,100);tBrush.Dispose();washBrush.Dispose();img.Dispose();用一个图片作纹理,然后…GDI+基础

属性是聪明的字段(类成员)自然的语法和访问器public

classButton:Control{

privatestringtext;

publicstringText{

get{

returntext;}

set{text=value;Repaint();}}}DimbAsNewButtonb.Text="OK"DimsAsString=b.Text属性用Delegate来实现事件实现事件要有三样东西(Control)一个类封装了事件要传递的数据AlarmEventArgs一个事件的delegateAlarmEventHandler一个产生事件的类(你的Control)一个事件声明publiceventAlarmEventHandlerAlarm;一个方法来产生事件protectedvirtualvoidOnAlarm

(AlarmEventArgse){if(Alarm!=null)Alarm(this,e);}用Delegate来实现事件publicclassAlarmDriver{publicstaticvoidMain(string[]args){//Instantiatestheeventreceiver.WakeMeUpw=newWakeMeUp();

//Instantiatestheeventsource.AlarmClockclock=newAlarmClock();//WirestheAlarmRangmethodtotheAlarmevent.clock.Alarm+=newAlarmEventHandler(w.AlarmRang);clock.Start();}}添加事件处理程序(Client用)用Delegate来实现事件PublicSubOnClick(ByValsenderasObject, ByValeasEventArgs)Handles Button1.Click ‘DosomethingEndSubVB用户的用法实现一个Control我们要做一个闹钟控件从Control派生第一步,我们实现它的运行时的功能,第二步添加一些设计时的功能DEMO-最终效果Clock_6_Designer为现有的Windowtype做一些扩展Control.CreateParams允许你控制CreateWindowEx

的调用ExampleSystem.WinForms.Button privateconstintBS_PUSHBUTTON=0x0;privateconstintBS_OWNERDRAW=0xB;protectedCreateParamsCreateParams{ overrideget{ CreateParamscp=base.CreateParams; cp.ClassName="BUTTON"; cp.Style|=BS_PUSHBUTTON; cp.Style|=BS_OWNERDRAW; returncp; }}重载OnPaint方法派生类通过重载基类的OnPaint方法来描绘控件protectedoverridevoidOnPaint(PaintEventArgspe){ pe.Graphics.FillRectangle( newSolidBrush(this.BackColor), this.ClientRectangle); pe.Graphics.DrawString( this.Text,this.Font, newSolidBrush(this.ForeColor), ClientRectangle);}重载OnPaint方法调用base.OnPaint(pe)

如果你希望基类为你画点什么画一个闹钟

Clock_1_Painting加属性和方法注意哪些方法被标记成virtual,public,注意句柄是否已经建立,有些操作必须有句柄存在Control.IsHandleCreated尽可能保证你的控件无模式注意:值类型和引用类型加一大堆事件Component的Events属性能够用来保存很多EventHandler太多的不同类型的事件可能大大增加你的类实例尺寸(成员变量,虚方法)很多相同类型的事件需要按照Key来访问自己控制事件处理器的调用Events(用Key访问,但是线性搜索)加一大堆事件privatestaticreadonlyobjectEventFoo=newobject();publiceventEventHandlerFoo{ get{ returnbase.Events[EventFoo]; }

set{ base.Events[EventFoo]=value; }}加事件和属性到闹钟控件

Clock_2_PropEvent用Collection属性WindowsForms大量使用Collection属性ListBox.ItemsListView.ColumnsToolbar.ButtonsControl.Controls动态Collection属性应该实现System.Collections.IList接口(Item(Indexer))Collection永远不要返回NULL,可以返回一个空的Collection!加一个Collection属性到闹钟控件

Clock_3_CollectionPropMetadata和Attributes如何添加为类添加一些附加的描述信息

[Category("Appearance"),Description(“Textdescribingproperty"),DefaultValue(“OK”),Bindable(true)]publicstringText{....}}Attributes.NETFramework定义了很多Attributes所有的.NETFrameworksAttributes从System.ComponentModel.MemberAttribute派生BrowsableAttributeBindableAttributeCategoryAttributeDefaultEventAttribute/DefaultPropertyAttributeDesignerAttributeLicenseProviderAttributeMergablePropertyAttributeDesignerSerializationVisibilityAttributeToolboxItemAttribute加attributes到闹钟控件

Clock_4_M

温馨提示

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

最新文档

评论

0/150

提交评论