Antonshka Опубликовано 12 сентября, 2021 Поделиться Опубликовано 12 сентября, 2021 Привет, кто-нибудь, скажите мне, что в GDI подразумевается под Window и Viewport. Под понятиями "Окно" и "Область вывода". Я прочитал в книге Щупака, затем на MSDN, затем на нескольких сайтах, затем у Petzold, сейчас буду у Фень Юань. Не понимаю! Неужели трудно им сказать, к примеру, Окно - это сама программа, ее габариты, а Область вывода - это весь рабочий стол. Также приложить нормальную картинку где это изображено. Нет же, пишут пишут, а толку. Никак не зайдет тема о Режиме отображения и системах координат, с их физическими и логическими единицами. На пальцах так сказать, объясните, что это все. Или на картинке, где это все обозначается. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 12 сентября, 2021 Автор Поделиться Опубликовано 12 сентября, 2021 (изменено) Разобрался. Спасибо книге от Petzold. Ну и заморочка. Если кто-то так же затрудняется понять, то вот: Окно - это клиентская область приложения, то есть внешний вид программки без рамки и заголовка. Область вывода - тоже клиентская область приложения, то есть внешний вид программки без рамки и заголовка. (Область вывода может быть и клиентской областю с рамкой и заголовком, и даже всем экраном). Разница лишь в том у них, что позиция курсора, например наведенного на какое-нибудь место клиентской области, в случае "Области вывода" измеряется в пикселах, а в случае когда мы говорим и имеем в виду "Окно", то измеряется в логических единицах. А логическая единица может быть равна как одному пикселу, тогда позиции курсора в обоих терминах (Окно и Область вывода) измеряются в пикселах, так и нескольким пикселам, если самому предварительно это определить. Сейчас читаю книгу Щупака, но чувствую теперь, что в книге Petzold материал преподается более подробно и доходчиво. Так что советую книгу Petzold . Хотя я и ту и эту намерен прочитать. Изменено 12 сентября, 2021 пользователем Antonshka 1 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 13 сентября, 2021 Автор Поделиться Опубликовано 13 сентября, 2021 Снова возник вопрос для следующей задачи, - нужно сделать чтобы одна логическая единица была равна 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 пикселей. Отношение дюймов к пикселям? Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 13 сентября, 2021 Автор Поделиться Опубликовано 13 сентября, 2021 (изменено) Вот опять, решение пришло в голову сразу после того как я написал здесь свой вопрос. Два дня я тщетно пытался его решить, но стоило мне запостить... Подумают что я спамер. А ведь действительно, два дня голову ломал. Ребята, которые тоже изучаете 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, мы уменьшаем размер частички (логической единицы), мы более раздробляем промежуток ширины экрана, мы делаем логическую частичку меньше и меньше, чем больше то число на которое умножаем. Всем спасибо, наконец то! Изменено 13 сентября, 2021 пользователем Antonshka Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения