Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
A05_API.doc
Скачиваний:
4
Добавлен:
12.11.2019
Размер:
1.3 Mб
Скачать

37

5. ПРОГРАММИРОВАНИЕ В ОПЕРАЦИОННОЙ СИСТЕМЕ WINDOWS 1

5.1. Основные концепции Windows 1

Контрольные вопросы 5

5.2. Архитектура, управляемая событиями 5

Контрольные вопросы 7

5.3. Примеры программ. 7

Контрольные вопросы 19

5.4. Программирование графики 19

Контрольные вопросы 24

Контрольные вопросы 27

5.6. Средства ввода 27

Контрольные вопросы 36

5.7. Меню и быстрые клавиши 36

5.8. Диалоговые окна 36

5.9. Программирование анимации 36

5. Программирование в операционной системе windows

Сегодня уже трудно вспомнить то время, когда не было Windows. Как бы программисты не относились к Windows, нужно признать, что это настоящее, а может быть и будущее компьютерной индустрии.

Интерфейс прикладного программирования (Application Programming Interface - API) Windows представляет собой набор функций, при помощи которых любое приложение может взаимодействовать с операционной системой и, через операционную систему, с другими приложениями. Масштаб современного API впечатляет, он содержит несколько тысяч функций, сотни сообщений, макросов, предопределенных констант.

В системах программирования используется очень мощная и сложная библиотека VCL (Visual Components Library), которая помимо непосредственных абстракций содержит также средства организации взаимодействия с операционной системой. В этой библиотеке находятся компоненты для визуального отображения информации, работы с базами данных, с системными объектами, компоненты для работы с Internet-протоколами, классы для написания своих COM-объектов и многое другое. Модули библиотеки подключаются к компиляции по мере необходимости.

Создавая приложение, программист постоянно решает вопросы взаимодействия программы с операционной системой. Используя систему программирования программист, как правило, избавлен от явного программирования многих действий, т.к. эти действия инкапсулированы в VCL. Однако для понимания поведения и квалифицированного использования компонентов необходимы знания принципов и идей, заложенных в Windows. Кроме того, без знания Windows многие возможности операционной системы могут остаться неиспользованными. Поэтому предлагаемый раздел представляет собой краткое введение в операционную систему Windows.

Выбор обсуждаемых тем обусловлен, в первую очередь, попыткой ответа на вопросы: «Почему операционная система является операционной системой «Windows»(«окна»)?» и «Как из этих «окон» извлечь инструментальные средства разработки программ?».

5.1. Основные концепции Windows

В операционной системе Windows интерфейс пользователя представляет собой целостную систему различных элементов. Элементами служат окна, органы управления, меню, диалоговые панели и другие объекты Windows. Каждый элемент обычно задают множеством параметров состояния, входных и выходных сообщений. Для элементов одного класса описывают единый метод изменения параметров состояния и обработки входных и выходных сообщений. Основной задачей проектирования интерфейса пользователя является разработка интегрированной системы управления множеством состояний программного продукта.

Любую современную программу или программную технологию можно представить как совокупность программных «слоев». Каждый из этих слоев производит свою собственную работу, которая заключается в повышении уровня абстракции производимых операций. Так, самый низший слой (слои) вводит понятия, которые позволяют абстрагироваться от используемого оборудования; следующий слой (слои) позволяет программисту абстрагироваться от сложной последовательности вызовов функций, вводя такое понятие как протокол и т.д. Практически в любом современном программном продукте можно обнаружить и выделить около десятка последовательных слоев абстракции.

Абстракция от оборудования и низкоуровневых протоколов вводится в ядра операционных систем в виде библиотек API (Application Programming Interface). Однако современные тенденции приводят к необходимости абстрагирования и от самих операционных систем, что позволяет переносить программы с одной операционной системы на другую путем простой перекомпиляции (транслируемые программы, в основном, вообще не требуют никаких действий по переносу).

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

Дополнительные библиотеки поставляются со многими средствами разработки с целью уменьшения трудоемкости и сроков разработки программ, что в итоге приводит к повышению их конкурентноспособности. Но применение дополнительных библиотек абстракций приводит к резкому увеличению размеров откомпилированных программ, из-за того что в программу включается код используемых библиотек, к тому же это включение зачастую бывает неэффективным - в программу включаются неиспользуемые участки кода. Кроме того, чем больше уровень абстракции библиотеки, тем сложнее ее код, и тем больше трудностей возникает при решении сложных задач. Приходится учитывать множество взаимосвязей и взаимных влияний отдельных элементов и процессов библиотеки друг на друга. Кроме того, структура и функциональность любой библиотеки обычно рассчитывается на удовлетворение всех потенциально возникающих задач, что приводит к ее громоздкости и неэффективности.

Среди преимуществ операционной системы Windows обычно выделяют следующее:

- графический интерфейс пользователя;

- многозадачность;

- управление памятью;

- независимость от аппаратных средств.

