Rubrik: | VB-Versionen: VB2005, VB2008 | 01.10.09 |
AccessKeys in eigenen .NET Controls Dieser Tipp zeigt, wie man innerhalb eigener .NET Controls auf bestimmte Zugriffstasten (Alt+Buchstabe) reagieren kann. | ||
Autor: Roland Wutzke | Bewertung: | Views: 1.870 |
http://www.vb-power.net | System: Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt |
Wer eigene UserControls unter VB6 programmiert hat, kennt sicherlich die AccessKeys-Eigenschaft. Über diese Eigenschaft lassen sich Buchstaben festlegen, auf die das Control in Verbindung mit der ALT-Taste reagieren kann. VB6 löste in diesem Fall das AccessKeyPress-Ereignis aus und das Control bekam den Fokus.
Unter VB.NET gibt es leider keine AccessKeys-Eigenschaft!
Wie man aber dennoch innerhalb des eigenen .NET Controls (abgeleitet von der Control-Klasse) auf bestimmte Zugriffstasten (ALT+Buchstabe) reagieren kann, das zeigen wir Ihnen in unserem heutigen Extra-Tipp.
Stichpunkt: ProcessMnemonic
Dieses Event wird immer dann ausgelöst, wenn eine Zugriffstasten gedrückt wurde. Jetzt braucht man nur noch zu prüfen, ob es sich um die für das eigene Control festgelegte Zugriffstaste handelt.
Wir erstellen also ein neues Control und fügen diesem eine UseMnemonic-Eigenschaft hinzu, über die wir festlegen können, ob auf Zugriffstasten reagiert werden soll, oder nicht.
Imports System.ComponentModel Public Class myControl Inherits Control ' Zugriffstasten berücksichtigen Private m_UseMnemonic As Boolean = False
''' <summary> ''' Ruft einen Wert ab, der angibt, ob das Steuerelement ein kaufmännisches ''' Und-Zeichen in der Text-Eigenschaft des Controls als Präfix für eine ''' Zugriffstaste interpretiert, oder legt diesen fest. ''' </summary> <DefaultValue(False)> _ Public Property UseMnemonic() As Boolean Get Return m_UseMnemonic End Get Set(ByVal value As Boolean) m_UseMnemonic = value Me.Invalidate() End Set End Property
Public Overrides Property Text() As String Get Return MyBase.Text End Get Set(ByVal value As String) MyBase.Text = value Me.Invalidate() End Set End Property
Private Sub myControl_Paint(ByVal sender As Object, _ ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint ' Rahmen zeichnen e.Graphics.FillRectangle(New SolidBrush(MyBase.BackColor), Me.ClientRectangle) ' Hintergrund füllen Dim r As New Rectangle(Me.ClientRectangle.X, Me.ClientRectangle.Y, _ Me.ClientRectangle.Width - 1, Me.ClientRectangle.Height - 1) e.Graphics.DrawRectangle(Pens.Black, r) ' Textausgabe unter Berücksichtigung der UseMnemonic-Eigenschaft Dim flags As System.Windows.Forms.TextFormatFlags = _ TextFormatFlags.HorizontalCenter Or _ TextFormatFlags.VerticalCenter Or _ TextFormatFlags.WordEllipsis Or _ TextFormatFlags.EndEllipsis ' &-Zeichen darstellen? If Not m_UseMnemonic Then flags = flags Or TextFormatFlags.NoPrefix TextRenderer.DrawText(e.Graphics, MyBase.Text, MyBase.Font, _ Me.ClientRectangle, MyBase.ForeColor, flags) End Sub
' Zugriffstasten auswerten Protected Overrides Function ProcessMnemonic(ByVal charCode As Char) As Boolean If m_UseMnemonic Then If Control.IsMnemonic(charCode, Me.Text) Then MsgBox("Zugriffstaste wurde gedrückt!", MsgBoxStyle.Information) ' Mitteilen, dass das Ereignis behandelt wurde Return True End If End If Return MyBase.ProcessMnemonic(charCode) End Function
End Class