ファイルからのエフェクトのロード
エフェクトをロードするには、IDirectInputDevice8::EnumEffectsInFile メソッドを呼び出します。既定では、列挙は標準の Microsoft DirectInput エフェクトに制限されていますが、DIFEF_INCLUDENONSTANDARD フラグを設定することにより、その他のエフェクトも列挙できます。また、DIFEF_MODIFYIFNEEDED フラグを設定することにより、エフェクトがそのデバイスで動作できるように、必要に応じてパラメーターを変更するように DirectInput に指示することもできます(たとえば、2 つの軸に対して作成されたエフェクトが単一軸のハンドルに対して動作するようにすることができます)。
次のコード例では、最初の 3 つの標準エフェクトがファイルからロードされ、DirectInputEffect オブジェクトとして作成されます。
// g_lpdid is a valid IDirectInputDevice8 pointer to a
// force feedback device.
// The array of effect pointers is declared globally.
LPDIRECTINPUTEFFECT pEff[3];
.
.
.
g_lpdid->EnumEffectsInFile("FEdit1.ffe",
EnumEffectsInFileProc,
NULL,
DIFEF_MODIFYIFNEEDED);
.
.
.
ファイル内のエフェクトごとに 1 回ずつ、または DIENUM_STOP が返されるまで、次のコールバック関数が呼び出されます。DIFEF_MODIFYIFNEEDED フラグが渡されたために、lpdife->lpDiEffect 内でエフェクトのパラメーターが変更されている可能性があることに注意してください。コールバックはこれらの変更されたパラメーターを使用してエフェクトを作成します。
BOOL CALLBACK EnumEffectsInFileProc(LPCDIFILEEFFECT lpdife,
LPVOID pvRef)
{
HRESULT hr;
static int i;
hr = g_lpdid->CreateEffect(lpdife->GuidEffect,
lpdife->lpDiEffect,
&pEff[i],
NULL);
if (FAILED(hr))
{
// Error handling
}
if (++i > 2) return DIENUM_STOP;
else return DIENUM_CONTINUE;
}