5.1.1. Графический интерфейс пользователя. Graphical User Interface1 (GUI) дает возможность пользователям работать с приложениями максимально удобным способом. Каждое приложение представлено на экране дисплея своим окном, которое выглядит как прямоугольная рабочая область с набором стандартных элементов управления. Окно идентифицируется своим заголовком, имеет кнопки минимизации и максимизации размеров, а также кнопку завершения приложения. Под заголовком обычно находится строка меню для выбора различных команд или режимов работы. Всплывающие окна диалога, вызываемые командами меню, также содержат привычные для пользователя элементы управления, такие как текстовые поля ввода информации, открывающиеся списки и кнопки различных типов. Большинство программ для Windows поддерживают работу и с клавиатурой, и с мышью.

Стандартизация графического интерфейса имеет очень большое значение для пользователя, потому что одинаковый интерфейс экономит его время и упрощает изучение новых приложений. С точки зрения программиста, стандартный вид интерфейса обеспечивается использованием подпрограмм, встроенных непосредственно в Windows, что также приводит к существенной экономии времени при написании новых программ.

5.1.2. Многозадачность. Многозадачные операционные системы позволяют пользователю одновременно работать с несколькими приложениями или несколькими копиями одного приложения. Например, пользователь может открыть систему программирования и набирать в текстовом редакторе код своей программы, одновременно слушая приятную музыку. В это же время программа explorer.exe может заниматься поиском необходимого файла по всему дисковому пространству компьютера.

Многозадачность осуществляется в Windows при помощи процессов и потоков. Любое приложение Windows после запуска реализуется как процесс (process). Грубо говоря, процесс можно представить как совокупность программного кода и выделенных для его исполнения системных ресурсов. При инициализации процесса система всегда создает первичный (основной) поток (thread), который исполняет код программы, манипулируя данными в адресном пространстве процесса.

Из основного потока при необходимости могут быть запущены один или несколько вторичных потоков, которые выполняются одновременно с основным потоком. На самом деле истинный параллелизм возможен только при исполнении программы на многопроцессорной компьютерной системе, когда есть возможность распределить потоки между разными процессорами. В случаях одпроцессорного компьютера или нехватке процессоров для всех потоков операционная система выделяет по очереди некоторый квант времени каждому потоку.

Но каковы соотношения между потоками и окнами? Дело в том, что окно всегда принадлежит некоторому потоку. Поток может быть владельцем одного или нескольких окон, а может быть и вовсе безоконным. Например, если вторичный поток создан для приема данных из COM-порта, то он вполне может обойтись без своего окна.

Наконец, сами окна, принадлежащие потоку, находятся в некоторых иерархических взаимоотношениях. Одно окно является окном верхнего уровня (top-level window)2, другие окна называются дочерними (child windows). Дочерние окна подчиняются своим родительским окнам (parent windows). Рисунок 5.1 иллюстрирует эти взаимоотношения.

Соотношение между процессами, потоками, окнами

Рис. 5.1

Если на экране находится несколько окон, то в каждый момент времени только одно из них может быть активным. Активное окно отличается более ярким фоном на строке заголовка, в то время как пассивные окна имеют более тусклый фон заголовка. Говорят, что активное окно имеет фокус ввода. Это означает, что любая информация, вводимая пользователем при помощи клавиатуры или мыши, будет перенаправляться операционной системой именно данному окну.

5.1.3. Управление памятью. Память – это один из важнейших разделяемых ресурсов в операционной системе. Если одновременно запущены несколько приложений, то они должны разделять память, не выходя за пределы выделенного адресного пространства. Так как одни программы запускаются, а другие завершаются, то память фрагментируется. Система должна уметь объединять свободное пространство памяти, перемещая блоки кода и данных.

Система Windows обеспечивает достаточно большую гибкость в управлении памятью. Если объем памяти меньше объема исполняемого файла, то система может загружать исполняемый файл по частям, удаляя из памяти отработавшие фрагменты. Если пользователь запустил несколько копий, которые также называют отдельными экземплярами приложения, то система размещает в памяти только одну копию исполняемого кода, которая используется этими экземплярами совместно. Программы, запущенные в Windows, могут использовать также функции из других файлов, которые называют библиотеками динамической компоновки – DLL (dynamic link libraries). Система Windows поддерживает механизм связи программ во время их работы с функциями из DLL. Даже сама операционная система Windows, по существу, является набором динамически подключаемых библиотек.

Механизмы управления памятью непрерывно совершенствуются по мере развития Windows.

5.1.4. Независимость от аппаратных средств. Еще одним преимуществом Windows является независимость от используемой платформы. У программ, написанных для Windows, нет прямого доступа к аппаратной части таких устройств отображения информации, как, например, экран и принтер. Вместо этого они вызывают функции графической подсистемы, называемой графическим интерфейсом устройства (Graphic Device Interface, GDI).

Функции GDI реализуют основные графические команды при помощи обращения к программным драйверам соотвествующих аппаратных устройств. Одна и та же команда (например, LineTo – нарисовать линию) может иметь различную реализацию в разных драйверах. Эта реализация скрыта от программиста, использующего Windows API, что упрощает разработку приложений.

