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.


Startseite | VB-/VBA-Tipps | Projekte | Tutorials | API-Referenz | Komponenten | Bücherecke | Gewinnspiele | VB-/VBA-Forum | DirectX-Forum | VB.Net | .Net-Forum | Foren-Archiv | Chat | Spielplatz | Links | Suchen | Stichwortverzeichnis | Feedback | Impressum

Seite empfehlen Bug-Report

Letzte Aktualisierung, Montag, 28. Oktober 2002