Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Масштабирование в GDI / 5 сообщений из 5, страница 1 из 1
28.02.2018, 16:13
    #39608586
AlexSyr2009
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Масштабирование в GDI
Начну издалека. Есть некая программа, которая заявляет, что может расширять свои возможности рисования, применением Windows GDI. При этом, единственное, что предоставляется, в рамках такого расширения, это, как я понял, контекст для памяти (memory device context). Приведу код и опишу проблему:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
...
  RECT bx{ -100, 200, 500, 800 };
  HDC hDC = Comp->begincache(bx);           // Получить memory DC штатными средствами
  HPEN pen = CreatePen(PS_SOLID, 5, BRIGHTBLUE);
  SelectObject(hDC, pen);
  Rectangle(hDC, 0, 0, 100, 100);           // Квадрат 100х100 GDI
  DeleteObject(pen);
  Comp->drawbox(200, 300, 400, 500);        // Квадрат 200х200 штатными средствами
  Comp->endcache();
...


В результате работы кода, рисуется такая картинка (см. Pic01)
Здесь уже видно, что размеры квадрата, нарисованного GDI, не соответствуют масштабу отображаемой области.
При увеличении масштаба, квадрат, нарисованный штатными средствами сохраняет свои пропорции, а GDI квадрат - нет.
Понятно, что GDI берет экранные координаты и они неизменны при изменении масштаба отображаемой области.
Понятно, что необходимо преобразовывать координаты GDI фигур.
Но как получить координаты, предоставленного программой DC???
Какие варианты уже пробовал при тестировании того, что можно вытащить из DC:
GetViewportOrgEx, GetWindowOrgEx - возвращают X и Y равным 0 и не меняются при изменении масштаба
GetViewportExtEx, GetWindowExtEx - возвращают cX и cY равным 1 и не меняются при изменении масштаба
Надежды, что StretchBlt впишет создаваемую фигуру в размер предоставленного DC и отмасштабирует - не оправдались:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
...
  HDC memDC = CreateCompatibleDC(hDC);
  HBITMAP memBitmap = CreateCompatibleBitmap(hDC, 600, 600);
  HBITMAP oldBitmap = (HBITMAP)SelectObject(memDC, memBitmap);
  HPEN pen = CreatePen(PS_SOLID, 5, BRIGHTBLUE);
  SelectObject(memDC, pen);
  Rectangle(memDC, 0, 0, 100, 100);               // Квадрат 100х100 GDI
  StretchBlt(hDC, 0, 0, 400, 400, memDC, 0, 0, 600, 600, SRCCOPY);
  SelectObject(memDC, oldBitmap);                 // Cleanup.
  DeleteObject(memBitmap);
  DeleteDC(memDC);
...


Картинка, конечно поменялась, за счет фона неициализированного bitmap'a и явного уменьшения размера GDI квадрата, но суть осталась прежней - GDI фигура, все также, отрисовывается в координатах экрана и не масштабируется.
Может кто знает как справиться с такой проблемой? Какие, в общем виде, параметры изменяются при масштабировании отображаемой области?
...
Рейтинг: 0 / 0
28.02.2018, 16:36
    #39608605
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Масштабирование в GDI
AlexSyr2009,

разберитесь с SetWorldTransform и не возитесь с устаревшими функциями
...
Рейтинг: 0 / 0
28.02.2018, 17:15
    #39608624
AlexSyr2009
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Масштабирование в GDI
kealon(Ruslan) ,
Смотрел и эту функцию.
GetWorldTransform при изменении масштаба отображаемой области всегда возвращает:
Код: plaintext
1.
eM11=1.000000  eM12=0.000000  eM21=0.000000  eM22=1.000000  eDx=0.000000  eDy=0.000000


Т.к. формула преобразования координат:
Код: plaintext
1.
2.
x' = x * eM11 + y * eM21 + eDx, 
y' = x * eM12 + y * eM22 + eDy,


то получается, что при изменении масштаба все составные части формулы являются константами, а значит ничего меняться в координатах не будет. Т.е. эта функция полезна только тогда, когда сам меняешь расчетные параметры. А вот их то, как раз, я и не знаю. И не знаю откуда их можно получить.
К примеру, при изменении размера окна, меняются его размеры, отталкиваясь от которых можно вычислить даже простой арифметикой пропорции рисуемых фигур. Здесь же есть только DC. Вопрос, собственно, и заключался в том как из DC вытащить ширину/высоту или применить функцию, которая автоматически впишет в "размеры" DC нужное.
...
Рейтинг: 0 / 0
28.02.2018, 17:34
    #39608633
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Масштабирование в GDI
AlexSyr2009,

GetClipBox
...
Рейтинг: 0 / 0
28.02.2018, 21:52
    #39608733
AlexSyr2009
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Масштабирование в GDI
kealon(Ruslan) ,
Огромное спасибо - это именно то, что было нужно.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Масштабирование в GDI / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]