Platform SDK: DirectX

フラグの使用

[C++]

ここでは、Visual Basic でのアプリケーション開発について説明する。

[Visual Basic]

DirectX for Visual Basic の多くのオブジェクト メソッドでは、flags パラメータや、それに似た名前のパラメータが使用される。また、型の中にはフラグを含むメンバを持つものもある。メソッド呼び出しの多様な動作を制御したり、デバイス能力などの詳細を報告するときに使用する。

フラグは 1 ビットの情報である。特定の動作または能力があるかないかを指定したり、報告する。関連フラグ セットは、一般に各ビットを共有しないメンバを列挙することで表す (ただし、フラグの中にはほかのフラグと組み合わせて表すものもある)。

各フラグは 1 ビットで表されるので、複数のフラグを組み合わせて 1 つの値で表すことができる。たとえば、DirectInput デバイスの協調レベルをフォアグラウンドと排他の両方に設定したいとする。それには、次のように論理演算 Or を使用して 2 つのフラグを組み合わせる。

' diDevice は DirectInputDevice オブジェクト、hwnd はウィンドウ ハンドルである。
diDevice.SetCooperativeLevel(hwnd, _
    DISCL_FOREGROUND Or DISCL_EXCLUSIVE)

ほとんどの場合、論理演算子 Or を使用して複数のフラグを組み合わせる演算は、加算演算子を使用してフラグを合計する演算と等価である。しかし、いくつかのフラグはビットの組み合わせを表していることから、フラグを合計する演算はあまり賢い選択であるとは言えない。次の例で、フラグ CF_PURPLE は CF_RED と 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

ここで、Color の値は 3 である。CF_RED は、CF_PURPLE にその値が既に含まれているので余計である。

一方、次の演算では不正な値が設定される。

' これは間違いである !
Color = CF_RED + CF_PURPLE

ここで、変数に 4 が設定され、CF_GREEN と等価になる。

ユーザーは、フラグの値を取得したら、And 論理演算を使用して個別のフラグの設定値を抽出できる。フラグ値にフラグ定数で表されたビットが含まれている場合、And 演算により 0 以外の値が返されるとき、そのフラグは "オン" である。And 演算で 0 が返された場合、そのフラグは "オフ" である。たとえば、次の呼び出しは、DIDEVCAPS 型の変数に返される能力の入力デバイスが物理的にシステムにアタッチされているかどうかを判定する。

Dim IsAttached As Boolean
IsAttached = diDevCaps.lFlags And DIDC_ATTACHED 

次例のように、等価であるかどうかをテストしてはならない。

' これは、間違いである !
IsAttached = (diDevCaps.lFlags = DIDC_ATTACHED)

このようにすると正しく機能しない理由は、lFlags には DIDC_FORCEFEEDBACK などのほかビットも含まれているかもしれないからである (「CONST_DIDEVCAPSFLAGS」を参照すること)。