- •Содержание
- •Глава 1 README.TXT
- •Вызов, брошенный программистам
- •Основные правила
- •Краткая история Windows
- •Краткая история этой книги
- •Начнем
- •Глава 2 Hello, Windows 95
- •Отличительная особенность Windows
- •Графический интерфейс пользователя
- •Концепции и обоснование GUI
- •Содержимое интерфейса пользователя
- •Преимущество многозадачности
- •Управление памятью
- •Независимость графического интерфейса от оборудования
- •Соглашения операционной системы Windows
- •Вызовы функций
- •Объектно-ориентированное программирование
- •Архитектура, управляемая событиями
- •Оконная процедура
- •Ваша первая программа для Windows
- •Что в этой программе неправильно?
- •Файлы HELLOWIN
- •Make-файл
- •Вызовы функций Windows
- •Идентификаторы, написанные прописными буквами
- •Новые типы данных
- •Описатели
- •Венгерская нотация
- •Точка входа программы
- •Регистрация класса окна
- •Создание окна
- •Отображение окна
- •Цикл обработки сообщений
- •Оконная процедура
- •Обработка сообщений
- •Воспроизведение звукового файла
- •Сообщение WM_PAINT
- •Сообщение WM_DESTROY
- •Сложности программирования для Windows
- •Не вызывай меня, я вызову тебя
- •Синхронные и асинхронные сообщения
- •Думайте о ближнем
- •Кривая обучения
- •Глава 3 Рисование текста
- •Рисование и обновление
- •Сообщение WM_PAINT
- •Действительные и недействительные прямоугольники
- •Введение в графический интерфейс устройства (GDI)
- •Контекст устройства
- •Структура информации о рисовании
- •Получение описателя контекста устройства. Второй метод
- •Функция TextOut. Подробности
- •Системный шрифт
- •Размер символа
- •Метрические параметры текста. Подробности
- •Форматирование текста
- •Соединим все вместе
- •Не хватает места!
- •Размер рабочей области
- •Полосы прокрутки
- •Диапазон и положение полос прокрутки
- •Сообщения полос прокрутки
- •Прокрутка в программе SYSMETS
- •Структурирование вашей программы для рисования
- •Создание улучшенной прокрутки
- •Мне не нравится пользоваться мышью
- •Глава 4 Главное о графике
- •Концепция GDI
- •Структура GDI
- •Типы функций
- •Примитивы GDI
- •Другие аспекты
- •Контекст устройства
- •Получение описателя контекста устройства
- •Программа DEVCAPS1
- •Размер устройства
- •О цветах
- •Атрибуты контекста устройства
- •Сохранение контекста устройства
- •Рисование отрезков
- •Ограничивающий прямоугольник
- •Сплайны Безье
- •Использование стандартных перьев
- •Создание, выбор и удаление перьев
- •Закрашивание пустот
- •Режимы рисования
- •Рисование закрашенных областей
- •Функция Polygon и режим закрашивания многоугольника
- •Закрашивание внутренней области
- •Режим отображения
- •Координаты устройства (физические координаты) и логические координаты
- •Системы координат устройства
- •Область вывода и окно
- •Работа в режиме MM_TEXT
- •Метрические режимы отображения
- •Ваши собственные режимы отображения
- •Программа WHATSIZE
- •Прямоугольники, регионы и отсечение
- •Работа с прямоугольниками
- •Случайные прямоугольники
- •Создание и рисование регионов
- •Отсечения: прямоугольники и регионы
- •Программа CLOVER
- •Пути
- •Создание и воспроизведение путей
- •Расширенные перья
- •Bits and Blts
- •Цвета и битовые образы
- •Файл DIB
- •Упакованный формат хранения DIB
- •Отображение DIB
- •Преобразование DIB в объекты "битовые образы"
- •Битовый образ — объект GDI
- •Создание битовых образов в программе
- •Формат монохромного битового образа
- •Формат цветного битового образа
- •Контекст памяти
- •Мощная функция BitBlt
- •Перенос битов с помощью функции BitBlt
- •Функция DrawBitmap
- •Использование других ROP кодов
- •Дополнительные сведения о контексте памяти
- •Растяжение битовых образов с помощью функции StretchBlt
- •Кисти и битовые образы
- •Метафайлы
- •Простое использование метафайлов памяти
- •Сохранение метафайлов на диске
- •Расширенные метафайлы
- •Делаем это лучше
- •Базовая процедура
- •Заглянем внутрь
- •Вывод точных изображений
- •Текст и шрифты
- •Вывод простого текста
- •Атрибуты контекста устройства и текст
- •Использование стандартных шрифтов
- •Типы шрифтов
- •Шрифты TrueType
- •Система EZFONT
- •Внутренняя работа
- •Форматирование простого текста
- •Работа с абзацами
- •Глава 5 Клавиатура
- •Клавиатура. Основные понятия
- •Игнорирование клавиатуры
- •Фокус ввода
- •Аппаратные и символьные сообщения
- •Аппаратные сообщения
- •Системные и несистемные аппаратные сообщения клавиатуры
- •Переменная lParam
- •Виртуальные коды клавиш
- •Использование сообщений клавиатуры
- •Модернизация SYSMETS: добавление интерфейса клавиатуры
- •Логика обработки сообщений WM_KEYDOWN
- •Посылка асинхронных сообщений
- •Символьные сообщения
- •Сообщения WM_CHAR
- •Сообщения немых символов
- •Каретка (не курсор)
- •Функции работы с кареткой
- •Программа TYPER
- •Наборы символов Windows
- •Набор символов OEM
- •Набор символов ANSI
- •Наборы символов OEM, ANSI и шрифты
- •Международные интересы
- •Работа с набором символов
- •Связь с MS-DOS
- •Использование цифровой клавиатуры
- •Решение проблемы с использованием системы UNICODE в Windows NT
- •Глава 6 Мышь
- •Базовые знания о мыши
- •Несколько кратких определений
- •Сообщения мыши, связанные с рабочей областью окна
- •Простой пример обработки сообщений мыши
- •Обработка клавиш <Shift>
- •Сообщения мыши нерабочей области
- •Сообщение теста попадания
- •Сообщения порождают сообщения
- •Тестирование попадания в ваших программах
- •Гипотетический пример
- •Пример программы
- •Эмуляция мыши с помощью клавиатуры
- •Добавление интерфейса клавиатуры к программе CHECKER
- •Использование дочерних окон для тестирования попадания
- •Дочерние окна в программе CHECKER
- •Захват мыши
- •Рисование прямоугольника
- •Решение проблемы — захват
- •Программа BLOKOUT2
- •Глава 7 Таймер
- •Основы использования таймера
- •Система и таймер
- •Таймерные сообщения не являются асинхронными
- •Использование таймера: три способа
- •Первый способ
- •Второй способ
- •Третий способ
- •Использование таймера для часов
- •Позиционирование и изменение размеров всплывающего окна
- •Получение даты и времени
- •Обеспечение международной поддержки
- •Создание аналоговых часов
- •Стандартное время Windows
- •Анимация
- •Класс кнопок
- •Создание дочерних окон
- •Сообщения дочерних окон родительскому окну
- •Сообщения родительского окна дочерним окнам
- •Нажимаемые кнопки
- •Флажки
- •Переключатели
- •Окна группы
- •Изменение текста кнопки
- •Видимые и доступные кнопки
- •Кнопки и фокус ввода
- •Дочерние окна управления и цвета
- •Системные цвета
- •Цвета кнопок
- •Сообщение WM_CTLCOLORBTN
- •Кнопки, определяемые пользователем
- •Класс статических дочерних окон
- •Класс полос прокрутки
- •Программа COLORS1
- •Интерфейс клавиатуры, поддерживаемый автоматически
- •Введение новой оконной процедуры
- •Закрашивание фона
- •Окрашивание полос прокрутки и статического текста
- •Класс редактирования
- •Стили класса редактирования
- •Коды уведомления управляющих окон редактирования
- •Использование управляющих окон редактирования
- •Сообщения управляющему окну редактирования
- •Класс окна списка
- •Стили окна списка
- •Добавление строк в окно списка
- •Выбор и извлечение элементов списка
- •Получение сообщений от окон списка
- •Простое приложение, использующее окно списка
- •Список файлов
- •Утилита Head для Windows
- •Компиляция ресурсов
- •Значки и курсоры
- •Редактор изображений
- •Получение описателя значков
- •Использование значков в вашей программе
- •Использование альтернативных курсоров
- •Битовые образы: картинки в пикселях
- •Использование битовых образов и кистей
- •Символьные строки
- •Использование ресурсов-символьных строк
- •Меню
- •Структура меню
- •Шаблон меню
- •Ссылки на меню в вашей программе
- •Меню и сообщения
- •Образец программы
- •Этикет при организации меню
- •Сложный способ определения меню
- •Третий подход к определению меню
- •Независимые всплывающие меню
- •Использование системного меню
- •Изменение меню
- •Другие команды меню
- •Использование в меню битовых образов
- •Два способа создания битовых образов для меню
- •Контекст памяти
- •Создание битового образа, содержащего текст
- •Масштабирование битовых образов
- •Соберем все вместе
- •Добавление интерфейса клавиатуры
- •Быстрые клавиши
- •Зачем нужны быстрые клавиши?
- •Некоторые правила назначения быстрых клавиш
- •Таблица быстрых клавиш
- •Преобразование нажатий клавиш клавиатуры
- •Получение сообщений быстрых клавиш
- •Программа POPPAD, имеющая меню и быстрые клавиши
- •Разрешение пунктов меню
- •Обработка опций меню
- •Глава 11 Окна диалога
- •Модальные окна диалога
- •Создание окна диалога About
- •Шаблон окна диалога
- •Диалоговая процедура
- •Вызов окна диалога
- •Дополнительная информация о стиле окна диалога
- •Дополнительная информация об определении дочерних окон элементов управления
- •Более сложное окно диалога
- •Работа с дочерними элементами управления окна диалога
- •Кнопки OK и Cancel
- •Позиции табуляции и группы
- •Рисование в окне диалога
- •Использование с окном диалога других функций
- •Определение собственных окон управления
- •Окна сообщений
- •Информация во всплывающих окнах
- •Немодальные окна диалога
- •Различия между модальными и немодальными окнами диалога
- •Новая программа COLORS
- •Программа HEXCALC: обычное окно или окно диалога?
- •Творческое использование идентификаторов дочерних окон элементов управления
- •Диалоговые окна общего пользования
- •Модернизированная программа POPPAD
- •Изменение шрифта
- •Поиск и замена
- •Программа для Windows, содержащая всего один вызов функции
- •Основы элементов управления общего пользования
- •Инициализация библиотеки
- •Создание элементов управления общего пользования
- •Стили элементов управления общего пользования
- •Уведомляющие сообщения от элементов управления общего пользования
- •Элементы управления главного окна
- •Панели инструментов
- •Создание панели инструментов
- •Строка состояния
- •Программа GADGETS
- •Наборы страниц свойств
- •Создание набора страниц свойств
- •Процедуры диалогового окна страницы свойств
- •Программа PROPERTY
158
бледными, потому что их контуры — тонкие линии. Векторные шрифты сейчас иногда называют "плоттерными" (plotter fonts), поскольку они подходят только для плоттеров.
Для обоих типов шрифтов GDI, растровых и векторных, Windows может синтезировать полужирный курсив, подчеркнутый и зачеркнутый шрифты без хранения отдельно шрифтов каждого из этих типов. Например, чтобы получить курсив, Windows просто сдвигает верхнюю часть символа вправо.
Далее рассмотрим шрифты TrueType, которым посвятим остаток главы.
Шрифты TrueType
С введением шрифтов TrueType в версии Windows 3.1 значительно повысились возможности и гибкость работы с текстами. TrueType — это технология контурных шрифтов, которая была разработана Apple Computer Inc. и Microsoft Corporation; она поддерживается многими производителями шрифтов. Отдельные символы шрифтов TrueType определяются контурами, состоящими из прямых линий и кривых. Таким образом, Windows может масштабировать эти шрифты, изменяя определяющие контур координаты. Шрифты TrueType могут быть использованы как для вывода на экран, так и для вывода на принтер, делая реально возможным режим отображения текста WYSIWYG (what-you-see-is-what-you-get, что видите — то и получаете).
Когда вашей программе необходимо использовать шрифт TrueType определенного размера, Windows формирует растровое представление символов этого шрифта. Это означает, что Windows масштабирует координаты точек соединения прямых и кривых каждого символа, используя дополнительные данные, которые включены в файл шрифта TrueType. Эти дополнительные данные позволяют компенсировать ошибки округления, которые могли бы привести в результате к искажению символа. (Например, в некоторых шрифтах обе ножки заглавной буквы Н должны иметь одинаковую ширину. Простое масштабирование может привести к результату, когда одна ножка будет на пиксель шире, чем другая. Учет дополнительных данных шрифта предотвращает эту ситуацию.) Полученный таким образом контур каждого символа используется затем для создания битового образа символа. Эти битовые образы кэшируются в памяти для последующего применения.
Windows 95 оснащена 13 шрифтами TrueType. Они имеют следующие имена в соответствии с их видом:
•Courier New
•Courier New Bold
•Courier New Italic
•Courier New Bold Italic
•Times New Roman
•Times New Roman Bold
•Times New Roman Italic
•Times New Roman Bold Italic
•Arial
•Arial Bold
•Arial Italic
•Arial Bold Italic
•Symbol
Шрифт Courier New — это фиксированный шрифт (т. е. все символы имеют одинаковую ширину). Он разработан похожим на выводимые данные такого устаревшего устройства, как пишущая машинка. Группа шрифтов Times New Roman — это производные от шрифта Times, впервые разработанного специально для Times of London, и используемого во многих печатных материалах. Они рассчитаны на то, чтобы обеспечить максимальное удобство чтения. Группа шрифтов Arial — это производные от шрифта Helvetica, являющегося рубленым (sans serif) шрифтом. Это означает, что символы не имеют засечек на концах. Шрифт Symbol содержит ряд часто используемых специальных символов.
Обычно вы задаете шрифт путем указания его типового имени и типового размера. Типовой размер выражается в единицах, называемых пунктами. Пункт — это приблизительно 1/72 дюйма, разница настолько несущественна, что в компьютерной полиграфии пункт часто определяют как 1/72 дюйма без всяких оговорок. Текст этой книги напечатан шрифтом типового размера 12 пунктов. Типовой размер иногда определяют как высоту символа от верхней границы букв, имеющих выступающую верхнюю часть, до нижней границы букв, имеющих выступающую нижнюю часть. Это достаточно убедительный способ оценки типового размера, но он не является точным для всех шрифтов. Иногда разработчики шрифтов действуют по-другому.
Система EZFONT
Введение шрифтов TrueType — и их основополагающее использование в традиционной полиграфии — обеспечило Windows серьезную базу для многовариантного отображения текста. Однако, некоторые из функций выбора
159
шрифта Windows основаны на более старой технологии, при которой растровые шрифты на экране должны были аппроксимировать шрифты печатающего устройства.
Впредыдущих изданиях этой книги подробно рассматривалась функция EnumFonts, которая предоставляет любой программе структуры LOGFONT (logical font, логический шрифт) и TEXTMETRIC для каждого шрифта GDI, установленного для использования под Windows, и для всех шрифтов устройств. Диалоговое окно ChooseFont (которое подробнее будет рассмотрено в главе 11) делает ненужным использование этой функции и всего, что с ней связано. Также подробно обсуждалась функция CreateFontIndirect, которая позволяет программе описывать создаваемый шрифт без его немедленного именования. Это объясняет то, каким образом шрифты печатающего устройства аппроксимировались на экране монитора.
Вэтой главе вам будет предложено нечто совсем другое. Здесь будет показано, как можно использовать различные стандартные шрифты TrueType в ваших программах наиболее эффективно и одновременно с учетом требований традиционной полиграфии. Для этого надо задать название шрифта (одного из 13, перечисленных выше) и его размер (который будет рассмотрен вскоре). Шрифт назван EZFONT (easy font, простой шрифт). На рис. 4.33 приведены два файла, тексты которых вам потребуются.
EZFONT.H
/*----------------------
EZFONT.H header file
----------------------*/
HFONT EzCreateFont(HDC hdc, char * szFaceName, int iDeciPtHeight, int iDeciPtWidth, int iAttributes, BOOL fLogRes);
#define EZ_ATTR_BOLD |
1 |
#define EZ_ATTR_ITALIC |
2 |
#define EZ_ATTR_UNDERLINE |
4 |
#define EZ_ATTR_STRIKEOUT |
8 |
EZFONT.C
/*---------------------------------------
EZFONT.C -- Easy Font Creation
(c) Charles Petzold, 1996
---------------------------------------*/
#include <windows.h> #include <string.h> #include <math.h> #include "ezfont.h"
HFONT EzCreateFont(HDC hdc, char * szFaceName, int iDeciPtHeight, int iDeciPtWidth, int iAttributes, BOOL fLogRes)
{
FLOAT cxDpi, cyDpi;
HFONT hFont;
LOGFONT lf;
POINT pt;
TEXTMETRIC tm;
SaveDC(hdc);
SetGraphicsMode(hdc, GM_ADVANCED);
ModifyWorldTransform(hdc, NULL, MWT_IDENTITY);
SetViewportOrgEx(hdc, 0, 0, NULL);
SetWindowOrgEx (hdc, 0, 0, NULL);
if(fLogRes)
{
cxDpi =(FLOAT) GetDeviceCaps(hdc, LOGPIXELSX); cyDpi =(FLOAT) GetDeviceCaps(hdc, LOGPIXELSY);
}
else
{
cxDpi =(FLOAT)(25.4 * GetDeviceCaps(hdc, HORZRES) /
160
GetDeviceCaps(hdc, HORZSIZE));
cyDpi =(FLOAT)(25.4 * GetDeviceCaps(hdc, VERTRES) / GetDeviceCaps(hdc, VERTSIZE));
}
pt.x =(int)(iDeciPtWidth * cxDpi / 72); pt.y =(int)(iDeciPtHeight * cyDpi / 72);
DPtoLP(hdc, &pt, 1);
lf.lfHeight |
= -(int)(fabs(pt.y) / 10.0 + 0.5); |
|
|
|
lf.lfWidth |
= 0; |
|
|
|
lf.lfEscapement |
= 0; |
|
|
|
lf.lfOrientation |
= 0; |
|
|
|
lf.lfWeight |
= iAttributes & EZ_ATTR_BOLD |
? 700 |
: 0; |
|
lf.lfItalic |
= iAttributes & EZ_ATTR_ITALIC |
? |
1 |
: 0; |
lf.lfUnderline |
= iAttributes & EZ_ATTR_UNDERLINE ? |
1 |
: 0; |
|
lf.lfStrikeOut |
= iAttributes & EZ_ATTR_STRIKEOUT ? |
1 |
: 0; |
|
lf.lfCharSet |
= 0; |
|
|
|
lf.lfOutPrecision |
= 0; |
|
|
|
lf.lfClipPrecision |
= 0; |
|
|
|
lf.lfQuality |
= 0; |
|
|
|
lf.lfPitchAndFamily |
= 0; |
|
|
|
strcpy(lf.lfFaceName, szFaceName);
hFont = CreateFontIndirect(&lf);
if(iDeciPtWidth != 0)
{
hFont =(HFONT) SelectObject(hdc, hFont);
GetTextMetrics(hdc, &tm);
DeleteObject(SelectObject(hdc, hFont));
lf.lfWidth =(int)(tm.tmAveCharWidth *
fabs(pt.x) / fabs(pt.y) + 0.5);
hFont = CreateFontIndirect(&lf);
}
RestoreDC(hdc, -1);
return hFont;
}
Рис. 4.33 Файлы EZFONT
Программа EZFONT.C содержит только одну функцию — EzCreateFont — которую вы можете использовать, например, таким образом:
hFont = EzCreateFont(hdc, szFaceName, iDeciPtHeight, iDeciPtWidth, iAttributes, fLogRes);
Функция возвращает описатель шрифта. Шрифт может быть выбран в контекст устройства посредством вызова функции SelectObject. Затем вы можете вызывать функции GetTextMetrics или GetOutlineTextMetrics для определения действительного размера шрифта в логических координатах. Перед окончанием вашей программы необходимо удалить все созданные шрифты, вызвав функцию DeleteObject.
Параметр szFaceName — одно из 13 типовых имен шрифта TrueType из приведенного ранее списка. Если в вашей системе есть другие шрифты TrueType, вы можете также использовать их названия, но только 13 шрифтов, перечисленных ранее, обязательно присутствуют во всех системах Windows 95.
161
Третий параметр определяет желаемый размер шрифта в пунктах, но его особенность состоит в том, что он задается в деципунктах (каждый деципункт равен 1/10 пункта). Следовательно, если вы хотите задать размер в пунктах, равный 121/2, используйте значение 125.
Обычно четвертый параметр должен быть установлен в ноль или быть таким же, как третий параметр. Однако, вы можете создать более широкий или более узкий шрифт TrueType, установив другое значение этого параметра. Иногда этот размер называют "эм-шириной" (em-width) шрифта, и он описывает ширину шрифта в пунктах. Не путайте эту величину со средней шириной символов шрифта или с чем-нибудь похожим. На раннем этапе развития типографского дела заглавная буква ‘M’ имела одинаковые ширину и высоту. Так возникла концепция "эмквадрат", а впоследствии и такая мера как "эм-ширина". Когда эм-ширина равна эм-высоте (размеру шрифта в пунктах), то ширины символов установлены такими, какими изначально задумывались разработчиком шрифта. Задание большей или меньшей эм-ширины позволяет вам создавать более широкие или более узкие символы.
Параметр iAttributes может быть установлен в одно из следующих значений, определенных в EZFONT.H:
•EZ_ATTR_BOLD
•EZ_ATTR_ITALIC
•EZ_ATTR_UNDERLINE
•EZ_ATTR_STRIKEOUT
Может быть вам и не потребуется использовать значения EZ_ATTR_BOLD или EZ_ATTR_ITALIC, потому что эти атрибуты являются частью полного типового имени шрифта TrueType. Если вы их используете, то Windows синтезирует соответствующие эффекты.
Наконец, вы должны установить в TRUE значение последнего параметра для того, чтобы видимый размер шрифта основывался на логическом разрешении (logical resolution), возвращаемом функцией GetDeviceCaps. В противном случае он базируется на действительном разрешении.
Внутренняя работа
Функция EzCreateFont разработана для использования в системах Windows 95 или Windows NT. Для совместимости с NT используются функции SetGraphicsMode и ModifyWorldTransform, которые никак не влияют на работу Windows 95. (Другими словами, ModifyWorldTransform в Windows NT могла бы оказать влияние на видимый размер шрифта. Поэтому эта функция устанавливается в режим по умолчанию — без преобразования — перед тем, как вычисляется размер шрифта.)
Функция EzCreateFont сначала устанавливает поля структуры LOGFONT и вызывает функцию CreateFont, которая возвращает описатель шрифта. Для выбранных шрифтов TrueType большинство полей может быть установлено в ноль. Вам необходимо установить значения следующих полей:
•lfHeight — это желаемая высота символов (включая поле, отведенное для специальных знаков над символами, но не включая поле, установленное для межстрочного интервала) в логических единицах. Поскольку размер шрифта в пунктах — это и есть высота шрифта без величины поля, отведенного для специальных знаков над символами, то здесь вы на самом деле определяете значение межстрочного интервала. Вы можете установить значение lfHeight равным 0 для задания размера по умолчанию. Если вы зададите значение lfHeight отрицательным числом, Windows использует абсолютное значение этого числа в качестве желаемого размера высоты шрифта, а не как межстрочный интервал. Если вы хотите задать конкретное значение размера в пунктах, его надо преобразовать в логические единицы, и поле lfHeight установить в отрицательное значение результата.
•lfWidth — это желаемая ширина символов в логических единицах. В большинстве случаев его устанавливают в 0 и позволяют Windows выбирать шрифт, основываясь исключительно на высоте.
•lfWeight — это поле позволяет вам задать полужирный шрифт путем установки значения, равного 700.
•lfItalic — ненулевое значение поля определяет курсив.
•lfUnderline — ненулевое значение поля задает подчеркивание.
•lfStrikeOut — ненулевое значение поля определяет шрифт с зачеркиванием символов.
•lfFaceName (массив типа BYTE) — это имя шрифта (например, Courier New, Arial или Times New Roman).
Одним из действий, выполняемых функцией EzCreateFont, является преобразование размера в пунктах в логические единицы для последующей установки этого значения в структуре LOGFONT. Сначала размер в пунктах должен быть преобразован в единицы устройства (пиксели), а затем в логические единицы. Чтобы выполнить этот первый шаг, мы используем информацию, получаемую от функции GetDeviceCaps.
Вызов функции GetDeviceCaps c параметрами HORZRES и VERTRES дает нам ширину и высоту экрана (или области печати выводимой на принтере страницы) в пикселях. Вызов функции GetDeviceCaps c параметрами HORZSIZE и VERTSIZE дает нам физическую ширину и высоту экрана (или области печати выводимой на