Bilden von Steuerelementunterklassen mit einer verwalteten Fensterprozedur

Aktualisiert: November 2007

In .NET Compact Framework, Version 2.0, kann verwalteter Code mithilfe eines Rückrufdelegaten von systemeigenem Code aufgerufen werden. Wenn Sie Unterklassen für ein verwaltetes Steuerelement erstellen, damit ein Rückruf vom entsprechenden systemeigenen Steuerelement empfangen wird, können Sie Steuerelemente mit Funktionen erstellen, die nicht unmittelbar in .NET Compact Framework verfügbar sind.

Dies ist ein weiterführendes Thema für Entwickler mit Erfahrungen in der Windows-Programmierung und dem Bilden von Steuerelementunterklassen. Um Unterklassen für ein Steuerelement zu erstellen, müssen Sie die internen Details des systemeigenen Steuerelements und dessen Zuordnung zu den jeweiligen Funktionen kennen, die Sie als Erweiterung des verwalteten Steuerelements bereitstellen möchten. Es muss bekannt sein, welche Windows-Meldungen überwacht, und welche systemeigenen Windows Embedded CE-Funktionen aufgerufen werden sollen, um die gewünschten Funktionen bereitzustellen.

In diesem Thema wird das Bilden von Unterklassen für das TreeView-Steuerelement und das Button-Steuerelement erläutert. In den folgenden Themen finden Sie die Codebeispiele und Anweisungen zum Erstellen der Anwendungen.

Gewusst-wie-Thema

Gegenstand

Gewusst wie: Bilden von Unterklassen für TreeView durch Verwenden von systemeigenen Rückrufen

Bilden von Unterklassen des TreeView-Steuerelements, um eine Implementierung des NodeMouseClick-Ereignisses zu erstellen. Diese Methode wird von .NET Compact Framework nicht unmittelbar unterstützt, da die Größe für eingeschränkte Ressourcen begrenzt werden musste.

Gewusst wie: Bilden von Unterklassen für eine Schaltfläche durch Verwenden von systemeigenen Rückrufen

Bilden von Unterklassen des Button-Steuerelements, um eine farbige graduelle Füllung anzuzeigen.

Beachten Sie, dass diese Schaltfläche hauptsächlich bereitgestellt wird, um die Verwendung von Unterklassen und Rückrufen zu veranschaulichen. Eine leichtere Möglichkeit, eine Schaltfläche mit gradueller Füllung zu erstellen, finden Sie unter Gewusst wie: Anzeigen einer graduellen Füllung.

Beide Programme für das Bilden von Unterklassen enthalten die WndProcHooker-Klasse, eine Hilfsklasse für systemeigene Win32-Strukturen, Plattformaufrufdeklarationen sowie einen WndProc-Delegaten. Codeauflistungen finden Sie unter Gewusst wie: Verwenden einer Klasse zum Verknüpfen von Windows-Prozeduren und Gewusst wie: Verwenden einer Hilfsklasse für Plattformaufrufe.

WndProcHooker-Klasse

Die WndProcHooker-Klasse ermöglicht es einem systemeigenen Steuerelement oder Fenster, einen Rückruf von verwaltetem Code aufzurufen, wenn für das betreffende Steuerelement eine bestimmte Windows-Meldung empfangen wird. Dies wird erreicht, indem die Fensterprozedur (WndProc) eines systemeigenen Steuerelements durch eine generische Fensterprozedur, WindowProc, ersetzt wird, die eine Suche durchführt, um zu bestimmen, ob sich das Steuerelement in einer Liste von Steuerelementen befindet, die aufzurufenden Rückrufmethoden zugeordnet sind. Ist dies der Fall, wird das Steuerelement möglicherweise verknüpft.

Wenn das Steuerelement verknüpft wird, bestimmt WindowProc, ob das Steuerelement für eine Reaktion auf eine bestimmte Windows-Meldung zugeordnet ist. Hierbei handelt es sich um die Meldungszuordnung, bei der eine Windows-Meldung einem WndProcCallback-Delegaten zugeordnet wird, der die verwaltete Methode mit der gewünschten Funktion aufruft. Wenn die Meldungszuordnung die Meldung enthält, ruft der WndProcCallback-Delegat den Code unter Verwendung der Meldungsparameter auf, die für WindowProc angegeben wurden.

Verknüpfen von Steuerelementen

Die HookWndProc-Methode ordnet das Steuerelementhandle einer Meldungszuordnung zu, die von der generischen Fensterprozedur WindowProc verwendet werden kann. Dies wird als Verknüpfen eines Steuerelements bezeichnet.

