От TopLeft 0,0 до BottomLeft 0,0 в GDI win32 - PullRequest
0 голосов
/ 22 декабря 2011

Как я могу изменить преобразование координат в окне с 0,0 до 0,0 с нижним.

Я пробовал различные решения с
SetMapMode(hdc,MM_TEXT);
SetViewportExtEx(hdc,0,-clientrect.bottom,NULL);
SetViewPortOrgEx(hdc,0,-clientrect.bottom,NULL);
SetWindowOrgEx(hdc,0,-clientrect.bottom,NULL);
SetWindowExtEx(hdc,0,-clientrect.bottom,NULL);
Я даже пытался найти решение для Google, но безуспешно, поэтому я обращаюсь к вам, более опытным людям в Интернете.

Идея в том, что я создаю пользовательский элемент управления для линейной интерполяции, и я могу повернуть систему координат на x, y в верхнем правом углу, но я хочу, чтобы это было правильно. В настоящий момент я получаю обратную линейную интерполяцию, когда пытаюсь нарисовать ее, так как не могу получить координаты нижнего смещения.

Я использую Win32 API, и я подозреваю, что я могу пропустить код, так как система координат экрана практически идентична во всех системах, то есть я имею в виду, что 0,0 "всегда" на экране, если вы сохраняете его к стандартному 2d окну и рамке.

Я действительно не хочу, чтобы целый пример кода облегчал боль при наборе текста для вас, ребята, но мне нужно какое-то направление, поскольку кажется, что я не могу понять простую концепцию переключения координат в win32 api.

Спасибо и счастливого Рождества

РЕДАКТИРОВАТЬ!

Я хотел бы добавить свой ответ на этот вопрос, поскольку я использовал простую математику, чтобы, так сказать, изменить представление.

Если для примера я получил пару значений x, y (150,57) и другую пару x, y (100,75), то я использовал эту формулу height + (-1 * y) и вуаля, я получаю правильное декартово поле координат :) ofcourse в этом примере высота - неопределенная переменная, но в моем приложении ее высота составляет 200 пикселей.

1 Ответ

1 голос
/ 22 декабря 2011

Согласно документации для SetViewportOrgEx , вы, как правило, хотите использовать его или SetWindowOrgEx, но не оба одновременно. Тем не менее, вы, вероятно, хотите, чтобы происхождение области просмотра было (0, clientrect.bottom), а не -clientrect.bottom.

Настройка трансформации с помощью GDI всегда сводила меня с ума. Я думаю, вам лучше использовать GDI +. С его помощью вы можете создать матрицу, которая описывает перевод (0, clientRect.bottom) и масштабирование (1.0, -1.0). Тогда вы можете позвонить SetWorldTransform.

См. Пример на Использование координатных пространств и преобразований . Для получения общей информации о преобразованиях: Координатные пространства и преобразования .

Дополнительная информация:

Я не пробовал это с прямыми вызовами Windows API, но если я делаю следующее в C # с использованием класса Graphics (который является оберткой вокруг GDI +), это работает:

Graphics g = GetGraphics();  // gets a canvas to draw on
SetTranslateTransform(0, clientRect.Bottom);
SetScaleTransform(1.0f, -1.0f);

Это помещает начало координат внизу слева, с x, увеличивающимся вправо, и y, увеличивающимся, когда вы поднимаетесь. Если вы используете SetWorldTransform, как я предложил, вышеописанное будет работать для вас.

Если вам нужно использовать GDI, вам нужно будет использовать SetViewportOrgEx(0, clientRect.bottom), а затем установить масштабирование. Я не помню, как делать масштабирование со старыми функциями GDI.

Также обратите внимание, что документация для SetViewportExtEx гласит:

Когда установлены следующие режимы отображения, вызовы SetWindowExtEx и функции SetViewportExtEx игнорируются.

  • MM_HIENGLISH
  • MM_HIMETRIC
  • MM_LOENGLISH
  • MM_LOMETRIC
  • MM_TEXT
  • MM_TWIPS
...