Start · Sprachen · PHP · Referenz · UI\Area

UI\Area

Klasse

Repräsentiert eine Zeichenfläche in einer UI-Anwendung, die Grafik sowie Maus- und Tastaturereignisse verarbeitet.

seit PHP 0.9.9 Kategorie: misc

Signatur

class UI\Area extends UI\Control

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\Brush und UI\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.