Die HookWndProc-Methode bestimmt, ob ein Steuerelement bereits verknüpft wurde. Ist dies nicht der Fall, erstellt sie ein HookedProcInformation-Objekt für das betreffende Steuerelement. Dieses Objekt enthält einen Verweis auf das Steuerelement und die Meldungszuordnung. Wenn das Handle für das Steuerelement bereits erstellt wurde, wird das Fenster verknüpft, indem für die spätere Wiederherstellung ein Zeiger auf die ursprüngliche Fensterprozedur des Fensters erstellt wird. Wurde das Handle noch nicht erstellt, erfolgt die Verknüpfung durch die ctrl_HandleCreated-Methode, die das HandleCreated-Ereignis behandelt.

Danach fügt die HookWndProc-Methode einer von zwei generischen Wörterbuchauflistungen das HookedProcInformation-Objekt hinzu:

  • Dem hwindDict-Wörterbuch, das eine globale Liste aller verknüpften Fensterhandles enthält. Der Schlüssel ist ein hwnd. Steuerelemente, deren Handles erstellt wurden, werden in dieses Wörterbuch eingeschlossen. Die Steuerelemente in diesem Wörterbuch werden für zugeordnete Meldungen von WindowProc ausgewertet.

  • Das ctlDict -Wörterbuch, das Steuerelemente mit nicht erstellten Handles enthält. Beim Aufrufen der ctrl_HandleCreated-Methode wird das Steuerelement in das Wörterbuch hwndDict verschoben.

Aufheben der Verknüpfung von Steuerelementen

Die UnhookWndProc-Methode bietet zwei Möglichkeiten, die Verknüpfung eines Steuerelements aufzuheben:

  • Entfernen einer Meldung aus der Meldungszuordnung für ein Steuerelement, wobei das Steuerelement jedoch im hwndDict-Wörterbuch der verknüpften Fenster verbleibt. Diese Methode stellt außerdem die ursprüngliche Fensterprozedur des Steuerelements wieder her, indem ein im HookedProcInformation-Objekt enthaltener Zeiger verwendet wird.

  • Entfernen Sie das Steuerelement aus dem hwndDict-Wörterbuch mit den verknüpften Steuerelementen. Zusätzlich muss dessen Handle entfernt und im ctrlDict-Wörterbuch platziert oder das Steuerelement vollständig verworfen werden. Diese Methode stellt außerdem die ursprüngliche Fensterprozedur des Steuerelements wieder her, indem ein im HookedProcInformation-Objekt enthaltenes Handle verwendet wird.

Bilden von Unterklassen des TreeView-Steuerelements

Die in Gewusst wie: Bilden von Unterklassen für TreeView durch Verwenden von systemeigenen Rückrufen aufgelistete TreeViewBonus-Klasse des Beispielprogramms erweitert das TreeView-Steuerelement, sodass dieses das NodeMouseClick-Ereignis enthalten kann, das in .NET Compact Framework nicht direkt verfügbar ist.

Das NodeMouseClick-Ereignis wird erhalten, indem der Meldungszuordnung für das Steuerelement, wie es die WndProcHooker-Klasse durchführt, die WM_NOTIFY-Meldung hinzugefügt wird. Die verwaltete Rückrufmethode WM_Notify_Handler ruft die systemeigene GetMessagePos-Funktion auf, um die Koordinaten des Mauscursors zum Zeitpunkt des Sendens der Windows-Meldungen abzurufen.

Beachten Sie, dass diese Koordinaten relativ zum sichtbaren Clientbereich des Bildschirms und nicht relativ zum TreeView-Steuerelement sind. Die TreeViewBonus-Klasse konvertiert Bildschirmkoordinaten mit der PointToClient-Methode für das Steuerelement in Clientkoordinaten. Dann werden diese Clientkoordinaten zusammen mit der TVM_HITTEST-Meldung gesendet, um zu bestimmen, ob und an welcher Stelle auf das TreeViewBonus-Objekt geklickt wurde.

Die TreeViewBonus-Klasse enthält Code zum Abrufen der Koordinaten relativ zum Steuerelement mithilfe der TVM_HITTEST-Meldung des systemeigenen Steuerelements.

Wenn auf einen der Knoten der Strukturansicht geklickt wurde, enthält die systemeigene TVHITTESTINFO-Struktur das Handle für den entsprechenden Knoten. Im letzten Schritt werden die verwalteten TreeView-Knoten von der FindTreeNodeFromHandle-Methode rekursiv durchlaufen, um das entsprechende Handle zu suchen und das NodeMouseClick-Ereignis auszulösen. Die TreeNodeMouseClickEventArgs-Klasse stellt die folgenden Daten bereit:

  • Den Knoten, auf den geklickt wurde.

  • Die Schaltfläche, auf die geklickt wurde.

  • Die Anzahl von Klicks, die bei 1 festgelegt wird.

  • Die x-Koordinate, an der geklickt wurde.

  • Die y-Koordinate, an der geklickt wurde.

