程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB.NET >> 定制VB.NET控件編程阻攔擊鍵舉措

定制VB.NET控件編程阻攔擊鍵舉措

編輯:VB.NET

定制VB.NET控件編程阻攔擊鍵舉措。本站提示廣大學習愛好者:(定制VB.NET控件編程阻攔擊鍵舉措)文章只能為提供參考,不一定能成為您想要的結果。以下是定制VB.NET控件編程阻攔擊鍵舉措正文


一、簡介

首先,本文假定你曾經熟習VB.net和Visual Studio.NET Windows表單設計器。

在開發定制Windows表單控件時,提供我們自己的下拉框類型編輯器來操作控件的屬性經常是十分方便的。定制的類型編輯器不只可以提供更為豐厚的設計時辰體驗,而且能夠成為用戶能否喜歡你的控件的決議要素。

假如你決議創立你自己的下拉式類型編輯器,那麼它應該遵照與內置的下拉框類型編輯器相相似的形式。讓我們以Anchor屬性為例。一種典型的操作該屬性的設計時辰用戶交互描繪如下:

· 用戶選擇屬性情子中的Anchor屬性並且點擊屬性情左邊的下拉按鈕。

· 一種良好的圖形控件是下拉框,它可以允許用戶運用鼠標點擊邊緣或許運用箭頭鍵來高亮某個邊緣並運用空格鍵選擇/取消選擇它。

· 用戶可以經過按下ENTER鍵或點擊下拉控件的內部來接納變化。為了取消這一變化,用戶可以按下ESC鍵。

上面,讓我們來討論詳細的完成技術。

二、完成

首先,讓我們構建一個ResourceImageEditor類型編輯器,它允許從以後文件零碎中選擇一個圖像文件(就象內置的ImageEditor類一樣)或許從一個順序集的manifest文件中選擇一個圖像資源。而且,在用戶體驗方面,該ResourceImageEditor的行為應該相似於零碎內置的類型編輯器。上面是對我們要求的概述:

1. 當用戶附屬性情子中選擇一個屬性時,該格子就會顯示出來—以一個下拉框UI方式顯示可以編輯的屬性。

2. 當點擊下拉按鈕時,以後順序集中的一切圖像資源將顯示出來。

3. 當用戶選擇一個圖像資源項,相應的圖像即可以從順序集中停止加載。

4. 允許選擇一個圖像文件,並且在下拉列表框中的最後一項將標志為“Browse...”。當用戶點按“Browse...”項,將顯示經典的翻開文件對話框,用戶可以從中選擇一個圖像文件。

5. 經過單擊鼠標或運用箭頭鍵高亮某項並按回車鍵實踐選擇它從而允許用戶從該下拉列表框中選擇一項。這個下拉選擇可以經過按下ESC鍵取消。

ResourceImageEditor是一個類型編輯器,因而它直接或直接地派生自System.Drawing.Design.UITypeEditor類。我決議從內置的System.Drawing.Design.ImageEditor類停止派生是由於它曾經完成了圖像文件選擇功用。也就是說,ImageEditor.EditValue完成將顯示一個文件翻開對話框以允許用戶從文件零碎中選擇一個圖像文件。然後,從我的派生類中調用這一功用只需求復雜地調用MyBase.EditValue即可。

為了完成下面第一個要求(在屬性情子中顯示下拉箭頭按鈕),我必需重載GetEditStyle辦法以從UITypeEditorEditStyle枚舉中前往適當的常數:

Public Overloads Overrides Function GetEditStyle( _
ByVal context As ITypeDescriptorContext) As UITypeEditorEditStyle
 Return UITypeEditorEditStyle.DropDown
End Function

為了顯示圖像資源列表,我必需羅列一個給定順序集中的一切資源並且僅在列表中顯示圖像資源。為了簡化,我決議運用一種復雜的商定:當一個資源名以一個無效圖像文件擴展名(.bmp,.jpg,.gif...)完畢時,

我們就以為這是一種圖像資源,並且把它包括到該下拉列表框中。而且,我運用圖像資源名的集合來填充這個下拉ListBox控件,前面詳預以詳述。

開端時,被枚舉以查詢圖像資源的順序集就是包括ResourceImageEditor類的順序集。但是,我們可以經過把ResourceImageEditor.ResourceAssembly屬性設置為任何無效的System.Reflection.Assembly參考來改動它。

鼠標接口任務得很好。但是,當我運用鍵盤選擇一項然後按下回車鍵時,該下拉列表框消逝,而且我的選定內容喪失了(也就是說,前一個選擇圖像並沒有改動)。我很快發現,當按下回車鍵時,該ListBox並沒有生成KeyDown事情。

雖然ESC鍵也發生KeyDown事情,但這不是一個問題;由於該下拉列表框會被自動封閉,而且我不用處置以後選擇項。

很分明,在ListBox控件可以處置它們之前,這個屬性情“屏蔽”了ENTER和ESC鍵。

為了簡化而且還要處理問題,我要運用ProcessDialogKey辦法。在音訊預處置時期(處置對話字符,例如TAB、RETURN、ESCAPE和箭頭鍵)時,調用這個辦法。這個辦法是在System.Windows.Forms.Control類內聲明的—它復雜地把該調用代理給該控件的父級(假如有的話)。我曾經子類化該ListBox控件,並且重載了ProcessDialogKey辦法來阻攔回車鍵,如下所示:

Protected Overrides Function ProcessDialogKey(ByVal keyData As Keys) As Boolean
 If keyData = System.Windows.Forms.Keys.Return Then
  RaiseEvent EntERPressed(Me, EventArgs.Empty)
  Return True 'True意味著我們曾經處置了相應的鍵
 Else
  Return MyBase.ProcessDialogKey(keyData)
 End If
End Function

不是從ProcessDialogKey完成外部生成KeyDown事情,我決議運用一種更為直接的方式:EnterPressed事情。為了,我修正了ResourceImageEditor.EditValue的完成以處置這一事情(而不是KeyDown事情),而且一切都十分順利。

你可以運用這一技術來阻攔任何Control派生的類(你運用它來完成你的類型編輯器中的下拉UI)中的ENTER鍵。

當用戶從列表框中選擇一個圖像資源名時,該圖像應該即可從給定的順序集中的manifest文件中加載。這是在LoadResourceImage辦法內完成的:

Private Function LoadResourceImage(ByVal resourceName As String) As Image
Debug.Assert(Not resourceName Is Nothing)
 Dim ImageStream As System.IO.Stream = Me.ResourceAssembly.GetManifestResourceStream(resourceName)
 Return System.Drawing.Bitmap.FromStream(ImageStream)
End Function

下拉用戶接口是經過在重載的EditValue辦法內靜態地創立和填充一個ListBox控件完成的。編輯器也處置由ListBox生成的Click和KeyDown事情,由於這是阻攔ENTER和ESC鍵所必需的。下列偽碼顯示了在EditValue辦法中的完成邏輯:

Public Overloads Overrides Function EditValue(...)
'存儲上下文信息以用於下拉ListBox事情處置器。
'創立並運用可用的圖像資源名填充該ListBox。
'添加我們的特殊“Browse...”項。
'綁定ListBox事情。
'在一個下拉窗口中顯示該ListBox。
End Function

三、幾個關鍵問題與解案

為了開發ResourceImageEditor,我創立了一個重載Image屬性的MyPictureBox(派生自System.Windows.Forms.PictureBox),以便把ResourceImageEditor指定為該Image屬性的類型編輯器。

然後,我編譯這個控件的代碼。之後,就可以把該MyPictureBox控件放到一個表單上並且調用下拉框用戶接口......

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved