Перейти к содержанию
Авторизация  
Antonshka

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

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

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

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

 

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

 

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

 

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

Поделиться сообщением


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

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

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

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

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

 

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

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

 

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

 

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

Изменено пользователем Antonshka

Поделиться сообщением


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

Снова возник вопрос для следующей задачи, - нужно сделать чтобы одна логическая единица была равна 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

Поделиться сообщением


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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Предпросмотр
Авторизация  

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

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

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