diff options
author | Graeme Geldenhuys <graemeg@users.sourceforge.net> | 2006-12-06 23:16:34 +0000 |
---|---|---|
committer | Graeme Geldenhuys <graemeg@users.sourceforge.net> | 2006-12-06 23:16:34 +0000 |
commit | c91eebac7b6d141d2da3114537942850accccab8 (patch) | |
tree | 74b6f30b9ec5ae7d428d142206d3663008673ab1 /docs | |
parent | 1ef11a6d9353b976aa51856b1909f28f8750670b (diff) | |
download | fpGUI-c91eebac7b6d141d2da3114537942850accccab8.tar.xz |
* Added CreateBitmapCanvas and CreateMonoBitmapCanvas to TFCustomScreen class.
This is required for Styles to work. It could maybe be moved to another class
if needed.
* Create the missing instances for ImageCanvas, MaskCanvas and Palette in TDefaultStyle.
* Removed the ADisplay parameter from the TStyle constructor.
* Adapted the UTF Demo to work with the fpGUI changes. Tested under Linux only.
Diffstat (limited to 'docs')
-rw-r--r-- | docs/layouting_de.html | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/docs/layouting_de.html b/docs/layouting_de.html new file mode 100644 index 00000000..0d2f5c0c --- /dev/null +++ b/docs/layouting_de.html @@ -0,0 +1,129 @@ +<html><head><title>fpGUI Layouting</title> + + +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +<meta name="Generator" content="LaTeX2HTML v2K.1beta"></head><body> + +<h1><a name="SECTION00010000000000000000"> +Der fpGUI Layouting-Algorithmus</a> +</h1> + +Sebastian Günther, 2001-02-12 + +<p> + +</p><h2><a name="SECTION00011000000000000000"> +Initialisierung eines Fensters (Forms)</a> +</h2> + +<p> +Wenn sich ein Fenster zum ersten Mal darstellt, und keine Standardgröße vorgegeben +wurde, dann muß es diese selbst berechnen. Dies ist ein rekursiver Prozeß, bei +dem allen Kindern des Fensters das Ereignis <tt>TCalcSizesEventObj</tt> von +oben nach unten im Widget-Baum zugestellt wird (beginnend beim Fenster selbst). +<tt>TWidget</tt> reagiert auf den Empfang dieses Ereignisses folgendermaßen +(in <tt>TWidget.EvCalcSizes</tt>): + +</p><p> + +</p><ol> +<li>Das Ereignis wird mit <tt>TWidget.DistributeEvent</tt> an alle Kinder weitergeleitet +</li> +<li>Die virtuelle geschützte Methode <tt>TWidget.DoCalcSizes</tt> wird aufgerufen. +Abgeleitete Widgets überschreiben diese Methode, um ihre Größen (Minimum, Maximum, +Optimum) neu zu berechnen. +</li> +<li>Die Ergebnisse von <tt>DoCalcSizes</tt> werden ggf. korrigiert, z.B. darf die +Maximalgröße nicht kleiner als die Minimalgröße sein. +</li> +</ol> +Wenn der Code für das Fenster den Versand dieses Ereignisses fertiggestellt +hat, haben alle Widgets im Fenster gültige Größenangaben. Nun kann es seine +eigene, initiale Größe setzen (dies ist die vorher berechnete Optimum-Größe +des Fensters). Dies wird per <tt>TWidget.SetBounds</tt> durchgeführt. + +<p> + +</p><h2><a name="SECTION00012000000000000000"> +Zuweisung einer neuen Position und Größe mit <tt>TWidget.SetBounds</tt></a> +</h2> + +<p> +<tt>SetBounds</tt> dient zwei Zwecken: Dem Setzen einer neuen Position, und +dem Setzen einer neuen Größe für ein Widget. Zunächst werden die neuen Daten +ins Widget übernommen. <tt>SetBounds</tt> überprüft anschließend, ob eine Größenänderung +vorliegt - wenn ja, wird ein <tt>TApplySizeEventObj</tt>-Ereignis ausgelöst. +Der Default-Handler in TWidget führt nun zwei einfache Schritte durch: + +</p><p> + +</p><ol> +<li>Aufruf der virtuellen geschützten Methode <tt>TWidget.DoApplySize</tt> +</li> +<li>Weiterleitung des Ereignisses an alle Kinder per <tt>TWidget.DistributeEvent</tt> +</li> +</ol> +<tt>DoApplySize</tt> dürfte von allen Widgets überschrieben werden, die Kinder +besitzen - denn dies ist der einzig richtige Ort, um die Kinder zu layouten +(also ihre Position und Größe festzulegen.) + +<p> +Das <tt>TApplySizeEventObj</tt>-Ereignis führt ein wichtiges Flag mit: <tt>ForcedSize</tt> +gibt an, ob die nun folgende Größenänderung 'erzwungen' ist oder nicht. Erzwungen +bedeutet, daß Änderungen an untergeordneten Widgets (s.u.) <i>keinen</i> erneuten +Layout-Vorgang auslösen sollen. Dies wird beispielsweise in folgenden Fällen +genutzt: + +</p><p> + +</p><ul> +<li>Der Anwender hat ein Fenster manuell auf eine bestimmte Größe gebracht +</li> +<li>Eine ScrollBox löscht üblicherweise dieses Flag für ihre Kinder auf jeden Fall, +da der Inhalt der ScrollBox meist unabhängig von dem 'Drumherum' ist. +</li> +</ul> +Der aktuelle 'Gezwungenheits-Zustand' wird über das Flag <tt>wsSizeIsForced</tt> +in <tt>TWidget.WidgetState</tt> angezeigt. + +<p> +Forms behandeln dieses Ereignis auf etwas andere Art und Weise: Der Wunsch nach +einer Größenänderung wird an das unterliegende fpGFX-Fenster weitergeleitet; +dieses liefert irgendwann die Nachricht, daß nun die neue Größe aktiv ist. Als +Reaktion ruft es nun <tt>TWidget.SetBounds</tt> <i>für sich selbst</i> auf - +also die geerbte Methode. Diese sorgt dann, wie bei anderen Widgets auch, für +ein korrektes Layouting. + +</p><p> + +</p><h2><a name="SECTION00013000000000000000"> +Änderungen eines Widgets</a> +</h2> + +<p> +Wenn sich bestimmte Eigenschaften eines Widgets ändern, kann sich dadurch auch +dessen Größe ändern. Bei Verdacht auf Größenänderung sollten Widgets intern +immer die Methode <tt>TWidget.Update</tt> aufrufen. Ist die Größe des aktuellen +Widgets erzwungen, so bricht diese Methode sofort ab. Ansonsten wird zunächst +eine neue Berechnung der Größen per <tt>TCalcSizesEventObj</tt>-Ereignis veranlaßt. +Sollten diese nun von den alten Größen abweichen, so wird das Ereignis <tt>TUpdateEventObj</tt> +ausgelöst. Dieses wird <tt>nicht</tt> an Kinder weitergeleitet, stattdessen +ruft der Default-Handler in <tt>TWidget</tt> die <tt>Update</tt>-Methode des +Eltern-Widgets auf. Der Handler für Forms reagiert auf dieses Ereignis allerdings +mit einer Anpassung der Fenstergröße mit Hilfe der <tt>SetBounds</tt>-Methode. + +</p><p> + +</p><h2><a name="SECTION00014000000000000000"> +Widget ändert seine Sichtbarkeit</a> +</h2> + +<p> +Wenn ein normales Widget sichtbar oder unsichtbar wird, und diese Änderung vom +Widget selbst (und nicht seinem Eltern-Widget) ausgelöst wurde, dann wird für +das Eltern-Widget die <tt>TWidget.Update</tt>-Methode aufgerufen. Dieses prüft +nun den Einfluß dieser Änderung auf das Layout, und löst ggf. ein Relayouting +aus. + + +</p></body></html>
\ No newline at end of file |