WindowsForms進階寫一個定制控件課件_第1頁
WindowsForms進階寫一個定制控件課件_第2頁
WindowsForms進階寫一個定制控件課件_第3頁
WindowsForms進階寫一個定制控件課件_第4頁
WindowsForms進階寫一個定制控件課件_第5頁
已閱讀5頁,還剩36頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

DEV414:WindowsForms進階:寫一個定制控件顧問咨詢部Microsoft(China)內容WindowsFormsFrameworkWindowsForms&GDI+編寫一個例子控件-(AlarmClock)描繪控件添加屬性(Properties)添加事件(Events)使用該控件添加Collection屬性-(AlarmTimesCollection)快速通過-(類型轉換、屬性編輯器)總結Windows

Forms的優勢WinForm具有CLR的開發優勢:GC,語言無關,底層操作,安全框架在WindowsForms,WebForms,System.Net等類庫都具有相同的設計模式豐富的,可擴展的設計時支持簡潔!沒有一大堆的頭文件,IDL,libs,

obj,等等.Web感知的,data感知的真正的,豐富的運行時類型信息WindowsForms繼承關系ComponentStandardIComponentImplControlBasicHWNDWrapperTimerButtonBaseListViewScrollableControlListControlButtonCheckBoxRadioButtonContainerControlUserControlDesignableFormTopLevelWindowComboBoxListBoxComponentAndIComponentComponent對IComponent接口進行了標準的實現IComponent包含一個Site屬性,Site是Component和Container之間的通信接口提供一個Events屬性-包含所有連接到該組件的事件處理者Control–

WindowsForms的核心Control包含窗口句柄(HWNDwrapper)處理主要的一些窗口消息(WM_*)為用戶的輸入,描繪和布局提供一些事件包裝ActiveX負責句柄的創建和重建通過Handle屬性暴露HWND如果HWND不存在,在訪問該屬性時會立刻建立一個如果重載WndProc()方法,那么可以處理任何窗口消息訪問底層系統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+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+基礎

屬性是聰明的字段(類成員)自然的語法和訪問器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來實現事件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方法調用base.OnPaint(pe)

如果你希望基類為你畫點什么畫一個鬧鐘

Clock_1_Painting加一大堆事件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_MetaData類型轉換器運行時和設計時都需要本身是獨立的,不依賴于任何UI包(WinForm,WebForm)基類(如果控件本身沒有提供新的類型轉換器):System.ComponentModel.TypeConverter類型轉換器的實現一般情況下都比較簡單可以用TypeConverterAttribute得到一個控件的的TypeConverter的信息(qualifiedtypename)得到所有的屬性用TypeDescriptor.GetPropertiesExample:Size&SizeConverterExample:TypeConverters和屬性瀏覽器Property編輯器宿主的編輯界面PropertyBrowsersSystem.Drawing.Design.UITypeEditor被propertybrowser

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論