0

Windows Magnification API を使用して、.net で拡大鏡アプリを作成しようとしています。実際に倍率レベルを設定することを除いて、ほとんどすべてが機能しています(デフォルトは100%です)。問題は、ネット上のどこにも例が見つからず、API のすべてのドキュメントが C++ コードであることです。これは私が問題を抱えている特定の機能です。

bool SetMagFactor(float magfactor)
{
    MAGTRANSFORM matrix;
    memset(&matrix, 0, sizeof(matrix));
    matrix.v[0][0] = magfactor;
    matrix.v[1][1] = magfactor;
    matrix.v[2][2] = 1.0f;
    return MagSetWindowTransform(hwndMag, &matrix);  
}

MAGTRANSFORM 構造体は次のように定義されます。

typedef struct tagMAGTRANSFORM {
    float v[3] [3];
} MAGTRANSFORM, *PMAGTRANSFORM;

これの最も紛らわしい部分は memset です - それが何をするのか、.NET でそれに相当するものがあるのか​​ わかりませんが、多次元配列/行列と、.NET でもこれをどのように処理するかについても混乱しています。

どんな助けでも大歓迎です。

4

1 に答える 1

2

memset は、最初にマトリックスをクリアしているだけです。.NET ではこれを行う必要はありません。C# で構造体を定義する最も簡単な方法は、各要素を個別に指定することだと思います。

public struct MagTransform
{
    readonly float m00;
    readonly float m10;
    readonly float m20;
    readonly float m01;
    readonly float m11;
    readonly float m21;
    readonly float m02;
    readonly float m12;
    readonly float m22;

    public MagTransform(float magnificationFactor) : this()
    {
        m00 = magnificationFactor;
        m11 = magnificationFactor;
        m22 = 1.0f;
    }
}

レイアウトも指定する必要があるかもしれません - 私はマーシャリングにあまり熱心ではありません。

ご覧のとおり、サンプル コードに基づいて必要な値を想定しました。未使用の値に関する警告が表示されますが、問題ありません。

代わりに固定バッファと安全でないコードを使用できます...しかし、おそらく上記を使用すると思います。基本的には、フロートが 9 個必要です。

于 2009-09-15T11:23:05.400 に答える