|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,631
|
|||||||||||||||||||||
Функции изменения режима отображения04.11.2022, 06:00. Показов 1908. Ответов 11
Здравствуйте! Думал, что понял, но, как оказалось нет, связано это непонимание с функциями изменения режима отображения. Если я хочу изменить режим отображения на MM_ISOTROPIC например,
Я пишу следующее:
1)Если вместо SetViewportOrgEx(hdc, cxOrig, cyOrig, NULL); вызвать функцию SetWindowOrgEx(hdc, cxOrig, cyOrig, NULL); то в окне вообще ничего не рисуется, почему? 2)Если я хочу рисовать в цикле, скажем, 10 кругов, то установив режим отображения как указано выше у меня рисуется один круг, почем так вот код: Кликните здесь для просмотра всего текста
Не ясно почему выводится только один круг. Если я вызываю функцию SetWindowExtEx(hdc, cxClient, -cyClient, NULL);, то таким образом я задаю некий прямоугольник/квадрат, с которым, в дальнейшем будет вестись работа или нет? А если, соответственно, вызвать функцию SetViewportExtEx(hdc, radius, radius, NULL);, то это значит, что я задаю некий масштаб отображения, единицы вроде тех, что используются в MM_LOENGLISH... или нет? ---------------------------- Читаю книжку по работе с API и пытаюсь понять смысл функций SetViewport/SetWindowOrgEx. SetViewportOrgEx смещает начало физической системы координат (ФКС), SetWindowOrgEx смещает начало логической системы координат (ЛКС). А теперь небольшой код:
------------------------------------------------------------- Хотелось бы разобраться в этой теме.
0
|
|||||||||||||||||||||
| 04.11.2022, 06:00 | |
|
Ответы с готовыми решениями:
11
Синхронизация отображения изменения данных Изменение режима отображения значений в форме
|
|
COM‐пропагандист
|
||
| 06.11.2022, 11:13 | ||
|
Рекомендую ознакомиться «Выбор режима отображения» Александр Фролов, Григорий Фролов https://frolov-lib.ru/books/bs... w559536907
0
|
||
|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,631
|
|||||
| 06.11.2022, 13:12 [ТС] | |||||
|
0
|
|||||
|
COM‐пропагандист
|
|||||||||||||||||||
| 06.11.2022, 16:26 | |||||||||||||||||||
|
Вообще любая GDI фигура рисуется текущей выбранной кистью и пером, обнуляя всё, что было раньше нарисовано.
А теперь можете забыть про эти режимы и приступить к преобразованию координатного пространства через матрицы перехода: https://learn.microsoft.com/en... formations
1
|
|||||||||||||||||||
|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,631
|
|||||||||||||||
| 07.11.2022, 09:23 [ТС] | |||||||||||||||
|
Я задаю так:
0
|
|||||||||||||||
|
COM‐пропагандист
|
||||||||||||||||||||||||||||||||||
| 07.11.2022, 12:32 | ||||||||||||||||||||||||||||||||||
|
Также там есть формула преобразования координат из логических в физические:
Если вы переносите начало координат области вывода в точку (xViewOrg, yViewOrg), то логическая точка (0, 0) будет соответствовать физической точке с координатами (xViewOrg, yViewOrg). Если вы переносите начало координат окна в точку (xWinOrg, yWinOrg), то логическая точка (xWinOrg, yWinOrg) будет соответствовать физической точке с координатами (0, 0), то есть левому верхнему углу рабочей области. Например, предположим, что рабочая область вашего окна имеет ширину ClientWidth и высоту ClientHeight пикселей. Если вы хотите установить начало логической системы координат — точку (0, 0) — в центр рабочей зоны окна, вы можете это сделать так: SetViewportOrgEx(hdc, ClientWidth / 2, ClientHeight / 2, NULL); Аргументы функции SetViewportOrgEx всегда задаются в координатах устройства. Логическая точка (0, 0) будет теперь отображаться в точку с физическими координатами (ClientWidth/2, ClientHeight/2). Теперь вы используете рабочую область так, как будто бы она имела представленную ниже систему координат:
То, чего вы не должны делать (до тех пор, пока вы не будете знать, к чему это приведёт) — это использовать обе функции совместно:
Сразу приступайте к изучению матриц поворота, отражения, сдвига, переноса и масштабирования. Например, нарисовать эллипс под углом. Или отмасштабированный в соответствии с размерами окна квадрат. Вы что, к координатам каждой фигуры будете добавлять поправочные коэффициенты? Нет, это следует делать установкой матрицы масштабирования. Или стрелки в аналоговых часах. Вместо пересчёта координат, вычисления синусов и косинусов, следует просто установить матрицу поворота. В GDI для этого есть функции SetWorldTransform, ModifyWorldTransform и структура XFORM. В GDI+ вообще всё замечательно, там и функций побольше, и сама библиотека очень дружественна к матрицам.
0
|
||||||||||||||||||||||||||||||||||
|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,631
|
||||||||||||
| 08.11.2022, 06:59 [ТС] | ||||||||||||
|
Не по теме: Ну да, если угодно, не читал, может просто мне не всё ясно, нет.... Я спросил про единицы(пикселы или миллиметры), которые используются для приращения, но, видимо, не совсем ясно выразился. И да, если имеется ввиду этот код:
Эта часть описания взята из книги Питзольда, если не ошибаюсь, её тоже читал. По формулам я их видел при чтении, но особого смысла не предавал т.к. никто не требует писать собственные функции перевода из логических координат в физические и обратно. Логические и физические координаты - я так понимаю, к физическим координатам относится весть экран, а к логическим область на экране, например, окно, хотя не факт, что я правильно понял.
0
|
||||||||||||
|
COM‐пропагандист
|
||||||||||
| 08.11.2022, 11:07 | ||||||||||
|
Перед тем, как отобразить точку на мониторе, координаты этой точки проходят несколько этапов преобразований. 1. Логические координаты точки клиентской области (xWindow, yWindow), отправляемые в функции GDI, домножаются на мировую матрицу. По умолчанию в контексте устройства установлена единичная матрица, и координаты проходят дальше без изменений. 2. Логические координаты точки (xWindow, yWindow) преобразуются в координаты области вывода (xViewport, yViewport). 3. Полученные координаты области вывода преобразуются в полные координаты окна относительно левого верхнего угла окна. 4. Полные координаты преобразуют в координаты физического устройства (монитора, принтера). Чаще всего область вывода (Viewport) — это то же самое, что и клиентская область (GetDC, BeginPaint), хотя область вывода может описываться также и в полных координатах окна или в координатах экрана, если вы получили контекст устройства из функций GetWindowDC или CreateDC.
Вы должны заранее подготовить нужную вам матрицу, с синусами и косинусами углов поворота. Так как синусы и косинусы каждого угла уже известны (см. таблицы Брадиса), поэтому в своей программе даже не надо использовать функции sin и cos, вы просто храните готовые значения как константы и формируете матрицу поворота на нужный угол когда надо.
0
|
||||||||||
|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,631
|
|||||
| 09.11.2022, 08:20 [ТС] | |||||
|
0
|
|||||
|
COM‐пропагандист
|
|||||||||
| 10.11.2022, 07:47 | |||||||||
|
GetWorldTransform — возвращает текущую матрицу из контекста устройства. SetWorldTransform — сбросит старую и установит новую матрицу в контекст устройства. ModifyWorldTransform — умножит старую и новую матрицу и установит полученную матрицу в контекст устройства. Эта же функция умеет устанавливать едининую матрицу. CombineTransform — умножает две матрицы. Матрицу вы создаёте сами. То есть вам надо объявить переменную типа XFORM, заполнить её поля и отправить в функцию SetWorldTransform. Вот пример как с помощью матрицы в два раза сплющить плоскость по оси y и повернуть на 30 градусов (код на языке FreeBASIC, но вам не составит труда перевести его на си, добавив визуального мусора в виде точек с запятой):
В GDI+ дополнительно есть удобные функции‐обёртки для каждого из пяти видов линейных преобразований, умножения матриц и векторов, но это GDI+, а для GDI вам придётся самостоятельно реализовывать такие функции.
1
|
|||||||||
|
COM‐пропагандист
|
||||||||||||||||||||||
| 10.11.2022, 11:59 | ||||||||||||||||||||||
|
Обратимся к формуле:
Чтобы точка отобразилась на экране, её логические коориданты должны быть как минимум 320 и 240. Иначе она не попадает в область вывода. Вот ответ на ваш вопрос.
1
|
||||||||||||||||||||||
|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,631
|
||||
| 16.11.2022, 05:28 [ТС] | ||||
|
0
|
||||
| 16.11.2022, 05:28 | |
|
Помогаю со студенческими работами здесь
12
Ассемблерная вставка для изменения режима округления Изменения отображения Chart Синхронизация отображения изменения данных Редактировать скрипт для изменения отображения товаров Программа для отображения изменения яркости/громкости на ноутбуке Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y
Z4Tv2zpXVVo
https:/ / github. com/ shumilovas/ med2. git
|
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа.
В качестве фильтра для отбора справочника служит группа номенклатуры.
Отбор по наименованию группы. . .
|
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
|
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс.
Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
|
|
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа.
В качестве фильтра для отбора служит значение перечислений.
/ / Событие "НачалоВыбора" реквизита на форме. . .
|
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|