Таким образом, приложения, написанные с использованием Windows API, будут работать с любым типом дисплея и любым типом принтера, для которых имеется в наличии драйвер Windows. То же самое относится и к устройствам ввода данных – клавиатуре, манипулятору «мышь» и др. Такая независимость Windows от аппаратных средств достигается благодаря указанию требований, которым должна удовлетворять аппаратура, в совокупности с SDK (Software Development Kit – набор разработки программ) и/или DDK (Driver Development Kit – набор разработки драйверов устройств). Разработчики нового оборудования поставляют его вместе с программными драйверами, которые обязаны удовлетворять этим требованиям.

5.1.5. Вызов функций. Windows API поддерживает вызовы свыше двух тысяч функций, которые можно использовать в приложениях. Все основные функции Windows объявлены в заголовочных файлах. Главным заголовочным файлом является windows.h. В этом файле содержится множество ссылок на другие заголовочные файлы.

Вызовы функций Windows API в программе осуществляются аналогично вызовам библиотечных функций систем программирования. Для языков программирования С и С++ основное различие заключается в том, что компоновщик связывает код библиотечных функций с кодом программы на этапе компоновки (статическое связывание), в то время как для функций Windows это связывание откладывается и осуществляется только на этапе выполнения программы (динамическое связывание). Библиотеки динамической компоновки (DLL) содержатся в файлах с расширением .dll. Большая часть этих библиотек расположена в подкаталоге SYSTEM каталога установки Windows.

Операционная система позволяет компилятору использовать библиотеки импорта, поставляемые в составе используемой среды программирования. Библиотеки импорта содержат имена всех функций из динамически подключаемых библиотек, а также ссылки на них. Используя эту информацию, компоновщик размещает в исполняемом файле таблицу, по которой в процессе загрузки программы настраиваются адреса вызываемых функций Windows API.

5.1.6. Объектно-ориентированное программирование. Хотя формально операционная система Windows не является объектно-ориентированной системой, тем не менее, в ней реализована именно объектно-ориентированная идеология. Это наиболее очевидно для базового объекта, с которым имеют дело и операционная система, и программист, и пользователь приложения, - то есть для окна.

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

Пользователь рассматривает окна в качестве объектов и непосредственно взаимодействует с ними, перемещая их по экрану, выбирая команды меню, нажимая различные кнопки и передвигая бегунок на полосах прокрутки.

Программист тоже рассматривает окна в качестве объектов, которые получают от пользователя информацию в виде оконных сообщений. Кроме этого окно обменивается сообщениями с другими окнами. Понимание этих сообщений – ключ к осмысленному программированию в среде Windows.

Можно привести и другие примеры объектов в Windows, к которым относятся, например, многочисленные графические объекты, используемые для рисования, такие как перья, кисти, шрифты, палитря и многие другие объекты.

Независимо от своего типа, любой объект в Windows идентифицируется своим дескриптором, или описателем. Оба эти названия являются переводом английского термина handle. Дескриптор – это своего рода ссылка на объект. Все взаимоотношения программного кода с объектом осуществляются только через его дескриптор. Система Windows тщательно скрывает свои внутренние секреты и не допускает прямогог доступа к внутренним структурам объекта.

5.1.7. Типы данных. Программиста, пишущего на С/C++, первое знакомство с программой для Windows поражает обилием типов данных. На самом деле все они определены посредством директив #define или #typedef в заголовочных файлах Windows. В таблице 5.1 приведены некоторые наиболее часто встречающиеся типы данных Windows.

Таблица 5.1. Некоторые часто используемые типы данных Windows

BOOL

Булевский тип

BYTE

Байт (8-битное целое без знака)

DWORD

32-битное целое без знака

HANDLE

Дескриптор объекта

HBITMAP

Дескриптор растрового изображения

HBRUSH

Дескриптор кисти

HCURSOR

Дескриптор курсора

HDC

Дескриптор контекста устройства

HFONT

Дескриптор шрифта

HICON

Дескриптор иконки

HINSTANCE

Дескриптор экземпляра приложения

HMENU

Дескриптор меню

HPEN

Дескриптор пера

HWND

Дескриптор окна

INT

32-битное целое со знаком

LONG

32-битное целое со знаком

LPARAM

Тип, используемый для описания IParam, четвертого параметра оконной процедуры

LPCSTR

Указатель на константную С-строку3

LPCTSTR

LPCWSTR, если определен макрос UNICODE, и LPCSTR в противном случае

LPCWSTR

Указатель на константную Unicode-строку4

LPSTR

Указатель на С-строку

LPTSTR

LPWSTR, если определен макрос UNICODE, и LPSTR в противном случае

LPWSTR

Указатель на Unicode-строку

LRESULT

Значение типа LONG, возвращаемое оконной процедурой

NULL

((void*)0)

TCHAR

Wchar_t(Unicode-символ), если определен макрос UNICODE, и char в противном случае

UINT

32-битное целое без знака

WPARAM

Тип, используемый для описания wParam, третьего параметра оконной процедуры

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]