Перейти к содержанию

GDI - система координат


Antonshka

Рекомендуемые сообщения

Привет, кто-нибудь, скажите мне, что в GDI подразумевается под Window и Viewport. Под понятиями "Окно" и "Область вывода".

Я прочитал в книге Щупака, затем на MSDN, затем на нескольких сайтах, затем у Petzold,  сейчас буду у Фень Юань. Не понимаю!

 

Неужели трудно им сказать, к примеру,  Окно - это сама программа, ее габариты, а Область вывода - это весь рабочий стол. Также приложить нормальную картинку где это изображено. Нет же, пишут пишут, а толку.

 

Никак не зайдет тема о Режиме отображения и системах координат, с их физическими и логическими единицами.

 

На пальцах так сказать, объясните, что это все. Или на картинке, где это все обозначается.

  • Рукалицо 1
Ссылка на комментарий
Поделиться на другие сайты

Разобрался. Спасибо книге от Petzold. Ну и заморочка.

Если кто-то так же затрудняется понять, то вот:

Окно - это клиентская область приложения, то есть внешний вид программки без рамки и заголовка.

Область вывода - тоже клиентская область приложения, то есть внешний вид программки без рамки и заголовка. (Область вывода может быть и клиентской областю с рамкой и заголовком, и даже всем экраном).

 

Разница лишь в том у них, что позиция курсора, например наведенного на какое-нибудь место клиентской области, в случае "Области вывода" измеряется в пикселах,

а в случае когда мы говорим и имеем в виду "Окно", то измеряется в логических единицах.

 

А логическая единица может быть равна как одному пикселу, тогда позиции курсора в обоих терминах (Окно и Область вывода) измеряются в пикселах, так и нескольким пикселам, если самому предварительно это определить.

 

Сейчас читаю книгу Щупака, но чувствую теперь, что в книге Petzold материал преподается более подробно и доходчиво. Так что советую книгу Petzold . Хотя я и ту и эту намерен прочитать.

Изменено пользователем Antonshka
  • Понравилось 1
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Снова возник вопрос для следующей задачи, - нужно сделать чтобы одна логическая единица была равна 1/16 дюйма.

 

Вот решение из книги Petzold, где он сам эту задачу и ставит и решает,

Спойлер

SetMapMode(hdc, MM_ISOTROPIC);
SetWindowExtEx(hdc, (GetDeviceCaps(hdc, HORZSIZE) / 25.4) * 16, (GetDeviceCaps(hdc, VERTSIZE) / 25.4) * 16, NULL);
SetViewportExtEx(hdc, GetDeviceCaps(hdc, HORZRES), GetDeviceCaps(hdc, VERTRES), NULL);

 

 

Вот выписка касательно этого решения

Спойлер

В этом коде протяженность области вывода устанавливается равной величине всего экрана в пикселях.
Протяженности окна должны быть установлены в размеры всего экрана в единицах, равных 1/16 дюйма. Используя
индексы HORZSIZE и VERTSIZE в функции GetDeviceCaps, мы получаем размеры экрана в миллиметрах. Если бы
мы работали с числами с плавающей точкой, мы могли бы преобразовать миллиметры в дюймы путем деления на
25.4, а затем преобразовать дюймы в единицы, равные 1/16 дюйма, умножив результат деления на 16. Но,
поскольку, мы работаем с целыми числами, мы должны умножить миллиметры на 160 и разделить на 254.

 

Мой монитор по оси Х по результату HORZSIZE имеет 598 миллиметров. Переводя 598 в дюймы (598 / 25.4) получается 23.543 дюйма.

И вот собственно сам вопрос, - почему нужно именно умножать, 23.543 на 16? А не делить? На 16, я так понимаю, потому что 1/16.

 

23.543 х 16 = 376,688

GetDeviceCaps(hdc, HORZRES) возвращает 1920 (пикселей по оси Х, ширина).

Следовательно получается отношение 376 к 1920 , а именно  1920 / 376 = 5.106 (одна логическая единица будет равна 1/16 дюйма (1.587 миллиметра), или 5.106 пикселя, если в пикселях).

 

Почему умножение на 16, как это работает?

С одной стороны отношения, 23.543 дюйма умноженные на 16, с другой стороны, 1920 пикселей. Отношение дюймов к пикселям?

 

 

 

 

 

 

Ссылка на комментарий
Поделиться на другие сайты

Вот опять, решение пришло в голову сразу после того как я написал здесь свой вопрос. Два дня я тщетно пытался его решить, но стоило мне запостить...

Подумают что я спамер. А ведь действительно, два дня голову ломал.

 

Ребята, которые тоже изучаете GDI, и имеете трудности в понимании режимов отображение, вот решение вопроса установки логической единицы равной 1/16 дюйма, как я полагаю:

если умножить не на 16

SetWindowExtEx(hdc, (GetDeviceCaps(hdc, HORZSIZE) / 25.4) * 16, (GetDeviceCaps(hdc, VERTSIZE) / 25.4) * 16, NULL);

но на 1

SetWindowExtEx(hdc, (GetDeviceCaps(hdc, HORZSIZE) / 25.4) * 1, (GetDeviceCaps(hdc, VERTSIZE) / 25.4) * 1, NULL);

то вся ширина экрана в логических единицах будет равна числу 23.543 (дюймов, полученному из 598 мм / 25.4 мм).

Почему вся ширина экрана? Потому что мы установили всю ширину экрана, а также всю высоту экрана, с помощью функции

SetViewportExtEx(hdc, GetDeviceCaps(hdc, HORZRES), GetDeviceCaps(hdc, VERTRES), NULL);

 

И если мы теперь попытаемся нарисовать к примеру прямоугольник, с шириной 23.543 единицы,

Rectangle(hdc, 0, 0, 23.543, 11.7715);

то он отобразится на экране точь в точь шириной во весь экран, а высотой в пол экрана, так как 23.543 / 2 = 11.7715.

 

Теперь, если умножить 23.543 на 16,

SetWindowExtEx(hdc, (GetDeviceCaps(hdc, HORZSIZE) / 25.4) * 16, (GetDeviceCaps(hdc, VERTSIZE) / 25.4) * 16, NULL);

то мы в 16 раз увеличим диапазон ширины, для наших логических единиц. Тем самым, например при том же значении Y = 11.7715, прямоугольник отобразится уже в 16 раз меньше по высоте, так как логическая единица уменьшилась в 16 раз.

 

Если провести аналогию, для лучшего понимания, то возьмем к примеру метровый кусок бревна, и распилим его на 23 части, каждая часть теперь будет равна 1/23 метра, или что тоже 100 см / 23 = 4.34 сантиметра. Пять таких частей вместе будут равны 4.34 х 5 = 21.7 сантиметрам.

Но если мы теперь распилим бревно на более мелкие кусочки, а именно, 23 части умножим на 16, получим 368 частей, вот, - распилим на 368 частей. То в этом случае каждая часть будет равна 100 см / 368 = 0.271 см. И те же пять частей вместе, теперь уже не будут равны как раньше 21.7 сантиметрам, но будут равны 0.271 х 5 = 1.355 сантиметра.

 

То есть умножая на 16, мы уменьшаем размер частички (логической единицы), мы более раздробляем промежуток ширины экрана, мы делаем логическую частичку меньше и меньше, чем больше то число на которое умножаем.

 

Всем спасибо, наконец то!

Изменено пользователем Antonshka
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.