隨筆分類 - WinForm Control
WinForm Control的開發(fā)心得
摘要:最近真的真的太忙了,以至于一個(gè)多月都沒喲更新我的blog。昨天晚上,一個(gè)網(wǎng)上的朋友看了我的ToolBox的文章,問我一個(gè)問題,他說如何讓ToolBox控件也能響應(yīng)鍵盤操作,也就是用Up,down按鍵來選擇工具箱控件里的Item,他添加了鍵盤事件,但是不起作用。一開始做這個(gè)控件的時(shí)候也只是演示一下控件的制作過程,只用了很短的時(shí)間做了一個(gè),只考慮了用鼠標(biāo)選取,沒有考慮鍵盤操作,我想要添加鍵盤操作無非重...
閱讀全文
摘要:把這個(gè)系列的文章整理出來,方便大家閱讀。
閱讀全文
摘要:前面的一些文章絕大部分都是要講控件的設(shè)計(jì)時(shí)的行為,既然涉及到這么多的設(shè)計(jì)時(shí)行為的代碼編寫,那么就有必要就一下如何來調(diào)試控件的設(shè)計(jì)行為。 調(diào)試控件的設(shè)計(jì)時(shí)行為和調(diào)試DLL的方式非常的相似,因?yàn)镈LL是不能夠單獨(dú)運(yùn)行的,而一般的控件也會(huì)在一個(gè)DLL里。當(dāng)然如果你不考慮類的可復(fù)用性而把控件寫在一個(gè)Windows Application里面也無可厚非,這樣調(diào)試倒也變的簡單了。但是我...
閱讀全文
摘要:在前些日子里,我寫了有十篇關(guān)于WinForm 控件的制作教程,在這些教程里使用的例子都十分的簡單,并且示例的控件基本沒有什么用,是該寫一個(gè)簡單實(shí)用的控件的時(shí)候了。今天我就來制作一個(gè)VS風(fēng)格的ToolBox工具箱。VS風(fēng)格的ToolBox和QQ的界面很相似,都是有多個(gè)欄目,并且這些欄目可以展開和折疊,當(dāng)鼠標(biāo)在某個(gè)子欄目上時(shí),可以高亮顯示,另外在VS風(fēng)格的ToolBox中,點(diǎn)擊選中項(xiàng)目的...
閱讀全文
摘要:本系列的前面幾篇文章講解了如何來定義屬性以及更有效的編輯屬性,接下來我要講一下控件屬性的默認(rèn)值。如果我們希望自己開發(fā)的控件更易于被其它開發(fā)者使用,那么提供默認(rèn)值是非常值得的。 如果你為屬性設(shè)定了默認(rèn)值,那么當(dāng)開發(fā)者修改了屬性的值,這個(gè)值在Property Explorer中將會(huì)以粗體顯示。VS為屬性提供一個(gè)上下文菜單,允許程序員使用控件把值重置為默認(rèn)值。當(dāng)VS進(jìn)行控件的串行化...
閱讀全文
摘要:在上一篇文章,我介紹了如何編寫模態(tài)對(duì)話框?qū)傩跃庉嬈鳎@篇文章我將介紹如何編寫下拉式屬性編輯器。下拉式(DropDown)屬性編輯器和模態(tài)對(duì)話框?qū)傩跃庉嬈鞯牟煌幘褪牵?dāng)你點(diǎn)擊屬性值修改的時(shí)候,模態(tài)對(duì)話框編輯器是彈出一個(gè)模態(tài)對(duì)話框,而下拉式屬性編輯器卻是在緊貼著屬性值的地方顯示一個(gè)下拉的控件。不知道大家注意到了沒有,這里我說的是顯示一個(gè)下拉的控件,而這個(gè)控件也是需要你去開發(fā)的,接下來我...
閱讀全文
摘要:前幾篇文章我們一直在討論如何更方便的編輯復(fù)雜類型的屬性,在這個(gè)過程中我介紹了類型轉(zhuǎn)換器以及如何制作自己的類型轉(zhuǎn)換器來實(shí)現(xiàn)屬性值的串行化和實(shí)現(xiàn)子屬性的編輯。對(duì)于Scope這種級(jí)別的復(fù)雜屬性,一個(gè)類型轉(zhuǎn)換器就已經(jīng)足夠了,但是對(duì)于更為復(fù)雜的屬性,單單使用類型轉(zhuǎn)換器已經(jīng)不足以應(yīng)付了,比如我們常用的Font屬性。 在這種情況下,我們就需要提供更為復(fù)雜的編輯方式,比如屬性編輯對(duì)話框,你...
閱讀全文
摘要:前面的幾篇文章中,我們給控件添加一個(gè)復(fù)雜的類型Scope,并且給它的類型提供的一個(gè)類型轉(zhuǎn)換器,現(xiàn)在我們可以在屬性瀏覽器中編輯它的值,并且它的值也被串行化的源代碼里了。但是你有沒有發(fā)現(xiàn),在屬性瀏覽器里編輯這個(gè)屬性的值還是不太方便。因?yàn)閷傩灾皇恰?0,200”這種形式的,所以,你必須按照這種格式來修改,一旦格式錯(cuò)誤就會(huì)引發(fā)異常,比如輸入一個(gè)“10200”。我們期望這個(gè)屬性的每一子屬性都能夠...
閱讀全文
摘要:在上一篇文章,我為控件添加一個(gè)一個(gè)復(fù)雜屬性,并且為這個(gè)屬性的類型的編寫了一個(gè)類型轉(zhuǎn)換器,現(xiàn)在我們來看看這個(gè)類型轉(zhuǎn)換器的代碼,并解釋一下這些代碼的意義。 要實(shí)現(xiàn)一個(gè)類型轉(zhuǎn)換器,我們必須要重寫(override)四個(gè)方法: CanConvertFrom()――根據(jù)類型參數(shù)進(jìn)行測(cè)試,判斷是否能從這個(gè)類型轉(zhuǎn)換成當(dāng)前類型,在本例中我們只提供轉(zhuǎn)換string和Instanc...
閱讀全文
摘要:上一篇文章我已經(jīng)介紹了TypeConverterAttribute元數(shù)據(jù)的作用,本文將通過代碼向你展示具體的實(shí)現(xiàn)。在這個(gè)例子中,我要給控件添加一個(gè)復(fù)雜的屬性,這個(gè)屬性對(duì)這個(gè)控件沒有什么功用,純粹是為了演示,有些牽強(qiáng)附會(huì)了。 現(xiàn)在在前一篇文章中的創(chuàng)建的控件代碼中添加一個(gè)Scope屬性: [Browsable(true)] public...
閱讀全文
摘要:前一篇文章介紹了常用的設(shè)計(jì)時(shí)Attribute。其中BrowsableAttribute,CategoryAttribute,DescriptionAttribute,DefaultPropertyAttribute,DefaultEventAttribute都是比較簡單的,也是可有可無,但是為了提供更好的用戶體驗(yàn)這些Attribute最好不要省掉,如果你對(duì)這些Attribute還不...
閱讀全文
摘要:在前面的文章里我們制作了一個(gè)非常簡單的控件。現(xiàn)在我們回過頭來看看這些代碼透露出什么信息。 這個(gè)類是直接從Control類派生出來的,自定義控件都是直接從Control類派生出來的。這個(gè)類定義了一個(gè)屬性TextAlignment,用來控制文本在控件中顯示的位置: [ Category("Alignment"), Descr...
閱讀全文
摘要:在上一篇文章里我們創(chuàng)建了一個(gè)簡單的控件FirstControl,現(xiàn)在我來介紹一下怎么使用和調(diào)試自己的控件。我希望將過程寫的盡可能的詳細(xì),讓想學(xué)習(xí)控件開發(fā)的朋友容易上手,高手們見諒。 在同一個(gè)solution里添加一個(gè)Windows Application工程(在Solution Explorer里右鍵點(diǎn)擊CustomControlSample solution選擇Add->N...
閱讀全文
摘要:我本人不是專業(yè)的控件開發(fā)人員,只是在平常的工作中,需要自己開發(fā)一些控件。在自己開發(fā)WinForm控件的時(shí)候,沒有太多可以借鑒的資料,只能盯著MSDN使勁看,還好總算有些收獲。現(xiàn)在我會(huì)把這些經(jīng)驗(yàn)陸陸續(xù)續(xù)的總結(jié)出來,寫成一系列方章,希望對(duì)看到的朋友有所幫助。今天我來開個(gè)頭。 其實(shí)開發(fā)WinForm控件并不是很復(fù)雜,.NET為我們提供了豐富的底層支持。如果你有MFC或者API圖形界...
閱讀全文
摘要:記得以前用VC開發(fā)自繪制控件的時(shí)候,遇到的一個(gè)很煩人的問題就是控件在paint的時(shí)候總是出現(xiàn)flicker(閃爍)。原因其實(shí)很簡單,就是你一點(diǎn)一點(diǎn)的向設(shè)備上下文環(huán)境繪制,中間還有很多邏輯運(yùn)算,結(jié)果就像是動(dòng)畫了,不過計(jì)算機(jī)的速度比較快,所以呈現(xiàn)在我們面前的閃爍,而閃爍的出現(xiàn)大大的影響的客戶的使用體驗(yàn)。后來一個(gè)程序員開發(fā)了一個(gè)后來廣為流傳的類MemDC,這個(gè)類首先創(chuàng)建一個(gè)兼容的設(shè)備上下文環(huán)...
閱讀全文
摘要:最近學(xué)習(xí)制作WinForm控件,自己動(dòng)手寫控件的時(shí)候才發(fā)現(xiàn)System.Windows.Forms.Control 竟然沒有提供默認(rèn)的border繪制。記得以前用API做控件的時(shí)候,只需要設(shè)置空間窗口的WS_BORDER 風(fēng)格就可以。遍尋無方,只有自己繪制了,這里有出現(xiàn)一個(gè),如果border在客戶區(qū),那么在OnPaint方法里不得不每次都要考慮Border所占用的區(qū)域,而且,如果從這...
閱讀全文

浙公網(wǎng)安備 33010602011771號(hào)