|
|
|
Viele
DirectX-Methoden erwarten als Parameter einen
Flag. Ein Flag ist wie ein oder mehrere Schalter zu
verstehen und hat einen eindeutigen Wert. Flags werden
verwendet um verschiedene Einstellungen festzulegen
oder um festzustellen welche Einstellungen ein DirectX-Objekt hat. (Manche Flags sind eine Kombination aus
anderen Flags).
|
Zum
Glück muss man sich die verschiedene Werte nicht
merken, da die Flags in DirectX bereits in Auflistungen
(Enumerations) vordefiniert sind.
|
Wenn
man jetzt z.B. zwei Flags mit einander kombinieren möchte,
dann verwendet man den logischen OR Operator. Natürlich
könnten die Flags auch normal addiert werden,
aber das kann zu Fehlern führen weil einige Flags
bereits eine Kombination aus anderen Flags sind.
|
Nehmen
wir zum Beispiel die Methode SetCooperativeLevel
vom
DirectInputDevice- Objekt. Diese Methode erwartet einen
Flag aus der CONST_DISCLFLAGS Auflistung. Wenn wir
nun den Device für Vordergrund und Exklusiv (foreground
; exclusive) haben möchten, dann müssen
wir die beiden Flags
DISCL_EXCLUSIVE und DISCL_FOREGROUND mit einem OR
kombinieren.
|
|
|
diDevice.SetCooperativeLevel(hwnd,
_
DISCL_FOREGROUND Or
DISCL_EXCLUSIVE) |
|
|
Wie bereits
erwähnt können zwei oder mehr Flags auch
normal addiert werden, aber man sollte sich angewöhnen
nur den logischen OR Operator zu verwenden. Manche
Flags sind bereits aus anderen Flags kombiniert und
ein normales addieren würden dann zu einem falschen
Ergebnis führen.
|
Der Flag
CF_PURPLE z.B. ist bereits eine Kombination
aus CF_RED und CF_BLUE.
|
|
|
Enum
COLORFLAGS
CF_RED = 1
CF_BLUE = 2
CF_PURPLE = 3
CF_GREEN = 4
End Enum
Dim Color As
Integer
Color = CF_RED Or CF_PURPLE |
|
|
Der Wert
von Color ist nun 3. CF_RED ist bereits in CF_PURPLE
enthalten (redundant) und wird nicht mehr
hinzuaddiert.
|
Das normale
Addieren würde hier zu einem falschen Ergebnis
führen.
|
|
|
Color = CF_RED + CF_PURPLE |
|
|
Der Wert
von Color ist nun 4, der wiederum gleich mit CF_GREEN
ist.
|
Um aus
einer Kombination von Flags die einzelnen Flags zu
bekommen, wird der logische AND Operator verwendet.
Ist ein bestimmter Flag in der Kombination vorhanden,
dann liefert AND einen Wert ungleich Null und der
Flag ist vorhanden, wurde also gesetzt. Wenn AND Null
liefert ist der Flag nicht gesetzt worden.
|
Wenn
wir z.B. prüfen wollen, ob ein bestimmter Joystick
am Computer angeschlossen ist, dann können wir
dies über seine Flags erfahren in dem wir schauen,
ob der entsprechende Flag gesetzt wurde.
|
|
|
Dim
IsAttached As Boolean
IsAttached = diDevCaps.lFlags And DIDC_ATTACHED |
|
|
Ist im
Wert von diDevCaps.lFlags der Wert von DIDC_ATTACHED
enthalten, dann wird IsAttached auf True gesetzt.
|
Auf gleich
(=) abzufragen würde nicht funktionieren.
|
|
|
IsAttached
= (diDevCaps.lFlags = DIDC_ATTACHED) |
|
|
Die Ursache
warum dies nicht funktioniert ist, im Wert von diDevCaps.lFlags
könnte auch der Wert vom Flag DIDC_FORCEFEEDBACK
enthalten sein.
|
|