Die TreeViewBonus-Klasse verknüpft das übergeordnete Steuerelement des systemeigenen Strukturansicht-Steuerelements mit einer verwalteten Fensterprozedur, wie von der WndProcHooker-Klasse ausgeführt. Die Reaktion auf das OnParentChanged-Ereignis erfolgt durch Verknüpfen des übergeordneten Steuerelements. Somit besteht hier die Möglichkeit, dass die TreeView zu einem neuen übergeordneten Element verschoben wurde, z. B. von Form zu Panel.

Bilden von Unterklassen des Button-Steuerelements

Die GradientFilledButton-Klasse und die GradientFill-Klasse, die in Gewusst wie: Bilden von Unterklassen für eine Schaltfläche durch Verwenden von systemeigenen Rückrufen aufgelistet sind, erweitern das Button-Steuerelement, sodass dieses eine graduelle Füllung zwischen zwei Farben anzeigen kann. Dieses Programm ist vorwiegend dafür vorgesehen, das Bilden von Unterklassen zu veranschaulichen. Eine einfachere Möglichkeit, eine graduelle Füllung bei einer Schaltfläche anzuzeigen, besteht jedoch im Erstellen eines von Control abgeleiteten benutzerdefinierten Steuerelements, wie in Gewusst wie: Anzeigen einer graduellen Füllung erläutert.

Der Konstruktor für die GradientFilledButton-Klasse erstellt Instanzen der WndProcHooker-Klasse, um Windows-Meldungen verwalteten Rückrufen zuzuordnen. Diese Rückrufmethoden zeichnen die Schaltfläche im entsprechenden Zustand, in Abhängigkeit von der Windows-Meldung und vom Zustand der Capture-Eigenschaft für das Steuerelement. In der folgenden Tabelle werden die zugeordneten Windows-Meldungen und die entsprechenden Rückrufe aufgelistet.

Windows-Meldung

Verwaltete Rückrufmethode und Beschreibung

WM_KEYDOWN

WM_KeyDown_Handler – Zeichnet die Schalfläche in gedrücktem Zustand neu, wenn die LEERTASTE oder EINGABE (oder die Aktionstaste) gedrückt wird.

WM_KEYUP

WM_KeyUp_Handler – Zeichnet die Schaltfläche im nicht gedrückten Zustand neu und löst das Click-Ereignis aus, wenn die LEERTASTE oder EINGABE (oder die Aktionstaste) gedrückt wird.

WM_LBUTTONDOWN

WM_LeftButtonDown_Hander – Zeichnet die Schaltfläche im gedrückten Zustand neu und legt die Capture-Mauseigenschaft für das Steuerelement auf true fest.

WM_LBUTTONUP

WM_LButtonUp_Handler – Zeichnet die Schaltfläche im nicht gedrückten Zustand neu, löst das MouseUp-Ereignis aus, wenn der Cursor im Clientbereich des Steuerelements losgelassen wird, und legt die Capture-Mauseigenschaft für das Steuerelement auf false fest.

WM_MOUSEMOVE

WM_MouseMove_Handler – Zeichnet die Schaltfläche neu, wenn zuvor darauf geklickt wurde und Capture gleich true ist.

WM_PAINT

WM_Paint_Handler – Zeichnet die Schaltfläche im entsprechenden Zustand neu.

Diese verwalteten Rückrufmethoden verwenden die DrawButton-Methode, um die Schaltfläche im entsprechenden Zustand zu zeichnen. Diese Methode verfügt über zwei Überladungen zum Zeichnen der Schaltfläche, in einem Fenster, wie in diesem Beispiel, oder in einem Graphics-Objekt. Beide Überladungen nehmen einen booleschen Wert an, der true ist, wenn auf die Schaltfläche geklickt wurde.

Die GradientFilledButton-Klasse verwendet die GradientFill-Klasse, um für das Füllen Plattformaufrufe von systemeigenem Code auszuführen. Die GradientFill-Klasse stellt Eigenschaften bereit, um die Start- und die Endfarben festzulegen und um die Füllrichtung von links nach rechts oder von oben nach unten anzugeben.

Siehe auch

Aufgaben

Gewusst wie: Verwenden einer Klasse zum Verknüpfen von Windows-Prozeduren

Gewusst wie: Verwenden einer Hilfsklasse für Plattformaufrufe

Gewusst wie: Bilden von Unterklassen für TreeView durch Verwenden von systemeigenen Rückrufen

Gewusst wie: Anzeigen einer graduellen Füllung

Konzepte

Gewusst-wie-Themen für .NET Compact Framework

Weitere Ressourcen

Interoperabilität in .NET Compact Framework