4.12 ColorSelectorEin ColorSelector stellt die UI bereit, die notwendig ist, um eine Farbe, ein Füllmuster oder ein Füllraster auszuwählen.
Welche der Eigenschaften (Farbe, Füllmuster, Raster) dem Nutzer zur Auswahl angeboten werden kann eingestellt werden. Per Default sind es nur die Indexfarben.
Sie können einen Actionhandler vereinbaren, der gerufen werden soll, wenn der Nutzer eine der Eigenschaften ändert oder Sie können die eingestellten Eigenschaften manuell abfragen. Abstammung:
Der ColorSelector erbt alle Eigenschaften und Fähigkeiten der GenericClass. Spezielle Instance-Variablen:
Action-Handler-Typen:
csFeaturesDie Instancevariable csFeatures bestimmt, welche UI der ColorSelector dem Nutzer anbietet. Per Default ist nur das Bit CSI_INDEX gesetzt, das heißt der ColorSelector bietet nur die Liste mit den ersten 16 Indexfarben an. Die folgenden Werte stehen für csFeatures zur Verfügung:
Beachten Sie, dass csFeatures Bitflags sind. Eine Verknüpfung der einzelnen Werte ist mit dem Operator '+' oder mit einem logischen OR möglich. Beispiel: Ein ColorSelector der die Indexfarben und das Einstellen von RGB-Werten unterstützt. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ColorSelector DemoColors csFeatures = CFS_INDEX OR CSF_RGB End Object | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Hinweise:
csColor, csIndexColorDie Instancevariable csColor enthält den aktuell vom ColorSelector ausgewählten Farbwert. Es hängt von den Umständen ab, ob csColor beim Auslesen einen RGB-Farbwert oder einen Indexwert liefert. Selbst wenn eine Indexfarbe gewählt ist kann csColor einen (natürlich den zugehörigen) RGB-Farbwert liefern. Wenn Sie sicher sein wollen, dass Sie eine Indexfarbwert erhalten müssen Sie die Instancevariable csIndexColor abfragen. Sollte eine Farbe ausgewählt sein, der kein Farbindex entspricht wird derjenige Index zurückgegeben, der der ausgewählten Farbe am besten entspricht.Für die Zuweisung an csColor sind sowohl RGB- als auch Indexfarben zulässig, csIndexColor kann nur gelesen werden.
Syntax Lesen: <numVar> = <obj>.csColor
<numVar> = <obj>.csIndexColor
Schreiben: <obj>.csColor = farbwert
UI-Code: csColor = farbwert
farbwert: RGB-Farbwert oder Indexfarbe
Die numerischen Werte der Indexfarben liegen im Bereich von Null bis 255. RGB-Farbwerte berechnen sich nach der Formel "rot + 256 * grün + 65536 * blau + 16777216"oder gleichwertig hexadezimal "rot + &h100 * grün + &h10000 * blau + &h1000000".Mehr zum Thema Farben finden Sie im Kapitel 2.8.2 "Beschreibung von Farben" des R-BASIC Programmierhandbuchs. csDrawMask, csDrawMaskValueDer ColorSelector bietet unter der Bezeichnung "Raster" eine Auswahl von Füllmustern an, die als "Transparenzgrad" angesehen werden können. Die numerischen Werte dieser Füllmuster liegen im Bereich von 25 (vollständig deckend, Raster 100%) bis 89 (vollständig transparent, Raster 0%). Das sind 64 Stufen für den Transparenzgrad. Die Instancevariable csDrawMask enthält diese numerischen Werte. Sie kann gelesen und geschrieben werden.Die Instancevariable csDrawMaskValue enthält die aus csDrawMask berechneten Prozentwerte ( 0 bis 100). Dabei wird intern die folgende Formel benutzt: csDrawMaskValue = ( 89 - csDrawMask) * 100 / 64Beim Schreiben von csDrawMaskValue wird die entsprechende Umkehrformel verwendet. Beachten Sie, dass es durch die Stufung in 64 Schritte zu leichten Abweichungen der Werte kommen kann.
Syntax Lesen: <numVar> = <obj>.csDrawMask
Schreiben: <obj>.csDrawMask = raster
UI-Code: csDrawMask = raster
raster: Numerischer Wert des Rasters, Werte 25 bis 89
Syntax Lesen: <numVar> = <obj>.csDrawMaskValue
Schreiben: <obj>.csDrawMaskValue = raster
UI-Code: csDrawMaskValue = raster
raster: Numerischer Wert des Rasters, in Prozent (0 bis 100)
Die Werte für csDrawMask können direkt mit den Feldern lineDrawMask, areaDrawMask und textDrawMask der Systemvariablen "graphic" verwendet werden um das Füllmuster von Linien, Flächen und Texten einzustellen. Alternativ können Sie den Wert von csFillPattern oder jeden anderen Wert von 0 bis 255 für die Felder lineDrawMask, areaDrawMask und textDrawMask der Systemvariablen "graphic" benutzen. Mehr zum Thema Füllmuster finden Sie im Programmierhandbuch, Kapitel 2.8.4 (Die Systemvariable "graphic": Mixmodes und mehr) sowie im Anhang, Abschnitt C. Dort sind weitere Beispiele für Füllmuster angegeben.
csFillPatternDer ColorSelector bietet eine kleine Auswahl von grafischen Füllmustern an. Die Instancevariable csFillPattern enthält diese Auswahl. Im Bild sind die zugehörigen numerischen Werte dargestellt.
Syntax Lesen: <numVar> = <obj>.csFillPattern
Schreiben: <obj>.csFillPattern = muster
UI-Code: csFillPattern = muster
muster: Numerischer Wert des Füllmusters
Diese Füllmuster können mit den Feldern lineDrawMask, areaDrawMask und textDrawMask der Systemvariablen "graphic" verwendet werden um das Füllmuster von Linien, Flächen und Texten einzustellen. Alternativ können Sie den Wert von csDrawMask oder jeden anderen Wert von 0 bis 255 für die Felder lineDrawMask, areaDrawMask und textDrawMask der Systemvariablen "graphic" benutzen. Mehr zum Thema Füllmuster finden Sie im R-BASIC Programmierhandbuch, Kapitel 2.8.4 (Die Systemvariable "graphic": Mixmodes und mehr) sowie im Anhang, Abschnitt C. Dort sind weitere Beispiele für Füllmuster angegeben. ColorChangedHandlerDie Instancevariable ColorChangedHandler enthält den Namen des ActionHandlers der aufgerufen werden soll, wenn der Nutzer eine der vom ColorSelector angebotenen Eigenschaften (also auch Raster und Füllmuster) ändert.
Syntax UI-Code: ColorChangedHandler = <Handler>
Schreiben: <obj>.ColorChangedHandler = <Handler>
ColorChangedHandler müssen als ColorAction deklariert sein. Diesem Handler werden die folgenden Parameter übergeben:
Beispiel: Der Actionhandler soll eine farbige Figur auf dem Bildschirm zeichnen. Farbe und Füllmuster sollen durch den ColorSelector, der den ActionHandler gerufen hat, bestimmt werden. Da in R-BASIC Raster und Füllmuster nicht gleichzeitig angewendet werden können wird der Raster-Wert dann verwendet, wenn das Füllmuster auf "vollständig ausgefüllt" gestellt ist. Dem entspricht die in R-BASIC definierte Konstante DM_100 mit dem Zahlenwert 25. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ColorAction ColorChangedNotification
DIM mask
IF csFillPattern = DM_100 THEN
mask = csDrawMask
ELSE
mask = csFillPattern
END IF
' Belegen der Systemvariablen graphic
graphic.areaDrawMask = mask
graphic.areaColor = csColor
FillEllipse 10, 10, 300, 150
END ACTION
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Der dazugehörige ColorSelector ist folgendermaßen definiert: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ColorSelector DemoColorSel
caption$ = "Farbauswahl"
justifyCaption = J_CENTER
DrawInBox
csFeatures = CSF_INDEX + CSF_MORE_COLORS + CSF_RGB + \
CSF_FILL_PATTERN + CSF_DRAW_MASK
csDrawMask = 58
csFillPattern = 8
ColorChangedHandler = ColorChangedNotification
End OBJECT
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Dieser ColorSelector ruft den Handler ColorChangedNotification jedes Mal, wenn der Nutzer die Farbe, das Füllmuster oder das Raster ändert. Ändert er alle drei Eigenschaften wird der Handler auch drei Mal gerufen. Um das zu umgehen definieren Sie am einfachsten keinen ColorChangedHandler und fragen die Werte für csColor, csDrawMask und csFillPattern manuell ab. Das kann z.B. in einem Button-Handler (Button "Anwenden") geschehen.
Die hier beschriebenen Codefragmente finden Sie komplett als Beispiel unter "R-BASIC\Beispiel\Objekte\Grafik\ColorSelector Demo". Erfahrene Programmierer finden vielleicht die folgenden Informationen hilfreich: Wenn Sie im UI Code des ColorSelectors den Hint MakeDelayedApply setzen oder den ColorSelector in einem Dialog verwenden, der den Dialogtyp dialogType = DT_DELAYED_APPLY hat, arbeitet der ColorSelector im sogenannten "Delayed Mode", der im Kapitel 3.4.2 beschrieben ist. In diesem Modus ruft der ColorSelector seinen ColorChangedHandler erst auf, wenn er durch Aufruf der Methode "Apply" dazu aufgefordert wird. Innerhalb eines Dialogs mit dialogType = DT_DELAYED_APPLY wird der benötigte "Anwenden" Button automatisch erzeugt und auch die Methode "Apply" wird automatisch gerufen. Das System nimmt Ihnen also sehr viel Arbeit ab. Ansonsten müssen Sie den Button selbst definieren. Der ActionHandler sieht dann so aus: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
BUTTONACTION SendApply DemoColorSel.Apply END ACTION | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Beachten Sie, dass Sie keinen Zugriff auf die Status-Messages des ColorSelectors haben. Diese werden auf Systemebene intern verwendet.
^ |