home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
1990
/
09
/
grdlagen
/
textbox.asc
< prev
next >
Wrap
Text File
|
1990-07-16
|
5KB
|
137 lines
Erklärende Hinweise zu:
" Begegnungen mit OS/2, Teil 6 "
" Wenn der Text nicht in das Fenster paßt... "
( Theorie und Praxis des Scrollens mit dem PM, toolbox 9/90 )
( vergleiche Listing und Kommentare in "Scroll1.C" )
( der 2. Teil zum Thema Scolling wird voraussichtlich in 10/90 erscheinen )
Fensterklassen und Fensterprozeduren:
Was im Client eines Fensters passiert, wird gesteuert von einer
selbstgeschriebenen Fensterprozedur wie ClientWindowProc. Die
Beziehung zwischen dem Fenster und den zugehörigen Prozeduren erfolgt
aber nicht direkt, sondern über den Umweg der Fensterklassen. Ganz
allgemein gehört zu jeder Fensterklasse genau 1 Fensterprozedur.
Jedoch können mehrere Fenster zu derselben Klasse gehören. Wenn 2
Fenster zu derselben Fensterklasse gehören, reagieren sie gleich.
In unserem Beispielprogramm wird mit WinRegisterClass die Prozedur
ClientWindowProc der Klasse szClientClass (eigener Name) zugeordnet.
Weil diese Klasse im 4. Argument von WinCreateStdWindow angegeben ist,
wird für alle Messages des Client die Fensterprozedur ClientWindowProc
aufgerufen.
Abgesehen von diesen selbst zu definierenden Fensterprozeduren und
Fensterklassen, gibt es auch PM-interne ("pre-defined") Klassen und
Prozeduren. Da auch die internen Fensterprozeduren zu bekannten
Klassen gehören, kann man diese benutzen und durch zusätzliche
Filtermechanismen (zum Beispiel Subclassing) modifizieren, ohne sie im
Detail zu kennen. Jedoch wäre es sicher jedem Programmierer noch
lieber, wenn er die Sourcen selbst ansehen könnte, so wie es jeder
MOTIF-Programmierer kann.
Zu den internen gehört auch die Klasse der Scrollbars. Die PM-internen
Fensterklassen haben eindeutige Nummern, die in PMWIN.h definiert
sind: z.B. WC_SCROLLBAR oder WC_TITLEBAR für den Titel.
Ein mit dem Flag FCF_VERTSCROLL in WinCreateStdWindow erzeugter
senkrechter Scrollbar gehört also zur Klasse WC_SCROLLBAR.
So wie jede Klasse ihre Nummer hat, so hat auch jedes Fenster seine
ID: der senkrechte Scrollbar hat die ID FID_VERTSCROLL.
Statt den Scrollbar mit WinCreateStdWindow und FCF_VERTSCROLL zu
erzeugen, könnte man ihn auch mit WinCreateWindow erzeugen: diese noch
allgemeinere Fenstergenerierungsprozedur verlangt explizit die Klasse
( WC_SCROLLBAR ) und die Fenster-ID. Außerdem ist der Stil des
Fensters mit SBS_VERT anzugeben, wenn man einen senkrechten Scrollbar
erzeugen will; beim waagrechten ist SBS_HORZSCROLL anzugeben.
Scrollbars sind eine besondere Sorte von Controls: zusätzlich zu der
PM-internen Fensterprozedur muß in der Anwendung noch eine Menge Logik
implementiert werden: der durch FCF_VERTSCROLL erzeugte Scrollbar ist
nur da, um in bestimmten Situationen Messages zu senden oder zu
empfangen. In den anderen Fensterbereichen passiert dadurch aber nur
etwas, wenn man die Reaktionen auf die vom Scrollbar abgeschickten
Messages explizit codiert.
Notification-Messages:
Ebenso wie der Titel, die System-Menübox, die
Minimize/Maximize-Box und der Actionbar gehören auch die
Scrollbars zu den Kindern des Frames. Der Frame ist aber
nicht nur der Vater, sondern auch der "Owner" dieser
Fenster. Umgekehrt heißen diese Fenster "Controls" des
Frames. Die Owner-Control-Beziehung hat im Unterschied
zur Vater-Kind-Beziehung nichts mit der Anzeige und dem
Clippen der Fenster zu tun. Die Owner-Control-Beziehung
bestimmt, an wen Messages zwischen Fenstern
weitergegeben werden. Ein Fenster hat stets einen Vater
- dagegen muß ein Fenster nicht unbedingt einen Owner
haben! Siehe auch im Kasten "Fensterbeziehungen".
Controls schicken sogenannte Notification-Messages an
ihren Owner, wenn der Benutzer mit den Controls
kommuniziert. Der Owner verarbeitet diese Messages:
"verarbeiten" bedeutet meist weiterleiten! Wenn der
Benutzer irgendwo im Scrollbar klickt, schickt dieser
eine WM_VSCROLL- (bzw. WM_HSCROLL-) Message an den
Frame. Dieser wiederum schickt sie an den Client, dessen
Fensterprozedur sie dann endgültig verarbeitet.
Fensterbeziehungen:
Die Beziehungen zwischen Fenstern kann man mit WinQueryWindow
erfragen. Die wichtigsten Fragen sind die nach dem Vater und die nach
dem Owner eines gegebenen Fensters (gegeben heißt, daß man den Handle
des Fensters kennt). Beispielsweise erhält man den Vater von
hwndClient mit
hwndFrame = WinQueryWindow( hwndClient,
QW_PARENT,
FALSE );
Die Beziehung zwischen dem 1. Argument und dem Handle des Ergebnis-
Fensters wird also über das 2. Argument festgelegt: der PM unterstützt
eine ganze Anzahl von Konstanten, die alle mit dem Präfix QW_
beginnen. Um den Owner von hwndClient zu bestimmen, müßte man als 2.
Argument also QW_OWNER angeben. Die anderen QW-Konstanten betreffen
die sogenannte Z-Order der Fenster. Dies benötigen wir im Moment aber
ebensowenig wie das 3. Argument, mit dem man Fenster sperren kann.
-- ENDE --