4.12 ColorSelector

Ein 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:

Instancevariable Syntax im UI-Code Im BASIC-Code
ColorChangedHandler ColorChangedHandler = <Handler> nur schreiben
csFeatures csFeatures = numVal lesen, schreiben
csColor csColor = numVal lesen, schreiben
csIndexColor -- nur lesen
csDrawMask csDrawMask = numVal lesen, schreiben
csDrawMaskValue csDrawMaskValue = numVal lesen, schreiben
csFillPattern csFillPattern = numVal lesen, schreiben

Action-Handler-Typen:

Handler-Typ Parameter
ColorAction (sender as object, csColor as DWord, csDrawMask as Byte, csFillPattern as Byte)


csFeatures

Die 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:

Konstante Wert hex. Bereitgestellte Eigenschaft
CSF_FILL_PATTERN 1 &h1 Auswahl an Füllmustern
CSF_DRAW_MASK 2 &h2 Füll-Raster ( 0 bis 100%)
CSF_RGB 4 &h4 Farbauswahl über RGB-Werte
CSF_INDEX 8 &h8 Farbauswahl über Indexfarben
-- 16 &h10 Gefüllt / Ungefüllt
CSF_MORE_COLORS 32 &h20 Dialogbox "Weitere Farben"

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:

  • Der Selector für "gefüllt / ungefüllt" (csFeatures Wert 16) kann zwar aktiviert werden, unter R-BASIC ist jedoch kein Zugriff darauf möglich.

  • Die ColorSelector Tools aus den Menüleisten sind unter R-BASIC nicht verfügbar. Sie können Sie als RadioButtonGroups nachbilden.


csColor, csIndexColor

Die 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, csDrawMaskValue

Der 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 / 64
Beim 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.

csFillPattern

Der 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.

ColorChangedHandler

Die 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:

sender: Der ColorSelector, der den Handler aufgerufen hat.
csColor: Der aktuell ausgewählte Farbwert. Das kann eine RGB-Farbe oder eine Indexfarbe sein. Selbst wenn eine Indexfarbe gewählt ist kann csColor einen (natürlich den zugehörigen) RGB-Farbwert enthalten.
csDrawMask: Der aktuell ausgewählte Wert für das Füllraster. Mögliche Werte liegen im Bereich von 25 (Raster = 100%) bis 89 (Raster = 0%).
csFillPattern: Der aktuell ausgewählte Wert für das Füllmuster. Mögliche Werte sind 25, 24, 23, 4, 5, 8 und 9.

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.

^

Weiter...