vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Erstellen von dynamischen Kontextmen?s - wann immer Sie sie brauchen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik:    |   VB-Versionen: VB2005, VB200801.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 WutzkeBewertung:     [ Jetzt bewerten ]Views:  1.838 
http://www.vb-power.netSystem:  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