powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Масштабирование в GDI
5 сообщений из 5, страница 1 из 1
Масштабирование в GDI
    #39608586
AlexSyr2009
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Начну издалека. Есть некая программа, которая заявляет, что может расширять свои возможности рисования, применением 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
Масштабирование в GDI
    #39608605
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexSyr2009,

разберитесь с SetWorldTransform и не возитесь с устаревшими функциями
...
Рейтинг: 0 / 0
Масштабирование в GDI
    #39608624
AlexSyr2009
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Масштабирование в GDI
    #39608633
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexSyr2009,

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


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