- •Оглавление
- •Глава 1 Введение 7
- •Глава 2 Основные понятия 10
- •Глава 3 Рисование текста 42
- •Глава 4. Главное о графике 65
- •Глава 5 Клавиатура 180
- •Глава 6 Мышь 214
- •Глава 7 Таймер 233
- •Глава 8 Дочерние окна управления 247
- •Глава 1 Введение
- •Основные правила
- •1.2 Краткая история Windows
- •Глава 2 Основные понятия
- •2.1 Отличительная особенность Windows
- •2.1.1 Графический интерфейс пользователя
- •2.1.2 Концепции и обоснование gui
- •2.1.3 Содержимое интерфейса пользователя
- •2.1.4 Преимущество многозадачности
- •2.1.5 Управление памятью
- •2.1.6 Независимость графического интерфейса от оборудования
- •2.1.7 Соглашения операционной системы Windows
- •2.1.8 Вызовы функций
- •2.1.9 Объектно-ориентированное программирование
- •2.1.10 Архитектура, управляемая событиями
- •2.1.11 Оконная процедура
- •2.2 Ваша первая программа для Windows
- •2.2.1 Что в этой программе неправильно?
- •2.2.2 Файлы hellowin
- •2.2.3 Файл исходного текста программы на языке с
- •2.2.4 Вызовы функций Windows
- •2.2.5 Идентификаторы, написанные прописными буквами
- •2.2.6 Новые типы данных
- •2.2.7 Описатели
- •2.2.8 Венгерская нотация
- •2.2.9 Точка входа программы
- •2.2.10 Регистрация класса окна
- •2.2.11 Создание окна
- •2.2.12 Отображение окна
- •2.2.13 Цикл обработки сообщений
- •2.2.14 Оконная процедура
- •2.2.15 Обработка сообщений
- •2.2.15 Воспроизведение звукового файла
- •2.2.16 Сообщение wm_paint
- •2.2.17 Сообщение wm_destroy
- •2.3 Сложности программирования для Windows
- •2.3.1 Функции обратного вызова
- •2.3.2 Синхронные и асинхронные сообщения
- •Глава 3 Рисование текста
- •3.1 Рисование и обновление
- •3.1.1 Сообщение wm_paint
- •3.1.2 Действительные и недействительные прямоугольники
- •3.2 Введение в графический интерфейс устройства (gdi)
- •3.2.1 Контекст устройства
- •3.2.2 Получение описателя контекста устройства. Первый метод
- •3.2.3 Структура информации о рисовании
- •3.2.4 Получение описателя контекста устройства. Второй метод
- •3.2.5 Функция TextOut. Подробности
- •3.2.6 Системный шрифт
- •3.2.7 Размер символа
- •3.2.8 Метрические параметры текста. Подробности
- •3.2.9 Форматирование текста
- •3.2.10 Соединим все вместе
- •3.2.11 Оконная процедура программы sysmets1
- •3.2.12 Не хватает места!
- •3.2.13 Размер рабочей области
- •3.3 Полосы прокрутки
- •3.3.1 Диапазон и положение полос прокрутки
- •3.3.2 Сообщения полос прокрутки
- •3.3.3 Прокрутка в программе sysmets2
- •3.3.4 Структурирование вашей программы для рисования
- •Глава 4. Главное о графике
- •4.1 Концепция gdi
- •4.2 Структура gdi
- •4.2.1 Типы функций
- •4.2.2 Примитивы gdi
- •4.2.3 Другие аспекты
- •4.3 Контекст устройства
- •4.3.1 Получение описателя контекста устройства
- •4.3.3 Получение информации из контекста устройства
- •4.3.4 Размер устройства
- •4.3.5 О цветах
- •4.3.6 Атрибуты контекста устройства
- •4.3.7 Сохранение контекста устройства
- •4.4 Рисование отрезков
- •4.4.1 Ограничивающий прямоугольник
- •4.4.2 Сплайны Безье
- •4.4.3 Использование стандартных перьев
- •4.4.4 Создание, выбор и удаление перьев
- •4.4.5 Закрашивание пустот
- •4.4.6 Режимы рисования
- •4.5 Рисование закрашенных областей
- •4.5.1 Функция Polygon и режим закрашивания многоугольника
- •4.5.2 Закрашивание внутренней области
- •4.6 Режим отображения
- •4.6.1 Координаты устройства (физические координаты) и логические координаты
- •4.6.2 Системы координат устройства
- •4.6.3 Область вывода и окно
- •4.6.4 Работа в режиме mm_text
- •4.6.5 Метрические режимы отображения
- •4.6.6 Ваши собственные режимы отображения
- •Режим отображения mm_isotropic
- •Mm_anisotropic: растягивание изображения
- •4.6.7 Программа whatsize
- •4.7 Прямоугольники, регионы и отсечение
- •4.7.1 Работа с прямоугольниками
- •4.7.2 Случайные прямоугольники
- •4.7.3 Создание и рисование регионов
- •4.7.4 Отсечения: прямоугольники и регионы
- •4.7.5 Программа cover
- •4.8 Пути
- •4.8.1 Создание и воспроизведение путей
- •4.8.2 Расширенные перья
- •4.9 Битовые образы
- •4.9.1 Цвета и битовые образы
- •4.9.2 Битовые образы, не зависящие от устройства (dib)
- •4.9.3 Файл dib
- •4.9.4 Упакованный формат хранения dib
- •4.9.5 Отображение dib
- •4.9.6 Преобразование dib в объекты "битовые образы"
- •4.10 Битовый образ — объект gdi
- •4.10.1 Создание битовых образов в программе
- •4.10.2 Формат монохромного битового образа
- •4.10.3 Формат цветного битового образа
- •4.10.4 Контекст памяти
- •4.10.5 Запись пикселей на устройство отображения
- •Функция PatBlt
- •Координаты Blt
- •4.10.6 Перенос битов с помощью функции BitBlt
- •4.10.7 Функция DrawBitmap
- •4.10.8 Использование других rop кодов
- •4.10.9 Дополнительные сведения о контексте памяти
- •4.10.10 Преобразования цветов
- •4.10.11 Преобразования режимов отображения
- •4.10.12 Растяжение битовых образов с помощью функции StretchBlt
- •4.10.13 Кисти и битовые образы
- •4.11 Метафайлы
- •4.11.1 Простое использование метафайлов памяти
- •4.11.2 Сохранение метафайлов на диске
- •4.12 Расширенные метафайлы
- •4.12.1 Делаем это лучше
- •4.12.2 Базовая процедура
- •4.12.3 Заглянем внутрь
- •4.12.4 Вывод точных изображений
- •4.13 Текст и шрифты
- •4.13.1 Вывод простого текста
- •4.13.2 Атрибуты контекста устройства и текст
- •4.13.3 Использование стандартных шрифтов
- •4.13.4 Типы шрифтов
- •4.13.5 Шрифты TrueType
- •4.13.6 Шрифт ezfont
- •4.13.7 Внутренняя работа
- •4.13.8 Форматирование простого текста
- •4.13.9 Работа с абзацами
- •Глава 5 Клавиатура
- •5.1 Клавиатура. Основные понятия
- •5.1.1 Игнорирование клавиатуры
- •5.1.2 Фокус ввода
- •5.1.3 Аппаратные и символьные сообщения
- •5.2 Аппаратные сообщения
- •5.2.1 Системные и несистемные аппаратные сообщения клавиатуры
- •5.2.2 Переменная lParam
- •Счетчик повторений
- •Скан-код oem
- •Флаг расширенной клавиатуры
- •Код контекста
- •Флаг предыдущего состояния клавиши
- •Флаг состояния клавиши
- •5.2.3 Виртуальные коды клавиш
- •5.2.4 Состояние клавиш сдвига и клавиш-переключателей
- •5.2.5 Использование сообщений клавиатуры
- •5.4 Символьные сообщения
- •5.4.1 Сообщения wm_char
- •5.4.2 Сообщения немых символов
- •5.6 Каретка (не курсор)
- •5.6.1 Функции работы с кареткой
- •5.6.2 Программа typer
- •5.7 Наборы символов Windows
- •5.7.1 Набор символов oem
- •Поддержка языков различных стран в dos
- •5.7.2 Набор символов ansi
- •5.7.3 Наборы символов oem, ansi и шрифты
- •5.8 Решение проблемы с использованием системы unicode
- •5.8.2 Unicode и библиотека с
- •5.8.3 Типы данных, определенные в Windows для Unicode
- •5.8.4 Unicode- и ansi-функции в Windows
- •5.8.5 Строковые функции Windows
- •5.8.6 Создание программ, способных использовать и ansi, и Unicode
- •5.8.7 Ресурсы
- •5.8.8 Текстовые файлы
- •5.8.9 Перекодировка строк из Unicode в ansi и обратно
- •Глава 6 Мышь
- •6.1 Базовые знания о мыши
- •6.1.1 Несколько кратких определений
- •6.2 Сообщения мыши, связанные с рабочей областью окна
- •6.2.1 Простой пример обработки сообщений мыши
- •6.2.3 Двойные щелчки клавиш мыши
- •6.3 Сообщения мыши нерабочей области
- •6.3.1 Сообщение теста попадания
- •6.3.2 Сообщения порождают сообщения
- •6.4 Тестирование попадания в ваших программах
- •6.4.1 Гипотетический пример
- •6.4.2 Пример программы
- •6.4.3 Эмуляция мыши с помощью клавиатуры
- •6.4.4 Добавление интерфейса клавиатуры к программе checker
- •6.4.5 Использование дочерних окон для тестирования попадания
- •6.4.6 Дочерние окна в программе checker
- •6.5 Захват мыши
- •6.5.1 Рисование прямоугольника
- •6.5.2 Решение проблемы — захват
- •6.5.3 Программа blokout2
- •Глава 7 Таймер
- •7.1 Основы использования таймера
- •7.1.1 Система и таймер
- •7.1.2 Таймерные сообщения не являются асинхронными
- •7.2 Использование таймера: три способа
- •7.2.1 Первый способ
- •Что делать, если таймер недоступен
- •Пример программы
- •7.2.2 Второй способ
- •Пример программы
- •7.2.3 Третий способ
- •7.3 Использование таймера для часов
- •7.3.1 Позиционирование и изменение размеров всплывающего окна
- •7.3.2 Получение даты и времени
- •7.3.3 Обеспечение международной поддержки
- •7.3.4 Создание аналоговых часов
- •7.4 Стандартное время Windows
- •7.5 Анимация
- •Глава 8 Дочерние окна управления
- •8.1 Класс кнопок
- •8.1.1 Создание дочерних окон
- •8.1.2 Сообщения дочерних окон родительскому окну
- •8.1.3 Сообщения родительского окна дочерним окнам
- •8.1.4 Нажимаемые кнопки
- •8.1.5 Флажки
- •8.1.6 Переключатели
- •8.1.7 Окна группы
- •8.1.8 Изменение текста кнопки
- •8.1.9 Видимые и доступные кнопки
- •8.1.10 Кнопки и фокус ввода
- •8.2 Дочерние окна управления и цвета
- •8.2.1 Системные цвета
- •8.2.2 Цвета кнопок
- •8.2.3 Сообщение wm_ctlcolorbtn
- •8.2.4 Кнопки, определяемые пользователем
- •8.3 Класс статических дочерних окон
- •8.4 Класс полос прокрутки
- •8.4.1 Программа colors1
- •8.4.2 Интерфейс клавиатуры, поддерживаемый автоматически
- •8.4.3 Введение новой оконной процедуры
- •8.4.5 Закрашивание фона
- •8.4.5 Окрашивание полос прокрутки и статического текста
- •8.5 Класс редактирования
- •8.5.1 Стили класса редактирования
- •8.5.2 Коды уведомления управляющих окон редактирования
- •8.5.3 Использование управляющих окон редактирования
- •8.5.4 Сообщения управляющему окну редактирования
- •8.6 Класс окна списка
- •8.6.1 Стили окна списка
- •8.6.2 Добавление строк в окно списка
- •8.6.3 Выбор и извлечение элементов списка
- •8.6.4 Получение сообщений от окон списка
- •8.6.5 Простое приложение, использующее окно списка
- •8.6.6 Список файлов
- •Использование атрибутов файлов
- •Упорядочивание списков файлов
- •8.6.7 Утилита Head для Windows
Глава 1 Введение
Этот курс для тех, кто будучи искусным программистом языка С, хотел бы научиться писать приложения для операционной системы Microsoft Windows. Близкое знакомство с языком С является первым из трех необходимых условий освоения данного курса. Вторым условием является наличие 32-разрядной системы программирования для С++. И третье — реальное использование операционной системы Windows и умение работать с ее пользовательским интерфейсом.
Как вы вероятно знаете, Windows — это графическая операционная система, впервые представленная в ноябре 1985 года для использования на компьютерах типа IBM PC и совместимых с ним. По мере проникновения на рынок Windows почти полностью вытеснила всех имевшихся конкурентов и стала, фактически, эталоном операционной системы для персональных компьютеров. Теперь, если вы пишете программу для совместимых с IBM PC компьютеров, то вы пишете для Windows.
-
Основные правила
В этом курсе мы хотели бы научить вас тому, что считается классическим программированием для Windows. Мы возьмем добрый старый язык программирования С (а не С++) и напрямую используем базовый интерфейс программирования приложений, а не какую бы то ни было другую оболочку, скрывающую под упрощенным, на первый взгляд, интерфейсом все тот же API.
В определенном смысле эта книга описывает тяжелый путь создания программ для Windows, но вместе с тем это базовый, наиболее фундаментальный, гибкий и мощный путь. Используя другие подходы в программировании для Windows, вы не сможете реально добиться большего. Кроме того, изучая классическое программирование для Windows, использующее С и базовый API, вы сможете более отчетливо представить, как действуют Windows и ее приложения, и это знание может оказаться весьма полезным. Такой подход даст вам крепкий фундамент, о котором вы никогда не пожалеете. Поверьте.
1.2 Краткая история Windows
Вскоре после появления в середине 1981 года IBM PC стало очевидно, что господствующей операционной системой для PC (включая совместимые) должна стать MS-DOS, что означает Microsoft Disk Operating System.
Ранние версии MS-DOS обеспечивали для пользователя интерфейс командной строки, отображая такие команды как DIR и TYPE, которые могли загружать выполняемые программы в оперативную память и предлагали для этих программ определенный интерфейс для доступа к файлам, считывания информации с клавиатуры, и отображения на принтере и на экране дисплея (только в символьном режиме).
Из-за ограниченных возможностей программного и аппаратного обеспечения, графическая среда пробивала себе дорогу медленно. Компьютеры Apple показали возможную альтернативу, когда в январе 1983 года была создана скандально известная Lisa, и затем в январе 1984 года Apple, разработав Macintosh, создала образцовую графическую среду, которая (несмотря на постепенную утрату этой моделью компьютера своих позиций на рынке) все еще рассматривается как эталон, по которому равняются создатели любой другой графической оболочки.
О работе над Windows корпорация Microsoft заявила в ноябре 1983 года (позже, чем появилась Lisa, но раньше, чем Macintosh) и реализовала ее двумя годами позже, в ноябре 1985 года. В течение двух следующих лет, Microsoft Windows версии 1.0 претерпела несколько модернизаций, необходимых для удовлетворения требований международного рынка. Кроме этого появились дополнительные драйверы для новых дисплеев и принтеров.
Windows версии 2.0 была создана в ноябре 1987 года. Эта версия содержала несколько изменений пользовательского интерфейса. Наиболее важное из этих изменений касалось использования перекрывающихся окон, вместо окон, расположенных рядом, что было характерно для Windows версии 1.x. Windows версии 2.0 содержала также улучшенный интерфейс клавиатуры и манипулятора мышь, а также, отчасти, окон меню и диалога.
В то время для Windows требовались только процессоры Intel 8086 или 8088, работающие в реальном режиме, при этом доступ осуществлялся к 1 мегабайту оперативной памяти. Windows/386 (созданная вскоре после Windows 2.0) использовала виртуальный режим процессора Intel 80386 для запуска нескольких одновременно работающих с оборудованием программ MS-DOS в окнах. Для симметрии Windows версии 2.1 назвали Windows/286.
Windows версии 3.0 появилась 22 марта 1992 года. Здесь были объединены ранние версии Windows/286 и Windows/386. Главным изменением в Windows 3.0 была поддержка защищенного режима процессоров Intel 80286, 80386 и 80486. Это позволило Windows и ее приложениям получить доступ к 16 мегабайтам оперативной памяти. "Оболочка" программ Windows для запуска программ и поддержки файлов была полностью переделана. Windows 3.0 — это первая версия Windows, которая стала "родной" для множества пользовательских машин в домах и офисах.
Windows версии 3.1 появилась в апреле 1992 года. Сюда были включены такие важные свойства, как технология TrueType для шрифтов (что дало возможность масштабировать шрифты для Windows), multimedia (звук и музыка), OLE и диалоговые окна общего пользования. Кроме этого Windows 3.1 работала только в защищенном режиме и требовала процессора 80286 или 80386 и, по крайней мере, одного мегабайта оперативной памяти.
Windows NT, появившаяся в июле 1993 года, стала первой версией Windows, поддерживающей 32-разрядную модель программирования для процессоров Intel 80386 и 80486, а также Pentium. Windows NT имеет сплошное плоское (flat) 32-разрядное адресное пространство и 32-разрядные целые. Кроме этого Windows NT переносима и работает на нескольких моделях рабочих станций, основанных на RISC-технологии.
Windows 95 (первоначально условно названная Chicago, а иногда упоминающаяся и как Windows версии 4.0) появилась в августе 1995 года. Также как Windows NT, Windows 95 поддерживает 32-разрядную модель программирования (требуя, таким образом, для себя процессор 80386 и выше). Хотя у Windows 95 и нет некоторых возможностей Windows NT, таких как высокая степень безопасности и переносимость для работы с машинами, созданными по RISC-технологии; тем не менее она способна работать на компьютерах, имеющих всего 4 мегабайта оперативной памяти.
Считалось, что и Windows NT и Windows 95 поддерживают API Win32. Однако, у каждой из этих операционных систем имеются некоторые черты, которых нет у другой. Тем не менее общего у них гораздо больше, что позволяло писать программы, работающие в обеих системах. Начиная с Windows 2000 эти системы объединились.