Signatur
Beschreibung
UI\Area ist ein Steuerelement (Control) aus der PHP-UI-Erweiterung (ui), das eine freie Zeichenfläche innerhalb eines Fensters bereitstellt. Auf dieser Fläche kann mithilfe eines UI\Draw\Pen-Objekts beliebige Vektorgrafik gezeichnet werden. Gleichzeitig empfängt das Area-Steuerelement Eingabeereignisse wie Mausklicks, Mausbewegungen und Tastendrücke.
Die eigentliche Zeichenlogik sowie die Ereignisbehandlung werden durch Überschreiben der Methoden onDraw(), onMouse(), onMouseCross(), onKey() und onDragBroken() implementiert. UI\Area ist als abstrakte Basisklasse konzipiert – man leitet davon eine eigene Klasse ab und implementiert mindestens onDraw(), um Inhalte zu rendern.
Typische Anwendungsfälle sind eigene Grafik-Widgets, Diagramme, einfache Zeichenprogramme, Spiel-UIs oder interaktive Visualisierungen im Rahmen einer nativen Desktop-Anwendung mit PHP-UI.
- Zeichenoperationen nutzen die Klassen
UI\Draw\Path,UI\Draw\Pen,UI\Draw\BrushundUI\Draw\Stroke. - Mausereignisse werden als
UI\Draw\Point-Koordinaten und Button-/Modifier-Informationen übergeben. - Die Methode
redraw()fordert ein Neuzeichnen der Fläche an.
Beispiele
Einfache Zeichenfläche mit rotem Rechteck
<?php
use UI\Area;
use UI\Draw\Pen;
use UI\Draw\Path;
use UI\Draw\Brush;
use UI\Draw\Color;
use UI\Draw\Stroke;
use UI\Size;
use UI\Point;
use UI\Window;
use UI\Box;
class MeineFlaeche extends Area {
protected function onDraw(Pen $pen, Size $areaSize, Point $clipPoint, Size $clipSize): void {
// Hintergrund weiß füllen
$hintergrund = new Path(Path::Winding);
$hintergrund->addRectangle(new Point(0, 0), $areaSize);
$hintergrund->end();
$weiss = new Brush(Brush::Solid, new Color(0xFFFFFF, 1.0));
$pen->fill($hintergrund, $weiss);
// Rotes Rechteck zeichnen
$pfad = new Path(Path::Winding);
$pfad->addRectangle(new Point(20, 20), new Size(160, 100));
$pfad->end();
$rot = new Brush(Brush::Solid, new Color(0xFF0000, 1.0));
$pen->fill($pfad, $rot);
}
}
$fenster = new Window('Zeichenfläche', new Size(300, 200), false);
$fenster->setMargin(true);
$box = new Box(Box::Vertical);
$flaeche = new MeineFlaeche();
$box->append($flaeche, true);
$fenster->add($box);
$fenster->show();
UI\run();
Mausereignisse auf der Area verarbeiten
<?php
use UI\Area;
use UI\Draw\Pen;
use UI\Draw\Point;
use UI\Size;
use UI\Window;
use UI\Box;
class KlickFlaeche extends Area {
private array $punkte = [];
protected function onDraw(Pen $pen, Size $areaSize, \UI\Draw\Point $clipPoint, Size $clipSize): void {
// Jeden gespeicherten Klick-Punkt als kleinen Kreis rendern
foreach ($this->punkte as $p) {
$pfad = new \UI\Draw\Path(\UI\Draw\Path::Winding);
$pfad->newFigureWithArc($p, 5, 0, 2 * M_PI, false);
$pfad->end();
$blau = new \UI\Draw\Brush(\UI\Draw\Brush::Solid, new \UI\Draw\Color(0x0000FF, 1.0));
$pen->fill($pfad, $blau);
}
}
protected function onMouse(\UI\Draw\Point $pos, Area $area, int $button, bool $pressed, int $mods): void {
if ($pressed && $button === 1) {
$this->punkte[] = $pos;
$this->redraw();
}
}
}
$fenster = new Window('Klick-Demo', new Size(400, 300), false);
$fenster->setMargin(true);
$box = new Box(Box::Vertical);
$flaeche = new KlickFlaeche();
$box->append($flaeche, true);
$fenster->add($box);
$fenster->show();
UI\run();
// Wichtig · Fallstricke
Abstrakte Verwendung: UI\Area ist nicht direkt instanziierbar und muss stets abgeleitet werden. Mindestens onDraw() sollte überschrieben werden, da sonst keine Darstellung stattfindet.
Verfügbarkeit: Die ui-Erweiterung ist keine Standard-PHP-Erweiterung und muss separat über PECL installiert werden (pecl install ui). Sie basiert auf der libui-Bibliothek und ist für Windows, macOS und Linux verfügbar.
Koordinatensystem: Der Ursprung (0, 0) befindet sich oben links. Alle Größen- und Positionsangaben erfolgen in Gleitkommazahlen (Float) innerhalb der Draw-API.
Neuzeichnen: Änderungen werden erst nach einem Aufruf von redraw() sichtbar. In onDraw() selbst sollte redraw() nicht aufgerufen werden, da dies zu Endlosschleifen führen kann.