Windows Magnification API, .NET и матрицы
-
07-07-2019 - |
Вопрос
Я пытаюсь создать приложение лупы в .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 также.
Любая помощь будет принята с благодарностью.
Решение
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 поплавков. Р>