Программирование в Windows API. Учебное пособие
.pdfМинистерство транспорта Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего образования «Российский университет транспорта (МИИТ)»
___________________________________________________
Институт пути, строительства и сооружений
Кафедра «Системы автоматизированного проектирования»
И.В. НЕСТЕРОВ, Э.Р. РЕЗНИКОВА, А.А. ЩЕРБАКОВ
ПРОГРАММИРОВАНИЕ В WINDOWS API
Учебное пособие
для студентов направления «Информатика и вычислительная техника»
Москва – 2017
УДК 004
Н 56
Нестеров И.В., Резникова Э.Р., Щербаков А.А. Программирование в Windows API: Учебное пособие. - М.:
РУТ (МИИТ), 2017. - 70 с.
В учебном пособии изложены основные принципы программирования в среде Microsoft Windows на языке C++ с применением Win32 API. Подробно рассмотрены функции, структуры и сообщения API, необходимые для построения Windows-приложений. Приведены примеры программ с подробными комментариями. Пособие предназначено для студентов, обучающихся по направлению «Информатика и вычислительная техника», изучающих дисциплину "Программирование".
Рецензенты:
Начальник отдела программного обеспечения ОАО «Институт Гипростроймост», кандидат технических наук О.А. Потапова
Доцент кафедры «Мосты и тоннели» РУТ (МИИТ), кандидат технических наук А.Н. Сонин
© РУТ (МИИТ), 2017
Оглавление |
|
Введение .................................................................................. |
4 |
1. Базовые типы данных в программах под Windows ......... |
7 |
2.Общая структура простого приложения под Windows 10
3.Функции и структуры API, необходимые для построения
Windows-приложения ....................................................... |
16 |
|
3.1 |
Функция WinMain ....................................................... |
16 |
3.2 |
Оконная функция ........................................................ |
17 |
3.3 |
Функция RegisterClassEx............................................ |
19 |
3.4 |
Функция UnregisterClass............................................. |
23 |
3.5 |
Функция CreateWindow .............................................. |
23 |
3.6 |
Функция ShowWindow ............................................... |
29 |
3.7 |
Функция UpdateWindow ............................................. |
31 |
3.8 |
Функция GetMessage................................................... |
31 |
3.9 |
Функция DispatchMessage .......................................... |
32 |
3.10 Функция PostQuitMessage ........................................ |
33 |
|
4. Пример программы, создающей два окна с разными |
|
|
классами и оконными функциями................................... |
34 |
|
5. Организация вывода информации в окно с помощью |
|
|
интерфейса графических устройств GDI........................ |
40 |
|
5.1. Правила обработки сообщения WM_PAINT. |
|
|
Функции API для подготовки контекста устройства. 42 |
||
5.2 |
Правила использования объектов GDI. Некоторые |
|
|
функции API для работы с объектами GDI. ............. |
46 |
5.3 |
Функции для вывода текста ....................................... |
55 |
5.4 |
Функции API рисования простых графических |
|
|
примитивов .................................................................. |
57 |
5.5 |
Задание цвета при работе с функциями |
|
|
графического вывода .................................................. |
58 |
5.6 |
Пример программы вывода простых графических |
|
|
примитивов .................................................................. |
61 |
5.7 |
Пример обработчика сообщения WM_PAINT ......... |
65 |
Литература ............................................................................. |
69 |
|
|
3 |
|
Введение
Application Programming Interface (API), или
Интерфейс прикладных программ (ИПП), представляет собой обширный набор функций, предоставляемых операционной системой прикладной программе, для выполнения базовых действий (управление дисковой и оперативной памятью, монитором, периферийными устройствами и т.п.).
Windows - многозадачная операционная система (ОС), обеспечивающая выполнение нескольких приложений одновременно, и оснащенная графическим пользовательским интерфейсом (ГПИ). Разработана корпорацией Microsoft в 1985 году для IBM-совместимых ПК. К настоящему времени существует большое количество версий различных лет выпуска и назначения.
Win API – программный интерфейс операционной системы Windows. Содержит функции для работы с памятью, файлами, сетью и др. Значительная часть функций предназначена для управления достаточно сложным многооконным пользовательским интерфейсом. Различные версии Windows содержат наборы функций API, которые имеют одинаковые по версиям имена, но различную внутреннюю реализацию. С эволюцией ОС в API добавляются новые функции, а некоторые функции объявляется устаревшими, но оставляются для совместимости.
Графический пользовательский интерфейс (ГПИ,
GUI) – стандартная среда взаимодействия пользователя с прикладной программой. Основная идея ГПИ, обеспечиваемого операционной системой, состоит в том, что при работе с множеством различных приложений пользователь имеет дело с единообразным набором элементов управления (кнопки, поля ввода, списки и др.), что существенно упрощает освоение и использование
4
новой прикладной программы. Первыми компьютерами, оснащёнными ГПИ, были Lisa (1980) и Macintosh (1984)
фирмы Apple.
Окно (Window) – базовый элемент ГПИ, представляет собой область экрана, предназначенную для отображения графической или текстовой информации и/или восприятия команд пользователя, поступающих от устройств ввода (клавиатура и мышь). Активным окном называется окно, имеющее в данный момент фокус ввода, т.е. принимающее поступающие от клавиатуры данные, в любой момент времени активным может быть только одно окно. ОС организует централизованное управление всеми окнами таким образом, что прикладная программа должна заботиться только о «своих» окнах. Прикладная программа, использующая ГПИ, содержит по меньшей мере одно окно. ОС позволяет достаточно широко варьировать свойства окон, что позволяет создавать сложные специализированные элементы ГПИ. Почти все элементы ГПИ (кнопки, поля, полосы прокрутки и т.п.) являются окнами. Окна могут располагаться на экране как самостоятельно, так и быть привязанными к другим (родительским) окнам. Стандартные диалоговые элементы могут располагаться только в пределах диалоговых оконоснований.
Класс окна (КО) – набор параметров, определяющих общие свойства и поведение группы окон одного типа. КО имеет уникальное имя-идентификатор (название) и хранится операционной системой в специальной области памяти. ОС Windows предоставляет программисту целый ряд предопределённых окон: кнопка, поле ввода, список и др., которые, работая в разных приложениях, ведут себя одинаково. При решении определённой задачи, как правило, требуется создание окон с особенными свойствами. В этом случае необходимо зарегистрировать
5
специальный класс окна и запрограммировать поведение окна этого типа.
Всего существует три типа классов окон:
1)системные (предопределённые), предоставляемые операционной системой, доступные всем приложениям;
2)прикладные глобальные классы, регистрируемые приложениями или библиотеками DLL, доступные всем приложениям;
3)прикладные локальные классы, регистрируемые приложением для внутреннего использования.
Прикладная программа, функционирующая в ОС Windows, не имеет прямого доступа к аппаратуре. Вся необходимая программе информация о происходящих в системе событиях (сигналы от устройств ввода, от других приложений или устройств) передаётся операционной системой по запросам данной программы с помощью функций API. Функционирование ГПИ обеспечивается т.н.
механизмом сообщений.
Сообщение – это числовой код, обозначающий определённое событие (например, перемещение мыши, нажатие клавиши, изменение состояния окна). Программа может принимать и передавать как стандартные сообщения, так и дополнительные специальные сообщения. Операционная система организует для каждого потока приложения системную очередь сообщений.
Приложение получает сообщение и дополнительные данные с помощью вызова функций API.
Оконная функция – функция специального формата, определяемая программистом для обработки сообщений ОС и реализации задач, которые должно выполнять приложение. Эта функция привязана к определённому классу окон и вызывается операционной системой для передачи сообщения окну данного класса.
6
1. Базовые типы данных в программах под
Windows
При программировании для Windows используется целый ряд специальных типов данных, условно их можно разделить на несколько видов: основные, дескрипторные, строковые и вспомогательные, а также структуры.
Основные типы данных
BOOL |
аналогичен bool, также имеет два значения: |
|
0 (FALSE) и 1 (TRUE), при использовании |
|
WinAPI принято вместо 0 использовать |
|
NULL |
BYTE |
байт, или 8-битное беззнаковое целое число, |
|
аналог – unsigned char |
DWORD |
32-битное беззнаковое целое, |
|
аналоги - unsigned long int, UINT |
INT |
32-битное целое, аналог – long int |
LONG |
32-битное целое |
NULL |
нулевой указатель |
Дескрипторные типы данных
Дескриптор – это указатель, ссылка на объект, представляет собой 32-разрядное целое число, назначаемое операционной системой для идентификации объекта, располагаемого в физической памяти. Объектом может быть окно, дисковый файл, курсор мыши, шрифт, процесс, поток и др. Программный код получает доступ к объекту только через его дескриптор. Для разных типов объектов существуют разные дескрипторы.
Примечание: для удобства в WinAPI предусмотрены сокращения для типов данных. Первая буква H (от слова handle) – дескриптор.
7
|
HANDLE |
дескриптор объекта |
|
|
|
|
|
|
HINSTANCE |
дескриптор экземпляра приложения |
|
|
|
|
|
|
HWND |
дескриптор окна |
|
|
|
|
|
|
HMENU |
дескриптор меню |
|
|
|
|
|
|
HDC |
дескриптор контекста устройства |
|
|
|
|
|
|
HGDIOBJ |
дескриптор объекта GDI любого типа |
|
|
|
|
|
|
HBRUSH |
дескриптор кисти |
|
|
|
|
|
|
HPEN |
дескриптор пера |
|
|
|
|
|
|
HFONT |
дескриптор шрифта |
|
|
|
|
|
|
HCURSOR |
дескриптор курсора |
|
|
|
|
|
Строковые типы данных |
|||
|
|
|
|
|
TCHAR |
|
символьный тип, аналог char и wchar_t |
|
LPCTSTR |
|
указатель на константную строку (long |
|
|
|
pointer constant TCHAR string) |
|
LPCWSTR |
|
указатель на константную UNICODE |
|
|
|
строку |
|
LPSTR |
|
указатель на строку, заканчивающуюся |
|
|
|
нулевым символом (long pointer string) |
|
LPTSTR |
|
указатель на строку (long pointer |
|
|
|
TCHAR string) |
|
LPWSTR |
|
указатель на UNICODE строку (long |
|
|
|
pointer wide character string) |
Windows поддерживает работу с символами как в ANSI кодировке (однобайтовой), так и в кодировке UNICODE, где каждый символ кодируется двумя байтами. Для использования двухбайтовой кодировки необходимо:
-подключить библиотеку tchar.h;
-при определении символов и строк использовать типы
TCHAR, LPTSTR и LPCTSTR;
8
-при определении символьных или строковых констант использовать макрос _TEXT (или _T);
Например, вместо
char *name = "SAP-211";
следует записать:
LPCTSTR name = _T("SAP-211");
Вспомогательные типы
LRESULT |
целое со знаком, значение, |
|
возвращаемое оконной функцией |
LPARAM |
параметр сообщения (long parameter) |
WPARAM |
параметр сообщения (word parameter) |
COLORREF |
целочисленный код цвета (RGB) |
Основные структуры
Структура – набор элементов данных различных типов, имеющий определённое имя. Позволяет компоновать сложные и многочисленные данные API в отдельные группы.
MSG |
хранит информацию по сообщению |
|
(координаты, клавиши, курсор) |
WNDCLASSEX |
определяет основные характеристики |
|
окна |
LOGFONT |
хранит параметры логического |
|
шрифта |
POINT |
хранит целочисленные координаты |
|
точки на плоскости |
SIZE |
хранит значения ширины и высоты |
|
битовых изображений, текста и др. |
RECT |
хранит экранные координаты |
|
прямоугольной области |
|
9 |
2. Общая структура простого приложения под Windows
Для иллюстрации работы простого приложения под Windows приведём пример простой программы для ОС DOS, реализующей похожий механизм обработки сообщений операционной системы. В качестве сообщений здесь выступают символы, заданные пользователем на консоли. В зависимости от введённого символа программа печатает на экране соответствующую информационную строку или завершает свою работу. В программе есть аналог оконной функции, выполняющей обработку сообщений и цикл непрерывного ввода сообщений и передачи их в оконную функцию.
// Цикл обработки сообщений для DOS #include <stdio.h>
#include <conio.h>
void WndProc (int );
void main()
{int msg;
//цикл получения и передачи сообщений
//оконной функции
while ( (msg=getch()) != '0' )
WndProc (msg);
}
// Аналог оконной функции для DOS void WndProc (int msg)
{
switch (msg) |
|
|
{ |
|
|
case 's': |
printf("\nSAPR"); break; |
|
case 'p': |
printf("\nPGS"); |
break; |
default : |
printf("\n?"); |
break; |
} |
|
|
}
10
