Д.А. Щеглаков
ИНТЕРФЕЙС API WIN32 НА ПРИМЕРАХ
Методическое пособие для вузов
Издательско-полиграфический центр
Воронежского государственного университета
2010
Утверждено методическим советом факультета прикладной математики,
информатики и механики 21 декабря 2009 г. протокол № 4
Рецензент канд. физ.-мат. наук, доцент кафедры математического обеспечения ЭВМ О.Д. <...> 3
− Graphics Device Interface (GDI, интерфейс графических устройств) –
функции и структуры для графического вывода на дисплеи, принтеры
и другие графические устройства. <...> При создании приложений с использованием библиотек визуальных
компонентов (например, VCL в Delphi) от программиста скрыто использование функций прикладных интерфейсов программирования. <...> Дело в том,
что соответствующие классы компонентов VCL инкапсулируют основные
функции Win32 API, что значительно ускоряет разработку Windowsприложений. <...> Дескриптор в API Win32
представляет собой длинное (32-разрядное) целое число, используемое для
обращения к сопоставленному объекту. <...> Одному адресу памяти иногда могут соответствовать несколько дескрипторов, но один дескриптор всегда соответствует только одному объекту. <...> При первом обращении к несуществующему объекту ОС создает объект и возвращает процессу его дескриптор. <...> Если на объект больше не указывает ни один дескриптор, ОС удаляет объект из памяти. <...> В отличие от объектов визуальной библиотеки классов Delphi VCL,
где загруженный объект связан с методами и свойствами своего класса, и
наоборот, методы и свойства класса неявно ссылаются на объект, для функций Win32 API такой связи не предусмотрено. <...> Дескрипторам в Delphi соответствует набор типов, многие из которых
эквивалентны друг другу. <...> Например, объявления переменных
var h1, h1: THandle;
и
var h1:HWnd; h2:HFont
эквивалентны. <...> Тем не менее, второе объявление более информативно и указывает на то, что переменная h1 содержит дескриптор оконного элемента, а
h2 – элемента Font, используемого для установки параметров шрифта. <...> Так как ОС Windows написана на языке <...>
Интерфейс_API_WIN32_на_примерах.pdf
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ
УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
«ВОРОНЕЖСКИЙ ГОСУДАРСТВЕННЫЙ
УНИВЕРСИТЕТ»
В.Г. Рудалев,
Д.А. Щеглаков
ИНТЕРФЕЙС API WIN32 НА ПРИМЕРАХ
Методическое пособие для вузов
Издательско-полиграфический центр
Воронежского государственного университета
2010
Стр.1
Содержание
ВВЕДЕНИЕ.............................................................................................................................. 3
1. ЭЛЕМЕНТЫ АРХИТЕКТУРЫ WIN32 ......................................................................... 4
1.1. Дескрипторы.................................................................................................................. 4
1.2. Сообщения и оконная функция ................................................................................... 6
1.3. Структура Windows-приложения. ............................................................................... 7
1.4. Создание элементов управления ............................................................................... 11
1.5. Функции обратного вызова (CallBack) ..................................................................... 15
1.6. Интерфейс графических устройств GDI................................................................... 17
2. ПРИМЕРЫ ПРОГРАММИРОВАНИЯ........................................................................ 20
2.1. Непрямоугольные, прозрачные, не видные в системе окна.................................... 21
2.2. Подключение мультимедийных ресурсов ................................................................ 23
2.3. Расширенная работа со шрифтами............................................................................ 27
2.4. Смена разрешения видеокарты.................................................................................. 29
2.5. Смена обоев рабочего стола....................................................................................... 30
ЛИТЕРАТУРА...................................................................................................................... 31
Введение
Windows API (Application Programming Interfaces) представляет собой
набор базовых функций, структур, сообщений, макросов и интерфейсов
программирования приложений для операционных систем семейств Windows
и Windows NT.
Все 32-разрядные Windows-платформы обладают общим набором
API, получившим название Win32 API.
Работа через Windows API — это наиболее «близкий к системе» способ
взаимодействия с ней прикладных программ.
По типу предоставляемых возможностей выделяются несколько
групп наборов Windows API. Среди них:
− Window Management (управление окнами). Средства для создания
пользовательского интерфейса и управления им.
− Window Controls (элементы управления). Предназначены для создания
общих элементов пользовательского интерфейса. Их применение
делает единообразным интерфейсы графической оболочки и остальных
приложений, а также сокращает время разработки.
− Shell Features (функции оболочки). Предназначены для доступа к системным
устройствам и ресурсам – дисководам, принтерам, файлам,
сетевым ресурсам и т.д.
3
Стр.3
1.2. Сообщения и оконная функция
Взаимодействие оконного приложения с пользователем осуществляется
посредством механизма обработки сообщений. Этот механизм определяет
реакцию приложения на то или иное действие пользователя или изменение
среды в операционной системе. В процессе работы приложение получает
большое количество сообщений от операционной системы. Их обработка
происходит в одной конкретной процедуре (а точнее функции), называемой
оконной. Такая схема функционирования во многом напоминает реакцию
на события компонентов VCL. Отличие заключается в том, что у
компонентов VCL для обработки каждого события назначается своя процедура-обработчик,
в то время как оконная процедура предназначена для обработки
всех сообщений.
Для работы с сообщениями в Delphi предусмотрены записи TMsg и
TMessage
TMSG = record
hwnd: HWND; //дескриптор окна, принимающего сообщение
message: UINT; //идентификатор сообщения
wParam: WPARAM; //параметры, содержимое которых
lParam: LPARAM; //меняется в зависимости от типа сообщения
time: DWORD; //время отправки сообщения
pt: TPoint; //позиция курсора на экране
end;
TMsg – «родная» структура для функций Windows API. В Delphi для хранения
сообщений предусмотрена структура TMessage, содержащая часть
значений из соответствующей структуры TMsg. В структуре TMessage
меньше записей, чем в TMsg. Это связано с тем, что обработку остальных
параметров сообщения Delphi берет на себя.
TMessage = record
Msg: Cardinal; //идентификатор сообщения
case Integer of
0: (
WParam: Longint;//параметры, содержимое которых
LParam: Longint;//меняется в зависимости от типа
//сообщения
Result: Longint);// результат выполнения
1: (
WParamLo: Word;// 16 – битные части соответствующих
WParamHi: Word;// параметров wParam и lParam ( младLParamLo:
Word;// шее и старшее слово)
LParamHi: Word;
ResultLo: Word;
ResultHi: Word);
End;
End;
6
Стр.6
Как следует из объявлений, значения параметров WParam и LParam зависят
от вида (типа) сообщения. Тип сообщения соответствует событию, о
котором информируется приложение (окно). Чтобы определить тип, используется
параметр message. Через этот параметр передается константаидентификатор,
по значению которой оконная функция определяет тип сообщения
(см. табл. 2).
Таблица 2
Константа
WM_ACTIVATE
WM_CHAR
WM_CLOSE
WM_KEYDOWN
WM_KEYUP
WM_MOUSEMOVE
WM_PAINT
WM_COMMAND
WM_SETFONT
WM_CLOSE
WM_DESTROY*
Значение
$0006
$0102
$0010
$0100
$0101
WM_LBUTTONDOWN $0201
$0200
$000F
$0111
$0030
$0010
$0002
Тип сообщения
Активация или деактивация окна
Клавиша клавиатуры нажата и отпущена
Закрытие окна
Нажата клавиша клавиатуры
Отпущена клавиша клавиатуры
Нажата левая клавиша мыши
Перемещение указателя мыши
Перерисовка клиентской области окна
Выбор элемента меню либо от дочеpнего оконного элемента
должно быть получено сообщение
Изменение шрифта
Закрытие окна
Уничтожение окна
В таблице приводятся лишь некоторые константы-идентификаторы
сообщений. Объявления всех таких констант находятся в модуле
messages.pas.
1.3. Структура Windows-приложения
Рассмотрим пример создания простейшего однооконного приложения
с использованием Win32 API.
В среде Delphi создадим новый проект (File→New→Application). Затем
удалим из него все модули и формы: View→Project Manager, воспользовавшись
пунктом Remove (рис. 1).
Открыв файл проекта (Project→View Source), отредактируем текст
программы.
* После передачи приложению сообщения WM_DESTROY, его оконной функцией вызывается функция
DestroyWindow, которая, в свою очередь, передает окнам приложения сообщение WM_CLOSE.
7
Стр.7
Рис. 1
program Project1;
uses
Windows,
Messages,
SysUtils;
var
hWndMain:HWND;// дескриптор окна приложения
WC:TWndClass;//структура для хранения параметров класса окна
msg:TMsg;// сообщение
Instance:HWnd;// дескриптор приложения
// оконная процедура:
Function WindowProc(Window: HWND; AMessage:Cardinal;
wParam, lParam: Longint): Longint; stdcall;
begin
case AMessage of
WM_DESTROY:
begin
PostQuitMessage( 0 );
Result := 0;
Exit;
end;
else
Result := DefWindowProc(Window ,AMessage,
wParam, lParam);
end;
end;
// Блок инициализации программы
begin
instance:=GetModuleHandle(nil);
with WC do
begin
8
Стр.8