DefWindowProc

27/01/2009 - 22:31 von Ulf Hansen | Report spam
Hallo!
Kann mir jemand in wirklich einfach Worten DefWindowProc in Bezug auf
Subclassing erklàren?
Ich verstehe z. B. nicht, was "Standardnachrichtenprozedur" bedeutet
(das ist ja wohl DefWindowProc, oder?) und in welcher Reihenfolge da was
aufgerufen wird.

Ich habe zwar eine Idee, wie es laufen könnte, aber ich weiß nicht, ob
's stimmt...

1) Benutzer klickt auf mein Fenster
2) Im Subclassing kann ich die Nachricht, die <WAS MUSS ICH HIER
EINSETZEN?> an DefWindowProc sendet, veràndern und weiterleiten an <WAS
MUSS ICH HIER EINSETZEN?>...

Oh Mann, alles total verzwickt, ich habe es einfach noch nicht verstanden...

Danke für die Hilfe!
Ulf
 

Lesen sie die antworten

#1 Thorsten Albers
28/01/2009 - 00:54 | Warnen spam
Ulf Hansen schrieb im Beitrag
...
Kann mir jemand in wirklich einfach Worten DefWindowProc in Bezug auf
Subclassing erklàren?
Ich verstehe z. B. nicht, was "Standardnachrichtenprozedur" bedeutet
(das ist ja wohl DefWindowProc, oder?) und in welcher Reihenfolge da was
aufgerufen wird.



Jedes Fenster in Windows gehört einer bestimmten Fensterklasse an. Die
Fensterklasse umfaßt den für die Darstellung und Funktionalitàt eines
Fensters dieser Klasse notwendigen Code und ggfs. die dafür notwendigen
Daten. Eine Fensterklasse ist in einer ausführbaren Datei wie z.B. einer
DLL oder einem OCX definiert. Da ein Fenster ein gewisses Grundverhalten
zeigen muß, mit dem es sich in die Fensterverwaltung von Windows
eingliedert, und da auch für seine eigene spezielle Funktionalitàt ein
gewisses Standard-Verhalten definiert sein muß, muß jede Fensterklasse
bestimmte Nachrichten von Windows verarbeiten und ggfs. darauf reagieren.
Damit Windows weiß, wohin es diese Nachrichten für diese Zwecke schicken
muß, muß jede Fensterklasse eine Standard-Nachrichtenprozedur definieren.
Diese liegt dann natürlich auch in der ausführbaren Datei, in der die
Fensterklasse definiert ist.
Die Standard-Nachrichtenprozedur jeder Fensterklasse muß die von Windows
für eine Standard-Nachrichtenprozedur vorgegebene Anzahl und Datentypen bei
Argument und Rückgabewert haben; der Prozedurname dagegen spielt keine
Rolle. Da die Subclassing-Nachrichtenprozedur aus Sicht von Windows die
Standard-Nachrichtenprozedur ersetzt, gilt das gleiche für sie.

Ich habe zwar eine Idee, wie es laufen könnte, aber ich weiß nicht, ob
's stimmt...
1) Benutzer klickt auf mein Fenster
2) Im Subclassing kann ich die Nachricht, die <WAS MUSS ICH HIER
EINSETZEN?> an DefWindowProc sendet, veràndern und weiterleiten an <WAS
MUSS ICH HIER EINSETZEN?>...



Beim Subclassing wird die Standard-Nachrichtenprozedur durch eine eigene
Nachrichtenprozedur ersetzt oder dieser eine vor- bzw. nachgeschoben, je
nachdem ob und wann Du eine Nachricht aus Deiner eigenen Prozedur an die
Standardprozedur weiterleitest.
Deine Subclassing-Nachrichtenprozedur empfàngt alle Nachrichten, die von
Windows oder anderen Fenstern sonst an die Standard-Nachrichtenprozedur
geschickt würden. Das können Nachrichten sein, die von Windows aufgrund
bestimmter speziell dieses Fenster betreffender oder allgemeiner Ereignisse
verschickt werden. Ein anderer Prozeß kann aber auch ganz gezielt eine
Nachricht an das Fenster verschicken, die dann auch in der Standard- bzw.
der Subclassing-Nachrichtenprozedur ankommen. Ein Prozeß kann sogar selbst
an bzw. zwischen seinen Fenstern Nachrichten hin- und herschicken.

Wie Du in der Subclassing-Nachrichtenprozedur auf eine Nachricht reagierst
und was Du mit ihr machst, ist von der Nachricht, der Fensterklasse und
dem, was Du erreichen willst abhàngig. Subclassing wird in der Regel dann
verwendet, wenn eine bereits existierende umfangreiche Fensterklasse in
gewissem Umfang angepaßt werden soll (für umfangreiche Anpassungen
empfiehlt es sich meistens, eine eigene neue Fensterklasse anzulegen - in
VB z.B. mit Hilfe eines UserControls). Daher ist das übliche Vorgehen:

- Die Subclassing-Prozedur empfàngt eine Nachricht.
- Die Nachricht wird zunàchst an die Standard-Nachrichtenprozedur
geschickt, um das Standardverhalten zu ermöglichen.
- Dann reagiert die Subclassing-Prozedur ggfs. auf die Nachricht in der
gewünschten Weise.

Alle Nachrichten, die nicht von der Subclassing-Prozedur behandelt werden,
sollten, solange nicht wirklich ein ganz spezielles Verhalten gewünscht
wird, auf jeden Fall an die Standard-Nachrichtenprozedur weitergeleitet
werden!

Leitet die Subclassing-Prozedur die Nachricht einfach nur weiter, sollte
sie als Rückgabewert zurückgeben, was die StandardProzedur zurückgegeben
hat, ebenso natürlich, wenn die Subclassing-Prozedur nichts
Nachrichtenspezifisches veràndert hat. Ansonsten muß die
Subclassing-Prozedur einen Wert entsprechend der Dokumentation der
jeweiligen Nachricht zurückgeben.
Bei Nachrichten des Windows-API wird hàufig gar keine Rückgabe erwartet
oder einfach nur ein Wert = 0 bzw. <> 0 als Hinweis darauf, daß die
Subclassing/Standard-Prozedur die Nachricht bearbeitet hat. Weiterführende
Rückgabewerte sind eher die Ausnahme und müssen der
Nachrichten-Dokumentation im MSDN entnommen werden. Wenn eine erweiterte
Rückgabe von der Subclassing/Standard-Prozedur erwartet wird, wird dieser
in der Regel in 'lParam' oder 'wParam' ein Zeiger auf Speicher übergeben,
in welchen die Subclassing/Standard-Prozedur die Rückgabewerte schreiben
soll.

Bsp.:

Links-Klick auf Fenster

Subclassing-Prozedur erhàlt WM_LBUTTONDOWN-Nachricht

Subclassing-Prozedur leitet WM_LBUTTONDOWN-Nachricht weiter an
Standard-Prozedur

Subclassing-Prozedur ruft Beep in Reaktion auf WM_LBUTTONDOWN auf

Subclassing-Prozedur gibt Rückgabewert von Standard-Prozedur zurück

Thorsten Albers

albers (a) uni-freiburg.de

Ähnliche fragen