WindowsForms進(jìn)階寫一個(gè)定制控件課件_第1頁
WindowsForms進(jìn)階寫一個(gè)定制控件課件_第2頁
WindowsForms進(jìn)階寫一個(gè)定制控件課件_第3頁
WindowsForms進(jìn)階寫一個(gè)定制控件課件_第4頁
WindowsForms進(jìn)階寫一個(gè)定制控件課件_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

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

Forms的優(yōu)勢WinForm具有CLR的開發(fā)優(yōu)勢:GC,語言無關(guān),底層操作,安全框架在WindowsForms,WebForms,System.Net等類庫都具有相同的設(shè)計(jì)模式豐富的,可擴(kuò)展的設(shè)計(jì)時(shí)支持簡潔!沒有一大堆的頭文件,IDL,libs,

obj,等等.Web感知的,data感知的真正的,豐富的運(yùn)行時(shí)類型信息WindowsForms繼承關(guān)系ComponentStandardIComponentImplControlBasicHWNDWrapperTimerButtonBaseListViewScrollableControlListControlButtonCheckBoxRadioButtonContainerControlUserControlDesignableFormTopLevelWindowComboBoxListBoxComponentAndIComponentComponent對IComponent接口進(jìn)行了標(biāo)準(zhǔn)的實(shí)現(xiàn)IComponent包含一個(gè)Site屬性,Site是Component和Container之間的通信接口提供一個(gè)Events屬性-包含所有連接到該組件的事件處理者Control–

WindowsForms的核心Control包含窗口句柄(HWNDwrapper)處理主要的一些窗口消息(WM_*)為用戶的輸入,描繪和布局提供一些事件包裝ActiveX負(fù)責(zé)句柄的創(chuàng)建和重建通過Handle屬性暴露HWND如果HWND不存在,在訪問該屬性時(shí)會(huì)立刻建立一個(gè)如果重載WndProc()方法,那么可以處理任何窗口消息訪問底層系統(tǒng)WndProc的例子:privateconstintWM_COMPACTING=0x041;protectedoverridevoidWndProc(refMessagem){ case(m.msg){ caseWM_COMPACTING: OnCompacting(); break; } base.WndProc(m); }ScrollableControl

AndContainerControlScrollableControlControl支持自動(dòng)滾動(dòng)(AutoScroll,VScroll,HScroll)AutoScrollMargin,AutoScrollMinSize屬性定義滾動(dòng)的范圍等信息ContainerControl實(shí)現(xiàn)一個(gè)Control的容器管理控件的焦點(diǎn)(Tab)-本身不接受焦點(diǎn)實(shí)現(xiàn)所有ScrollableControl的功能支持布局(Dock,Anchor)DemoRootDesignableTypes:UserControlAndFormUserControl組合控件的基類型(ComboBox)自定義控件的基類型FormWindowsForms頂層控件提供一些屬性來操作Systemmenu,minimize/maximize按鈕,菜單等使用GDI+Drawing類的基類是System.Drawing.Graphics可以從Control.Paint事件的參數(shù)獲得,或者用Control.CreateGraphics建立和HDC類似對象在結(jié)束使用時(shí)自動(dòng)清理(GC),但是最好手工調(diào)用Dispose。(Win9x平臺(tái)必須手工處理!)有很多系統(tǒng)標(biāo)準(zhǔn)對象例如:SystemColors,SystemBrushes,SystemIcons,SystemPensControlPaint封裝了一些畫Control的公共功能簡單的GDI+操作寫一段文本Graphicsg=someCtl.CreateGraphics();g.DrawString(“HelloWorld!”,someCtl.Font,SystemBrushes.WindowText,0,0);g.Dispose();簡單的GDI+操作畫一個(gè)綠色的圓Graphicsg=someCtl.CreateGraphics();Brushb=newSolidBrush(Color.Green);g.FillEllipse(b,0,0,100,100);b.Dispose();g.Dispose();GDI+基礎(chǔ)

屬性是聰明的字段(類成員)自然的語法和訪問器public

classButton:Control{

privatestringtext;

publicstringText{

get{

returntext;}

set{text=value;Repaint();}}}DimbAsNewButtonb.Text="OK"DimsAsString=b.Text屬性用Delegate來實(shí)現(xiàn)事件實(shí)現(xiàn)事件要有三樣?xùn)|西(Control)一個(gè)類封裝了事件要傳遞的數(shù)據(jù)AlarmEventArgs一個(gè)事件的delegateAlarmEventHandler一個(gè)產(chǎn)生事件的類(你的Control)一個(gè)事件聲明publiceventAlarmEventHandlerAlarm;一個(gè)方法來產(chǎn)生事件protectedvirtualvoidOnAlarm

(AlarmEventArgse){if(Alarm!=null)Alarm(this,e);}用Delegate來實(shí)現(xiàn)事件PublicSubOnClick(ByValsenderasObject, ByValeasEventArgs)Handles Button1.Click ‘DosomethingEndSubVB用戶的用法實(shí)現(xiàn)一個(gè)Control我們要做一個(gè)鬧鐘控件從Control派生第一步,我們實(shí)現(xiàn)它的運(yùn)行時(shí)的功能,第二步添加一些設(shè)計(jì)時(shí)的功能DEMO-最終效果Clock_6_Designer為現(xiàn)有的Windowtype做一些擴(kuò)展Control.CreateParams允許你控制CreateWindowEx

的調(diào)用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方法調(diào)用base.OnPaint(pe)

如果你希望基類為你畫點(diǎn)什么畫一個(gè)鬧鐘

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動(dòng)態(tài)Collection屬性應(yīng)該實(shí)現(xiàn)System.Collections.IList接口(Item(Indexer))Collection永遠(yuǎn)不要返回NULL,可以返回一個(gè)空的Collection!加一個(gè)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類型轉(zhuǎn)換器運(yùn)行時(shí)和設(shè)計(jì)時(shí)都需要本身是獨(dú)立的,不依賴于任何UI包(WinForm,WebForm)基類(如果控件本身沒有提供新的類型轉(zhuǎn)換器):System.ComponentModel.TypeConverter類型轉(zhuǎn)換器的實(shí)現(xiàn)一般情況下都比較簡單可以用TypeConverterAttribute得到一個(gè)控件的的TypeConverter的信息(qualifiedtypename)得到所有的屬性用TypeDescriptor.GetPropertiesExample:Size&SizeConverterExample:TypeConverters和屬性瀏覽器Property編輯器宿主的編輯界面PropertyBrowsersSystem.Drawing.Design.UITypeEditor被propertybrowser

溫馨提示

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

評論

0/150

提交評論