2009-09-15 4 views
0

Я пытаюсь создать приложение лупы в .net с помощью API расширения Windows. У меня почти все работает, за исключением того, что фактически устанавливается уровень увеличения (который по умолчанию равен 100%). Проблема в том, что я не могу найти ни одного примера в сети, и вся документация для API - это код на C++. Это особая функция, с которой я столкнулся.API расширения Windows, .NET и матрицы

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 тоже.

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

ответ

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

+0

К сожалению, это не удается, когда я передаю структуру функции MagSetWindowTransform. Я получаю странное исключение - «Исправление System.ExecutionEngineException», если я попытаюсь использовать его как LayoutKind.Auto и «Указанная запись не может быть сопоставлена ​​с классом управляемых значений». –

+0

LayoutKind.Explicit? –

+0

То же самое, что и указание макета - System.ExecutionEngineException –