Alle Windows-Objekte kommunizieren untereinander mit so genannten "Messages" (Nachrichten). Ändert ein Anwender bspw. mit der Maus die Größe eines Formulars, so schickt Windows eine Nachricht an dieses Formular (Achtung Formular - Du wurdest in der Größe verändert. Zeichne dich neu!). In VB.Net werden solche Nachrichten (teilweise) als Ereignisse zur Verfügung gestellt, z.B. wird Form_Resize bei der Änderung der Größe eines Formulars aufgerufen. Oder aber der Anwender klickt mit der rechten Maustaste in eine TextBox, so wird das Kontextmenü aufgerufen. Auch hierzu schickt Windows eine Nachricht an die TextBox. Dabei wird das Ereignis "MouseUp" gefeuert, doch leider gibt es kein Ereignis für die Anzeige des Kontextmenü. Somit kann die Anzeige des Kontextmenü nicht unterbunden werden. Und genau hier kommt unsere Klasse clsSubClass ins Spiel. Unter SubClassing versteht man eine Technik, bei der die Messages von Windows an die eigene Verarbeitung (in unserm Fall die Klasse clsSubClass) umgeleitet werden, bevor man sie an das eigentliche Ziel (i.d.R. ein Steuerelement) weiterreicht. So kann man auf Nachrichten reagieren, und auch diese modifizieren, die eigentlich nicht von VB.Net unterstützt werden. ACHTUNG: Der Umgang mit SubClassing und das Verändern von Nachrichten kann zu ungewollten Effekten mit der IDE führen. Sie sollten daher vor jedem Start der Anwendung unbedingt Ihren Quellcode speichern. In unserem Demoprojekt zeigen wir Ihnen, wie bei TextBoxen das Kontextmenü abgeschaltet, und "Cut", "Copy", und "Paste" unterbunden wird. Weiterhin beinhaltet das Demoprojekt eine Auflistung von über 170 Windows-Messages im Klartext. Hier der Code der Klasse clsSubClass: ''' <summary> ''' Stellt SubClassing für Steuerelemente mit einem Handle zur Verfügung. ''' </summary> ''' <remarks> ''' clsSubClass - VB.Net 2005 Klassenmodul ''' ====================================== ''' Diese Klasse stellt Subclassing Methoden für Steuerelemente zur Verfügung, ''' die über ein Windows-Handle verfügen. Dabei wird die Windows Message, die ''' an ein Steuerelement gesendet wird, über die Klasse umgeleitet und an die ''' aufrufende Form über den Event "WinProc" weitergegeben. ''' ''' Oktober 2006 - VB-Power.net ''' http://www.vb-power.net ''' </remarks> Public Class clsSubClass Private iList As New List(Of SubClassItem) Public Event WinProc(ByVal Index As Integer, ByVal Key As String, ByRef m As Message) ''' <summary> ''' Datenklasse: Speichert das Handle und den Key eines Steuerelements ''' </summary> Private Class SubClassItem Inherits System.Windows.Forms.NativeWindow Public m_Key As String Public Event WinProc(ByVal sender As SubClassItem, ByRef m As Message) Public Sub New(ByVal Handle As IntPtr, ByVal Key As String) MyBase.AssignHandle(Handle) m_Key = Key End Sub Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) RaiseEvent WinProc(Me, m) MyBase.WndProc(m) End Sub End Class ''' <summary> ''' Fügt ein Steuerelement, dass gesubclassed werden soll, der Liste hinzu. ''' </summary> ''' <param name="Handle">Das Windows Handle des Steuerelements</param> ''' <param name="Key">Ein Key, der das Steuerelment repräsentiert</param> Public Sub Add(ByVal Handle As IntPtr, ByVal Key As String) Dim c As New SubClassItem(Handle, Key) AddHandler c.WinProc, AddressOf ItemWinProc iList.Add(c) End Sub Private Sub ItemWinProc(ByVal sender As SubClassItem, ByRef m As Message) RaiseEvent WinProc(iList.IndexOf(sender), sender.m_Key, m) End Sub End Class Die Klasse ist so angelegt, dass sie beliebig viele Steuerelemente, die ein Windows-Handle besitzen, aufnehmen kann. Über das Klassen-Event WinProc werden die Nachrichten der Steuerelemente an die aufrufende Form umgeleitet. Dabei wird der Key mit an die Form übergeben, so dass eine einfache Weiterverarbeitung möglich ist. Beispiel: Kontextmenü einer TextBox deaktivieren Public Class Form1 ' Klasse mit Ereignis instanzieren Private WithEvents mySubClass As New clsSubClass Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load ' Steuerelemente an die Klasse übergeben, ' die gesubclassed werden sollen. With mySubClass .Add(TextBox1.Handle, "TextBox1") End With End Sub ' Der Event aus der Klasse clsSubClass Private Sub mySubClass_WinProc(ByVal Index As Integer, _ ByVal Key As String, _ ByRef m As System.Windows.Forms.Message) Handles mySubClass.WinProc Select Case Key Case "TextBox1" ' TextBox1 - Kontextmenü unterdrücken If m.Msg = WM_MSGType.WM_CONTEXTMENU Then ' Nachricht terminieren m.Msg = 0 End If End Select End Sub End Class Erfahrenen VB6 Programmierer unter Ihnen werden feststellen, wie einfach SubClassing unter VB.Net geworden ist. Keine API-Calls und Module mehr... Viel Spaß... Dieser Tipp wurde bereits 17.745 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
sevISDN 1.0 Überwachung aller eingehender Anrufe! Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Tipp des Monats März 2024 Dieter Otter UTF-8 Konvertierung von Dateien und Strings VB6 selbst verfügt über keine Funktionen zur UTF-8 Konvertierung von Daten. Mit Hilfe des ADODB.Stream-Objekts lassen sich diese fehlenden Funktionen aber schnell nachrüsten. Neu! sevDTA 3.0 Pro SEPA mit Kontonummernprüfung Erstellen von SEPA-Dateien mit integriertem BIC-Verzeichnis und Konto- nummern-Prüfverfahren, so dass ungültige Bankdaten bereits im Vorfeld ermittelt werden können. |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |