Windows Magnification API, .NET и матрицы

Я пытаюсь создать приложение лупы в .net, используя Windows Magnification API. У меня почти все работает, за исключением фактической установки уровня увеличения (по умолчанию 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.

Любая помощь будет принята с благодарностью.


person Andy E    schedule 15.09.2009    source источник


Ответы (1)


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 поплавков.

person Jon Skeet    schedule 15.09.2009
comment
к сожалению, это не удается, когда я передаю структуру функции MagSetWindowTransform. Я получаю странное исключение - System.ExecutionEngineException выбрасывается, если я пытаюсь использовать его как LayoutKind.Auto, и указанная запись не может быть сопоставлена ​​с классом управляемых значений. - person Andy E; 15.09.2009
comment
То же, что и без указания макета — выдается исключение System.ExecutionEngineException - person Andy E; 16.09.2009