Windows
ОГЛАВЛЕНИЕ
ВВЕДЕНИЕ
ИСТОРИЯ СОЗДАНИЯ MICROSOFT WINDOWS
ОБЗОР ОСНОВНЫХ ПРИНЦИПОВ ОРГАНИЗАЦИИ ИНТЕРФЕЙСА В WINDOWS
Аппаратно-независимый графический интерфейс (GDI
Стандартный оконно-ориентированный интерфейс
Окно
Пиктограммы
Меню
Полосы прокрутки
Курсоры
Каретка
Блоки диалога
Механизм сообщений
ИНТЕРФЕЙС ГРАФИЧЕСКИХ УСТРОЙСТВ (GDI
Устройства GDI
Логические обьекты графики GDI
Контекст устройства
Основные атрибуты контекста устройства
Перерисовка области и изображение пикселей
Рисование линий
Рисование закрашенных фигур
Вывод текста
ЭЛЕМЕНТЫ ОКОННОГО ИНТЕРФЕЙСА..............
Окна Windows....................... 20
Главное окно приложения................
Регистрация класса окна................
Функция окна приложения................
Создание окна.....................
Отображение и обновление окна.............
Типы окна.......................
Построение меню.....................
Определение меню...................
Обьекты диалога.....................
Кнопки и переключатели................
Статические обьекты диалога..............
Редактор.......................
Окно список......................
Комбинированный список................
ОБМЕН ДАННЫМИ МЕЖДУ ПРИЛОЖЕНИЯМИ..............
Средства обмена данными между приложениями........
Динамический обмен между приложениями..........
Основные термины...................
Несколько слов о DDEML................
Взаимосвязь между клиентом и сервером.........
Транзакции, функция обратного вызова DDE.......
Вспомогательные имена и другие названия........
Системный режим....................
Инициализация.....................
Основное назначение и работа функции обратного вызова.
Обработка строк....................
Диалог между приложениями...............
Простой Диалог....................
Сложный диалог....................
Обмен данными между приложениями...........
Классы транзакций...................
Определение ошибок..................
Список литературы....................
ВВЕДЕНИЕ
Для эффективной работы системы и ее большого
покупательского спроса недостаточно только того, чтобы аппаратура и программы обеспечивали правильные результаты - не менее важным фактором является удобство работы пользователя. Поэтому в настоящее время ни один программный продукт, лишенный более менее удобного интерфейса взаимодействия пользователя с компьютером и программ между собой, не может рассчитывать на успех.
В мире разработано огромное количество различных систем поддержки создания пользовательского интерфейса. Наиболее прогрессивному, по нашему мнению, являются обьектноориетированная система Turbo Vision фирмы Borland и операционная среда Windows фирмы Microsoft. Рассмотрением возможностей системы Turbo Vision занималась в своей работе Фомичева Т.Л., а в представленной работе производится изучение и обзор средств, входящих в состав операционной среды Windows.
Тот кто написал хотя бы одну коммерческую программу, то знает, сколько времени и сил уходит на организацию меню и выработку единого, непротиворечивого, интуитивно ясного и удобного пользовательского интерфейса. Интерфейс, разработанный корпорацией Microsoft является одним из лучших и стал своеобразным эталоном для подражания.
В Microsoft Windows программисту доступна вся мощь этого интерфейса - он избавляется от необходимости организовывать меню, работу с клавиатурой и мышью (достаточно воспользоваться стандартными средствами). Интерфейс с пользователем Windows является полным и цельным. В нем решены не только проблемы организации меню, но и все общение с пользователем организовано стандартными средствами.
ИСТОРИЯ СОЗДАНИЯ MICROSOFT WINDOWS
Корпорация Microsoft объявила о начале разработки графической операционной оболочки Windows 10 ноября 1983 года, хотя еще в конце 1982 года программисты Microsoft начали создавать универсальный набор графических процедур, названный Графическим Интерфейсом с Компьютером ( CGI ).
Первоначально предполагалось, что CGI как набор процедур будет поставляться с компиляторами Microsoft, позволяя разработчикам программ выводить графику на самые различные типы принтеров. Программисты могли бы использовать в своих программах функции CGI, которые затем переводились бы в команды нужного типа принтера.
Вскоре после начала работ над CGI корпорация Microsoft развернула работы по созданию графической операционной среды для компьютеров с MS-DOS. Создание такой оболочки было инспирировано неожиданным интересом пользователей IBM совместимых компьютеров к объявлению корпорацией VISICorp о начале работ над многооконной операционнной оболочкой VisiOn. Таким образом, старая добрая конкуренция сделала свое дело - в феврале 1983 года стало ясно, что Microsoft создаст свою собственную оболочку Windows.
Хотя многие особенности и свойства Windows кардинально изменились в последующем, некоторые положения были ясны с самого начала. Windows должна быть многозадачной, т.е. должна позволять запускать несколько программ одновременно. Windows должна работать со всеми типами дисплеев и принтеров. И поскольку пользователю очень трудно отказаться от привычных программных средств, Windows должна позволять запускать приложения MS-DOS. Последняя цель настолько оказалась трудной в реализации, что задержала весь проект на многие месяцы.
Задача оказалось не из простых. Типичной машиной был компьютер со сравнительно медленным процессором 8088 и оперативной памятью 64Kb. Если учесть, что MS-DOS накладывает принципиальное ограничение по оперативной памити в 640Kb и, в отличие от компьютеров Macintosh, не обеспечивает программноВнаппаратную поддержку графики, разработка многозадачной графической операционной оболочки грозила вырасти в неразрешимую задачу. Однако Microsoft развернула работы над Windows полным ходом. К осени 1983 года разработкой Windows было занято уже 15 высококвалифицированных программистов, привлеченных к проекту из различных филиалов Microsoft. Многие фирмы командировали своих специалистов для одновременного участия в проекте.
Когда работы над CGI перешли в фазу тестирования, это не был уже самостоятельный продукт. CGI был переменован в GDI (the Graphics Device Interface - "Интерфейс с графическими Устройствами") и стал частью Windows, включив в себя процедуры работы не только с принтером, но и с дисплеем. Для этого в CGI были добавлены функции, обеспечивающие поддержку типографско-издательских особенностей в работе с текстами и процедуры манипулирования графическими объектами.
При презентации первого варианта Windows было обещано, что коммерческая продажа начнется в мае 1984. Весной 1984 года дата начала продаж была отодвинута на ноябрь. В ноябре эта дата была перенесена на июнь 1985 года. Однако коробки с Windows появились в магазинах только 18 ноября 1985 года.
Несколько факторов привели к столь значительным
задержкам. Однако главную роль сыграло нежелание Microsoft
выходить на рынок с сырым продуктом. В феврале 1984 года глава
корпорации Microsoft Билл Гейтс ( Bill Gates ) провел семинар,
на котором представил Software Development Kit ( SDK ), пакет
для написания приложений под Windows, продемонстрировав на нем
возможности, предлагаемые программисту под Windows.
SDK произвел хорошее впечатление и к июню 1984 года было продано почти 100 копий. Начав работать под Windows, программисты присылали в Microsoft свои замечания, заставляя разработчиков еще и еще отшлифовывать Windows, облегчая
написание приложений. Был заменен язык, на котором создавался
Windows ( сначала это был Microsoft Pascal, затем Lattice C и,
наконец, Microsoft C Compiler ). Ориентация на Microsoft C
Compiler также была одной из причин задержки работ над
проектом, потому, что сам компилятор не был готовым продуктом
и постоянно совершенствовался.
Однако, несмотря на то, что в ноябре 1985 года Windows все же вышел на прилавки магазинов, в течение двух лет ( с 1985 по 1987 год ) Windows не оказал большого влияния на рынок программного обеспечения и не стал альтернативой MS-DOS, как надеялся Microsoft. Большое число пользователей ( 51% ) покупали Windows не ради созданных для него приложений (которых было очень мало по сравнению с обычными программами под MS-DOS ) или графического интерфейса, а для того, чтобы иметь возможность быстро переключаться с одного DOS приложения на другое.
С 1987 года ситуация начала меняться. Начали появляться мощные и известные приложения, переписанные для работы под Windows. Сейчас можно назвать такие продукты как Page Maker под Windows, очень мощная электронная таблица Excel, Windows Graph, Word for Windows и многие другие.
С выходом третей версии Windows стало ясно, что Windows не просто завоюет прочное место на рынке программного обеспечения, но станет основой стратегической политики Microsoft в создании программного обеспечения. Windows 3.0 произвел настоящий фурор, предлагая совершенно потрясающую графику и новые, неожиданные возможности.
В июле 1990 года "PC Magazine" поместил статью о новой версии Windows 3.0, в которой отмечалось, что Microsoft Windows превратился в блестящую многозадачную операционную систему, которой еще пытается стать OS/2. Как и все программные продукты Microsoft, первые версии Windows не оправдывали надежд несмотря на то, что выходили со значительными задержками, но в своем последнем варианте оставляют конкурентов далеко позади.
ОБЗОР ОСНОВНЫХ ПРИНЦИПОВ ОРГАНИЗАЦИИ
ИНТЕРФЕЙСА В WINDOWS
Для понимания принципов организации интерфейса Windows необходимо иметь представление об основных его элементах, на которых построено выполнение программ и взаимодействие программы и пользователя. Весь интерфейс Windows основывается на трех китах:
- аппаратно-независимая графика;
- стандартный оконно-ориентированный интерфейс;
- взаимодействие приложений с системой Windows и между собой посредством передачи сообщений;
Данные элементы системы Windows самым тесным образом связаны между собой, вместе образуют целостную систему и отдельное рассмотрение каждого из них в отрыве от других не имеет смысла. Перечисленные выше элементы системы Windows ниже будут рассмотрены более подробно, а пока вкратце остановимся на том, что они из себя представляют.
Аппаратно-независимый графический интерфейс (GDI)
Любая программа для Windows может выполнять вывод на любое устройство с помощью одного и того же набора вызываемых подпрограмм. Причем для Windows приложения все устройства выглядят одинаково и программисту не нужно забодится об управлении конкретным устройством на низком уровне.
Каждое устройство имеет свой драйвер, отвечающий за фактическое выполнение графического вывода. Для устройств, которым при этом необходима помощь, GDI обеспечивает программную эмуляцию, использующую для реализации функций высокого уровня средства низкого уровня этого устройства.
При выводе информации на экран дисплея GDI обеспечивает оконно-ориентированную графику. Это означает, что каждое окно рассматривается как отдельная область прорисовки. Когда программа выполняет в окне прорисовку, то координаты по умолчанию устанавливаются так, что точка начала координат (0,0) находится в верхнем левом углу клиентной области окна.
Кроме того, рисунки автоматически отсекаются по границам окна. Подобные механизм защиты работает двусторонне, то есть ни вы не можете нарисовать что-либо вне своего окна, ни другая программа нарисовать что-то в вашем окне.
Стандартный оконно-ориентированный интерфейс
Система Windows имеет встроенную поддержку ряда обьектов пользовательского интерфейса: окон, пиктограмм, меню, блоков диалога и т.п.
Окно
Окно представляет собой самую важную часть
пользовательского интерфейса. Оно играет ключевую роль.
Для программиста окно служит для организации прочих обьектов пользовательского интерфейса и направляет прохождение сообщений в системе, окно обеспечивает область экрана для связи с пользователем.
Окно - это самостоятельно существующий обьект, параметры которого описаны в специальных структурах данных, а поведение функцией окна.
Каждое окно принадлежит классу окон. Класс окон - это шаблон, по которому реализуются реальные окна. С каждым классом окон и, следовательно, с каждым окном связан специальный тип подпрограммы, называемый процедурой окна. Задача процедуры окна состоит в обработке поступающих окну сообщений.
Каждое приложение располагается в своем собственном окне и имеет по крайней мере хотя бы одно окно - главное окно приложения. Из приложения Windows непосредственно нельзя осуществить вывод на экран, так как экран является разделяемым ресурсом, а средством его разделения являются окна. Таким образом, прежде чем отобразить что-либо на экране, нужно создать окно, и только в окне можно осуществить вывод.
Пиктограммы
Пиктограмма представляет собой небольшой рисунок,
который служит для пользователя напоминанием о чем-либо и
обозначают команду, программу или некоторые данные.
Меню
Меню представляет собой список команд и функций программы. Имеется пять типов меню:
- системные,
- горизонтальные,
- выпадающие,
- вложенные,
- всплывающие.
Системные меню обеспечивают стандартный набор операций, которые могут быть выполнены с окном (перемещение, изменение размеров, закрытие, переключение на другую задачу и т.д.). Это меню обязательно находится в главном меню каждого приложения.
Горизонтальное меню фиксировано привязывается к верху окна.
Выпадающие меню появляются при выборе соответствующих пунктов горизонтального меню.
Вложенные меню появляются при выборе соответствующих пунктов выпадающих меню. Прикладная программа может вкладывать
одно меню в другое до любого уровня вложенности.
Всплывающие меню могут располагаться в произвольной позиции в окне и фактически в любой позиции на экране дисплея.
Полосы прокрутки
Используются в тех случаях, когда обьект данных больше размеров окна. Полосы прокрутки бывают вертикальными и горизонтальными. Они позволяют пользователю управлять отображением больших обьемов данных и иметь к ним доступ.
Существует ограничение на обьем данных в скроллинге. Обьем данных не может превышать 64 Кбайт.
Курсоры
Курсор представляет собой битовый образ, перемещаемый по экрану в ответ на перемещения мыши или другого координатного устройства. Программа может изменить формукурсора, чтобы отобразить некоторое изменение в системе.
Каретка
Каретка - это небольшая битовая матрица, которая является отметкой фокуса ввода с клавиатуры. Окно, управляющее вводом с клавиатуры может создать каретку, чтобы сообщить пользователю об этот факте.
Пользовательский интерфейс Windows поддерживает только одну каретку на экране.
Блоки диалога
Блок диалога - это стандартный способ приема программой ввода от пользователя. Типичный пример блока диалога - это блок диалога для открытия файла.
Блок диалога представляет собой окно, содержащее внутри себя отдельные окна, которые либо выводят некоторую информацию, либо позволяют принять ввод от пользователя. Каждое их этих окон называется элементом управления диалогом.
Система имеет шесть предопределенных классов окон, на базе которых создаются элементы управления блоками диалога:
- кнопки;
- комбинированные блоки;
- элементы управления редактированием;
- блоки списков;
- полосы прокрутки;
- статические элементы.
Более полное описание обьектов интерфейса представлено ниже.
Механизм сообщений
В системе Windows любое приложение строится как совокупность обработчиков различных событий, которые происходят совершенно независимо друг от друга. Каждое событие генерирует, сообщение, которое передаются всем приложениям, для которых оно может представлять интерес.
Приложение представляет собой 16-битовое значение без знака, которому для удобства присваивается символьная константа. Все сообщения имеют единый формат и являются единственным средством связи приложения с операционной оболочкой и с другими приложениями. Некоторые сообщения могут в свою очередь порождать другие сообщения.
При поступлении сообщения о произошедшем событии, это сообщение помещается в системную очередь Windows. Системная очередь в Windows одна. После этого сообщения из системной очереди распределяются между приложениями. Для каждого приложения Windows организует и поддерживает отдельную очередь, куда пересылаются все сообщения для этого приложения.Обработку очереди приложения осуществляет само приложение.
Если сообщение поступило например от устройств ввода, таких как мышь или клавиатура, то для определения адресата сообщения используется понятие "фокус ввода". Так как пользователь в каждый момент времени может работать только с одним приложением. Таким образом, говорят, что приложение, в которое попадают сообщения от клавиатуры в момент ввода, имеет фокус ввода, поэтому все сообщения от устройств ввода информации поступают из системной очереди в очередь приложения, имеющего фокус ввода в данный момент.
Для обработки поступающих сообщений в программе
организуется цикл сообщений, который создается при при
создании окна приложения. Цикл сообщений извлекает сообщения
из очереди и передает их функции управления соответствующим
окном приложения, причем не напрямую а через Window. О функции
окна приложений пойдет речь позже.
Все стандартные сообщения, определенные в системе Windows можно разделить на несколько групп:
- аппаратные (входные данные от мыши и клавиатуры);
- об организации окна (уведомление, требование действия, запрос);
- об организации интерфейса пользователя (меню,
указатель мыши, линейка прокрутки, блоки диалога, MDI);
- о завершении (закрытие прикладной программы или системы);
- частные (элементы управления блоком диалога: редактор кнопка, блок списка, комбо-блок);
- уведомление о системном ресурсе (изменение цвета, шрифты, буферизация печати, режимы работы устройств);
- о совместном использовании данных (буфер вырезанного изображения и динамический обмен данными DDE);
- внутренние системные (недокументированные сообщения).
Ниже будут более подробно рассмотрены перечисленные классы сообщений в контексте их применения. Особое внимание будет уделено сообщениям по взаимодействию между приложениями
и совместному использованию данных.
ИНТЕРФЕЙС ГРАФИЧЕСКИХ УСТРОЙСТВ (GDI)
В данном разделе рассматриваются вопросы связанные с созданием графического вывода, обсуждаются различные типы графического вывода, поддерживаемых интерфейсом графических устройств (GDI).
GDI представляет собой библиотеку графического вывода Windows. GDI обеспечивает графический вывод на экран дисплея и на устройства для получения твердых копий, например, принтеры и плоттеры. GDI отвечает за создание отображения каждой линии, буквы или графического знака, выводимого программой для Windows. Сама Windows использует GDI при подборке элементов, составляющих пользовательский интерфейс, - окон, пиктограмм, меню, блоков диалога и т.д.
Устройства GDI
Интерфейс графических устройств позволяет выполнять графический вывод на различные устройства. Для того, чтобы GDI работал с конкретным устройством, необходим специальный элемент программного обеспечения - драйвер устройства, который преобразует запросы графического вывода в конкретные действия для рисования на конкретном устройстве.
Помимо этого, драйвер устройства представляет GDI набор флагов, которые сообщают, какими графическими возможностями обладает данное устройство. Существует пять наборов таких флагов: для кривых линий, для прямых, многоугольников, битовых образов и текстов, которые сообщают GDI, когда можно направить устройству непосредственно запрос, а когда такой запрос надо предварительно преобразовать в последовательность запросов низкого уровня. Это зависит то возможностей конкретного устройства.
Помимо физических устройств GDI поддерживает логические устройства, или псевдоустройства. Псевдоустройства служат для хранения изображений. В отличие то физических устройств, которые выводят изображения на определенной аппаратной базе, псевдоустройства позволяют "перехватить" образ изображения в оперативной памяти или на диске. GDI поддерживает два типа псевдоустройств: битовые образы и метафайлы.
Битовые образы имеют прямоугольную форму и хранят изображения в памяти в таком виде, в каком графические образы хранятся дисплейным адаптером, и обеспечивают быстрое получение копии картинки. Битовые образы используются и для хранения образов, которые нужно быстро выводить на экран, например, пиктограммы, курсоры и т.д.
Метафайлы создаются средствами записи-воспроизведения
GDI. С точки зрения расходуемой памяти метафайлы
предпочтительнее, чем битовые образы, однако работа сними
происходит медленнее. Обычно в метафайлах хранятся крупные
изображения.
Логические обьекты графики GDI
Одним из средств достижения аппаратной независимости GDI является использование логических обьектов графики. Такой обьект описывает, каким образом должен выполняться вывод, это высокоуровневый аппаратно-независимый запрос. GDI поддерживает следующие логические обьекты графики:
- перья (для рисования линий);
- кисти (для закрашивания областей);
- шрифты (для вывода текстов);
- логические цвета (описывающие цвета вывода).
После создания логического обьекта он может быть использован в отношении любого устройства, при этом драйвер каждого устройства по своему интерпретирует логический обьект способом, соответствующий возможностям устройства.
Контекст устройства
Контекст устройства представляет собой некоторое
множество атрибутов графического вывода, в которое входит одно
перо для рисования линий, одна кисть для закрашивания областей
и один шрифт для вывода текстов, которые можно изменить в
любой момент. Вместе взятые, атрибуты графического вывода дают
полный контроль над тем, как выглядит и где выполняется
графический вывод программы.
Каждый контекст устройства включает в себя 20 атрибутов графического вывода, которые приведены ниже (в скобках приведено значение по умолчанию):
- Цвет фона (белый);
- Режим фона (OPAQUE);
- Логический номер кисти (белая кисть);
- Начало координат кисти (0,0);
- Логический номер области прорисовки (вся поверхность);
- Логический номер цветовой палитры (палитра по умолчанию);
- Текущая позиция пера (0,0);
- Режим графического вывода (R2_COPYPEN);
- Логический номер шрифта (системный шрифт);
- Межсимвольный интервал (0);
- Режим отбражения (MM_TEXT);
- Логический номер пера (черное перо);
- Режим закрашивания многоугольников (альтернативный);
- Режим растяжения (черный по белому);
- Выравнивание границ текста (по левому и верхнему краям);
- Цвет текста (черный для текста и кистей с монохромным
шаблоном закрашивания);
- Выравнивание строк текста (0,0);
- Протяженность окна данного экрана (1,1);
- Начало координат окна данного экрана (0,0);
- Протяженность окна экрана (1,1);
- Начало координат окна экрана (0,0).
Контекст устройства связывает программу с конкретной поверхностью рисования. Такое соединение является логическим, а не физическим. Чтобы избежать конфликтов, связанных с совместным использованием устройств, программа получает у контекста устройства "пропуск" к устройству. Работа системы пропусков зависит от типа устройства. На устройствах получения твердых копий это делается путем буферизации ввода, а на видеоустройствах - путем выделения так называемой области прорисовки, вне границ которой программа рисовать не может.
Основные атрибуты контекста устройства
Для рисовании линий самым важным атрибутом контекста устройства является перо, определяющее, как будет выглядеть линию: ее цвет, ширина и стиль (или шаблон, например, сплошная линия, пунктир и т.п.) и представляющее из себя запрос к устройству на рисование линии определенного вида.
При рисовании линий также используется атрибут - режим графического вывода, в котором можно задать логическую операцию, чтобы применить ее при выводе между новым и старым пикселями.
Для закрашивания областей используется атрибут кисть, определяющий как будет выглядеть закрашиваемая область и характеризующийся тремя характеристиками: стилем, цветом и шаблоном. Размер кисти составляет 8Х8 пикселей.
При изображении текста ключевым атрибутом является шрифт. Шрифт - совокупность шаблонов для вывода текста. GDI распознает два вида шрифтов: логические и физические.
Логический шрифт описывает текст стандартным не
зависящим от внешних устройств способом. Логический шрифт
задается структурой LOGFONT. Логический шрифт - это запрос на
на текст с определенными характеристиками.
typedef struct tagLOGFONT
int lfHeight; // высота символа
int lfWidth; // средняя ширина
int lfEscapement; // угол наклона текста
int lfOrientation; // угол наклона символа
int lfWeight; // среднее число пикселей/1000
BYTE lfItalic; // не 0, если курсив
BYTE lfUnderline; // не 0, если подчеркнуто
BYTE lfStrikeOut; // не 0, если вычеркнуто
BYTE lfCharSet; // набор символов ANSI, OEM
BYTE lfOutPrecision; // точнось отображения
BYTE lfClipPrecision; // точность вырезки
BYTE lfQuality; // качество печати
BYTE lfPitchAndFamily; // флаг для стиля шрифта
BYTE lfFaceName[LF_FACESIZE]; // название шрифта
LOGFONT;
Физический шрифт - это набор шаблонов, зависящий от устройства. Он выбирается по описанию, содержащемуся в логическом шрифте и может быть аппаратно реализован.
Для задания атрибута контекста устройства используется функция SelectObject, описанная следующим образом:
HANDLE FAR PASCAL SelectObject(HDC, HANDLE);
Здесь первый параметр - логический номер контекста устройства, а второй - логический номер значения атрибута.
Для того, чтобы получить логический номер требуемого значения атрибута контекста, используется функция GetStockObject. Ее прототип:
HANDLE FAR PASCAL GetStockObject(int);
Параметром является значение атрибута контекста
устройства, обычно для удобства задаваемое в виде набора
символов.
Программист может использовать либо уже заданные значения атрибутов, либо создавать свои новые.
Перерисовка области и изображение пикселей
Из-за того, что Windows не накладывает ограничений на размеры и расположение окон приложений, могут возникнуть ситуации, что окно одного приложения перекроет окно другого приложения, поэтому при переключении между приложениями необходимо перерисовыть поврежденные области окна.
Для этой цели используется подпрограмма BeginPaint. При получении сообщения WM_PAINT, говорящее о необходимости перерисовки окна из изменения его размеров или восстановления поврежденной области, подпрограмма BeginPaint получает контекст устройства и определяет область, которую надо перерисовать.
Подпрограмма BeginPaint принимает два параметра:
логический номер окна и указатель на структуру данных
PAINTSTRUCT, Она возвращает логический номер контекста устройства, необходимый для рисования пикселя. Прототип подпрограммы имеет вид:
HDC FAR PASCAL BeginPaint(HWND, LPPAINTSTRUCT);
Структура PAINTSTRUCT определена так:
typedef struct tagPAINTSTRUCT
HDC hdc;
BOOL fErase;
RECT rcPaint;
BOOL fRestore;
BOOL fIncUpdate;
BYTE rgbReserved[16];
PAINTSTRUCT;
hdc - логический номер контекста устройства;
fErase - флаг, задающий необходимость стирания окна; rcPaint - описывает прямоугольник, ограничивающий
поврежденную область;
fRestore, fIncUpdate и rgbReserved предназначены для внутреннего использования Windows.
Для отображения пикселя используется подпрограмма
SetPixel. Ее прототип:
DWORD FAR PASCAL SetPixel( HDC, int, int, DWORD);
HDC - логический контекст устройства; следующие два параметра - координаты пикселя; последний параметр - цвет.
После завершения перерисовки, программа вызывает функцию EndPaint, чтобы вернуть контекст устройства дисплея Менеджеру Окон и сообщить, что окно восстановлено. Когда тот получает контекст устройства, он восстанавливает все его атрибуты по умолчанию, и контекст устройства готов к передаче информации любой программе, которой понадобится нарисовать окно. Подпрограмма EndPaint имеет прототип:
void FAR PASCAL EndPaint(HWND, LPPAINTSTRUCT);
Рисование линий
Каждая линия имеет начальную и конечную точку, и GDI рисует линию так, начальная точка включается в линию, а конечная исключается из линии.
GDI имеет 4 подпрограммы для рисования линий: MoveTo, LineTo, PolyLine и Arc.
Подпрограмма MoveTo помещает пару координат XY в атрибут контекста устройства, который называется текущей позицией. Подпрограмма имеет прототип:
DWORD FAR PASCAL MoveTo( HDC, int x1, int y1 );
Подпрограмма LineTo берет начальную точку из атрибута текущей позиции и рисует линию до конечной точки, передаваемой как параметр. После этого она устанавливает новое значение атрибута текущей позиции. Подпрограмма имеет прототип:
BOOL FAR PASCAL LineTo( HDC, int x1, int y1 );
Подпрограмма Polyline позволяет нарисовать ломанную линию, но для ее работы необходимо предварительно создать массив координат точек. Подпрограмма имеет прототип:
BOOL FAR PASCAL Polyline( HDC, LPPOINT points, int num );
points - указатель на массив координат, котором координаты оси абсцисс и оси ординат чередуются; num - число пар координат в массиве.
Подпрограмма Arc позволяет нарисовать дуги эллипса. Передаваемые параметры определяют прямоугольник, ограничивающий фигуру, если бы она была полной, начальную точку и конечную. Подпрограмма имеет прототип:
BOOL FAR PASCAL Arc( HDC,int,int,int,int,int,int,int,int);
Рисование закрашенных фигур
Для рисования закрашенных фигур существует семь
различных функций.
Функция Polygon соединяет расположенные последовательно точки с помощью текущего установленного в контексте устройства пера. Функция определена так:
BOOL FAR PASCAL Polygon(HDC, LPPOINT, int);
HDC - логический номер контекста устройства;
LPPOINT - указатель на массив координат, соединяемых граничных точек;
Третий параметр - число соединяемых точек.
Функция PolyPolygon позволяет нарисовать за один вызов несколько многоугольников и определена так:
BOOL FAR PASCAL PolyPolygon(HDC, LPPOINT, LPINT, int);
HDC - логический номер контекста устройства;
LPPOINT - указатель на массив координат, соединяемых граничных точек всех создаваемых многоугольников;
LPINT - указатель на массив типа int. Элементы массива задают число точек в каждом многоугольнике*
Последний параметр задает количество точек в массиве LPINT, то есть количество многоугольников.
Для рисования закрашенного эллипса используется функция Ellipse. Она определяется так:
BOOL FAR PASCAL Ellipse(HDC, int, int, int, int);
HDC - логический номер контекста устройства;
Остальные параметры определяют координаты
ограничивающего прямоугольника.
Функция Chord используется для рисования частичной дуги, концы которой соединены сегментом линии. Для этого также используется ограничивающий прямоугольник. Определение функции следующее:
BOOL FAR PASCAL Chord(HDC,
int, int,
int, int,
int, int,
int, int);
HDC - логический номер контекста устройства;
Следующие четыре параметры определяют координаты
ограничивающего прямоугольника.
Далее указываются координаты начальной и конечной точки сегмента линии.
Функция Pie аналогична функции Chord, только рисует не хорду, а сектор эллипса. Она определена следующим образом:
BOOL FAR PASCAL Pie(HDC,
int, int,
int, int,
int, int,
int, int);
HDC - логический номер контекста устройства;
Следующие четыре параметры определяют координаты
ограничивающего прямоугольника.
Далее указываются координаты начальной и конечной точки сектора.
Для рисования прямоугольника используется функция
Rectangle.Ее прототип:
BOOL FAR PASCAL Rectangle(HDC, int, int, int, int);
HDC - логический номер контекста устройства;
Остальные параметры определяют координаты
прямоугольника.
Если требуется нарисовать прямоугольник с закругленными краями, то имеется функция RoundRect. Она определена та:
BOOL FAR PASCAL RoundRect(HDC,
int, int,
int, int,
int, int);
HDC - логический номер контекста устройства;
Следующие четыре параметры определяют координаты
прямоугольника.
Последние два параметра задают ширину и высоту ограничивающего прямоугольника для эллипса, используемого при скруглении угла.
Вывод текста
Для вывода текста имеется пять основных функций.
Функция TextOut предназначена для вывода одной строки. Она определена следующим образом:
BOOL FAR PASCAL TextOut(HDC, int, int, LPSTR, int);
HDC - логический номер контекста устройства;
Следующие два параметры определяют координаты точки привязки выводимой стоки текста.
LPSTR - указатель на выводимую символьную строку.
Последний параметр - число символов в строке текста.
Более мощный вариант функции TextOut представляет собой функция ExtTextOut. Она позволяет управлять интервалом между строками и вырезкой
BOOL FAR PASCAL ExtTextOut( HDC,
int, int,
WORD wOptions,
LPRECT lpRect,
LPSTR lpString,
WORD nCount,
LPINT lpDx );
HDC - логический номер контекста устройства;
Следующие два параметры определяют координаты точки привязки выводимой стоки текста.
wOptions - флаг, принимающий значение 0, ETO_CLIPPED, ETO_OPAQUE и ETO_CLIPPED|ETO_OPAQUE, позволяющий устанавливать прямоугольные области вырезки и при выводе текста затирать фон.
lpRect - указатель на структуру прямоугольника;
lpString - указатель на выводимую символьную строку.
nCount - число символов в строке текста. lpDx -
указатель на массив значений интервалов между
символами.
Функция TabbedTextOut при выводе текста распространяет знаки табуляции до позиций табуляции. Это обеспечивает удобный способ выравнивания столбцов данных. Прототип функции:
LONG FAR PASCAL TabbedTextOut(HDC,
int, int,
LPSTR, int, LPINT, int);
HDC - логический номер контекста устройства;
Следующие два параметры определяют координаты точки привязки выводимой стоки текста.
LPSTR - указатель на выводимую символьную строку.
Следующий параметр - число символов в строке текста.
LPINT - указатель на массив позиций табуляции;
Последний параметр - число элементов массиве позиций табуляции.
Функция DrawText обеспечивает некоторую возможность форматирования и переход в автоматическом режиме на новую строчку при большом количестве строк текста. Ее прототип:
int FAR PASCAL DrawText(HDC, LPSTR, int, LPRECT, WORD);
HDC - логический номер контекста устройства;
LPSTR - указатель на выводимую символьную строку.
Следующий параметр - число символов в строке текста. LPRECT - указатель на структуру прямоугольника,
определяющего позицию вывода и границы для форматирования. Последний параметр определяет режим форматирования.
Для отображения заблокированных пунктов меню и
заблокированных элементов управления блоками диалога Менеджер
Окон использует функцию GrayString.
ЭЛЕМЕНТЫ ОКОННОГО ИНТЕРФЕЙСА
Окна Windows
Главное окно приложения
Каждое приложение располагается в своем собственном окне и имеет по крайней мере хотя бы одно окно - главное окно приложения. Из приложения Windows непосредственно нельзя осуществить вывод на экран, так как экран является разделяемым ресурсом, а средством его разделения являются окна. Таким образом, прежде чем отобразить что-либо на экране, нужно создать окно, и только в окне можно осуществить вывод.
Функция главного окна приложения выполняет в программе ту же роль, что функция main() программы на Си для MS-DOS. При создании окна функция библиотеки SDK выполняет специальные действия начальной подготовки в DOS, не явно осуществляемых функцией main(). Поэтому приложение не содержит функции main(), роль которой выполняет функция WinMain(), получающая управление в начальный момент загрузки приложения. Функция WinMain() выполняет следующие основные действия:
- регистрация класса окна приложения и другие
инициализации;
- создание основного окна приложения и, возможно, других, подчиненных окон;
- запуск цикла обработки сообщений, помещаемых в очередь приложения;
- завершение работы приложения при извлечении из очереди сообщения WM_QUIT.
Прототип функции WinMain выглядит так:
int PASCAL WinMain
(
HANDLE instance, // дескриптор предыдущей копии
HANDLE prevInstance, // предыдущая копия
LPSTR cmdLine, // указатель на командную строку
int cmdShow // флаг "окно открыто/закрыто"
);
instance - однозначно определяет каждую копию
приложения, если приложение запущено несколько раз.
prevInstance - определяет копию данного приложения, которая была последней активной копией. Если этот параметр равен 0, то других копий приложения, исполняемых в данный момент не существует.
cmdLine - дальний указатель на
Вместе с этим смотрят: