Поcобие_БЕЛОВ_Графический_интерфейс_API
.pdfМИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
Брянский государственный технический университет
Е.А. Белов
ПРОГРАММИРОВАНИЕ ПРИЛОЖЕНИЙ WINDOWS. API ГРАФИЧЕСКОГО ИНТЕРФЕЙСА ПОЛЬЗОВАТЕЛЯ
Утверждено редакционно-издательским советом университета в качестве учебного пособия
Брянск 2010
2
ББК 65.29
Белов, Е.А. Программирование приложений Windows. API графического интерфейса пользователя [Текст]+[Электронный ресурс]: учеб. пособие / Е.А. Белов. – Брянск: БГТУ, 2010. – 350 с. –
Режим доступа: http://www.elibrary.ru.
ISВN 5-89838-495-1
Изложены методические основы специальных средств программирования графического интерфейса пользователя операционной системы Windows, в тоом числе динамического программирования и управления базовыми элементами программных систем: окнами, элементами управления, меню и диалоговыми панелями. Рассмотрены методы создания высокоэффективных компактных быстродействующих приложений. Включены примеры программ.
Учебное пособие предназначено для студентов очной и заочной форм обучения специальностей 230105 «Программное обеспечение вычислительной техники и автоматизированных систем», 010503 «Математическое обеспечение и администрирование информационных сетей», а также может быть использовано студентами других специальностей, занимающимися разработкой приложений для Windows.
Ил. 3. Табл. 69. Библиогр. 20 назв.
Научный редактор С.М. Брундасов
Рецензенты: кафедра «Маркетинг» Брянского государственного университета; П.Н. Протасов
ISВN 5-89838-495-1 |
© Брянский государственный |
|
технический университет, 2010 |
3
ПРЕДИСЛОВИЕ
Наиболее значимым моментом при программировании для операционной системы (ОС) Windows является интерфейс прикладного программирования Application Programming Interface (API).Это набор самых различных функций, с помощью которых приложение может взаимодействовать с Windows. Windows API в основном состоит из трех компонентов: Kernel (ядро), User (пользовательский интерфейс) и GDI (графическая подсистема), которые обеспечивают интерфейс с базовой ОС, управление окнами и приложениями и предоставляет поддержку графики. Интерфейс пользователя представляет собой систему различных элементов. Элементами являются окна, кнопки, меню, диалоговые панели и другие объекты Windows. Каждый элемент задают множествами параметров состояния, входных и выходных сообщений. Для элементов одного класса описывают единый метод изменения параметров состояния и обработки входных и выходных сообщений. Основной задачей проектирования интерфейса пользователя является разработка целостной системы управления множеством состояний программного продукта. Именно вопросам проектирования и разработки пользовтальского интерфейса посвящено учебное пособие.
Излагаемый в учебном пособии материал предполагает знакомство студентов с языком программирования C++, изучаемым на более ранних курсах высшей школы. Материал учебного пособия является основой для изучения дисциплин, связанных с программированием компьютерной графики для ОС Windows, выскоуровневых средств разработки MFC, Windows Forms и т.д.
Учебное пособие состоит из шести глав. В каждой главе излагается теоретический и практический материал, приводятся упражнения и вопросы для контроля полученных знаний.
Вглаве 1 рассматривается поняте окна с точки зрения языка программирования, способы описания классов и функций окон, главной функции приложения, функции для создания окон, функции перемещения и изменения расположения окон, а также механизм получения и обработки сообщений.
Вглаве 2 рассматриваются определенные в системе Windows классы окон, а также элементы управления: статический текст,
кнопки, списки, редактор текста, полосы прокрутки и
4
комбинированные списки; описываются способы создания элементов управления, механизмы работы с ними, функции обмена и обработки сообщений между окнами и элементами управления.
Вглаве 3 содержатся сведения о графических примитивах системы рисования, рассматривается понятие контекста отображения, его атрибуты, функции отображения текста и графических примитивов, примеры вывода таблиц и графиков.
Вглаве 4 рассматривается главное меню окна и его разделы, временные и плавающее меню, а также функции динамического создания, изменения меню и управления состоянием элементов меню. Здесь же описываются способы создания акселераторов и работы с ними.
Глава 5 посвящена панелям инструментов и строкам состояния. В ней рассматриваются способы создания и использования панели инструментов и строки состояния, обработки уведомительных сообщений. Примеры и упражнения, приведенные в этой главе, связаны с примерами и упражнениями из предыдущих глав.
В глава 6 рассматриваются способы динамического создания диалоговых панелей. Показаны модальные и немодальные панели, а также блокноты диалоговых панелей. Представлены примеры обмена данными и обработки сообщений в диалоговых панелях и их блокнотах, а также примеры создания стандартных диалоговых панелей операционной системы.
Излагаемый материал построен на основе курса лекций по дисциплине «Программирование приложений Windows», которые автор читает в Брянском государственном техническом университете.
5
ГЛАВА 1. СОЗДАНИЕ ОКОН
Окна являются основой графического интерфеса пользователя операционной системы Windows.
Для разработчика окно является совокупностью большого числа элементов, функционирующих под управлением приложения и операционной системы.
С точки зрения языка программирования, окна – это объекты (переменные), над которыми выполняют действия. Объект принадлежит к определенному классу (типу), который описывает множество данных (параметров состояния окна) и метод (функцию) изменения этих данных.
1.1. Виды окон
Программы для операционной системы Windows называют приложениями. Пользователь взаимодействует с приложением через окна следующих видов:
1.Окно приложения. Оно элементизует работу, появляется первым при запуске и закрывается вместе с прекращением работы приложения.
2.MDI-окна. Они служат для одновременной обработки нескольких документов.
3.Окно помощи. Оно в большей степени работает под управлением операционной системы, чем под управлением приложения.
4.Диалоговое окно. Оно обеспечивает оперативный обмен данными между пользователем и приложением (рис. 1).
Главное окно на рис. 1 имеет обрамляющие двойные рамки, заголовок, различные кнопки, полосу меню, панель инструментов с кнопками, полосы просмотра, строку состояния и др. Эти элементы также являются окнами, имеют свои данные и метод их изменения, т.е. принадлежат к классам окон.
1.2. Класс окон
Для создания окна операционной системе указывают, к какому классу оно принадлежит. Если к моменту создания окна операционной системе известен класс создаваемого окна (например, это определенный в системе или зарегистрированный текущим или
6
другим приложением класс), то можно воспользоваться именем этого класса. Иначе необходимо создать новый класс (описать функцию окна и набор используемых ресурсов) и зарегистрировать его.
Рис. 1. Окно со множеством элементов:
1 – кнопка системного меню; 2 – кнопка сворачивания окна в пиктограмму; 3 – кнопка максимилизации или восстановления размеров окна; 4 – кнопка закрытия окна; 5 – рамки изменения размеров окна
1.2.1. Описание используемых классом окон ресурсов
Набор используемых ресурсов класса задается в структуре типа WNDCLASS. Эта структура описана следующим образом:
typedef struct { UINT style;
WNDPROC lpfnWndProc; int cbClsExtra;
int cbWndExtra; HANDLE hInstance;
|
7 |
HICON |
hIcon; |
HCURSOR |
hCursor; |
HBRUSH |
hbrBackground; |
LPCTSTR |
lpszMenuName; |
LPCTSTR |
lpszClassName; } |
WNDCLASS; |
|
Назначение полей структуры WNDCLASS:
1)style – стиль окон, принимает значения из прил. 1, табл. 1.1.
Например: wcstyle = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
2)lpfnWndProc – указатель на функцию окна;
3)cbClsExtra – число дополнительных байт класса;
4)cbWndExtra – число дополнительных байт окна этого класса;
5)hInstance – дескриптор текущего приложения;
6)hIcon – дескриптор пиктограммы (иконки), в которую превращается окно при минимизации. Ресурс иконки загружается функциейLoadIcon: ICON LoadIcon( HINSTANCE hInst, LPCTSTR lpIconName);
7)hCursor – дескриптор курсора мыши при его прохождении над окном.Ресурс курсора загружается функцией LoadCursor: HCURSOR LoadCursor( HINSTANCE hInst, LPCTSTR lpCursorName);
8)hbrBackground – дескриптор кисти закрашивания фона окна.В качестве кисти можно использовать цвета или пиктограмму. Чаще используют значение системного цвета (прил. 1, табл. 1.4.) плюс 1. Цвета преобразуют в тип HBRUSH. Например, следующий оператор устанавливает системный цвет закрашивания фона: wc. hbrBackground = (HBRUSH)( COLOR_WINDOW+1);
9)lpszMenuName – имя ресурса главного меню окон этого класса. Если задать NULL, окна этого класса не имеют заданного по умолчанию меню.
10)lpszClassName – текстовая строка, содержащая имя регистрируемого класса окон, например: wc.lpszClassName = szName;
1.2.2. Пример регистрации класса окон
Для регистрации класса окон удобно использовать функцию следующего вида:
int RegClass( WNDPROC Proc, LPCTSTR szName) {
8
WNDCLASS wc;
Wc.style = CS.HREDRAW | CS.VREDRAW; wc.cbClsExtra = wccbWndExtra = 0; wc.lpfnWndProc = Proc; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wc.lpszMenuName = (LPCTSTR)NULL; wc.lpszClassName = szName;
return RegisterClass(&wc); }
Формальными параметрами этой функции являются указатели на функцию окна и строку с именем класса. Имя, список формальных параметров и тип возврата функции могут быть другими. Главное, чтобы приложению после регистрации были доступны имя зарегистрированного класса, а операционной системе – функция окна этого класса. Поясним некоторые операторы этой функции.
Функция RegisterClass регистрирует класс в операционной системе. Ее аргументом является адрес подготовленной структуры wc. При успешной регистрации класса она возвращает ненулевое значение, иначе – нуль.
1.2.3. Функция окна
Функция окна описывает реакцию окна на поступающие сообщения. От обычных функций отличается следующим:
•имеет стандартные тип возврата и список формальных параметров;
•вызывается только операционной системой при поступлении сообщения окну;
•сообщения, которые не обрабатываются функцией окна, возвращаются операционной системе.
Есть еще одно отличие. В объектно-ориентированном программировании методы изменения параметров состояния объекта (функции-члены) обычно описывают отдельно. Функция окна реализует единственный метод для изменения всех параметров состояния окна.
Имя функции окна – это обычное имя, определяемое разработчиком. При регистрации класса операционная система запоминает указатель на эту функцию.
9
Рассмотрим пример описания функции окна.
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
static short ex, cy, left, top; //Описание локальных переменных switch (msg) //Обработка сообщения
{ case WM_CREATE: { ...; return 0;} case WM_MOVE:{
left=LOWORD(lParam);
top=HIWORD(lParam); return 0;
}
case WM_SIZE:{
cx= LOWORD(lParam); cy= HIWORD(lParam);
return 0;
}
case WM_COMMAND: //Обрабатываем команды{ switch ( LOWORD(wParam))
{ case CM_FILE_EXIT:
{DestroyWindow(hwnd); return 0; }
//Далее могут быть ветви других команд
} return 0;
}
caseWM_DESTROY:
{...; PostQuitMessage(0); return 0;}
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
Заголовок функции окна определен соглашениями Windows и
имеет вид LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
Тип возврата LRESULT равноценен типу signed long. Модификатор CALLBACK указывает на соглашение о том, что эта функция вызывается операционной системой (такие функции называют функциями обратного вызова).
Имена типов UINT, WPARAM, LPARAM описаны следующим образом:typedef unsigned int UINT; typedef UINT WPARAM; typedef LONG LPARAM;
10
Параметр hwnd – дескриптор окна-адресата, a параметры msg, wParam и lParam описывают полученное сообщение. Так, параметр msg принимает код рообщения.
Рассмотрим, каким сообщениям соответствуют используемые в примере имена констант. В Windows описаны несколько сот кодов сообщений с префиксом WM_.
Код WM_CREATE поступает от функции CreateWindow перед созданием окна. Если после обработки этого сообщения функции CreateWindow возвращается значение – 1, то окно не создается.
Код WM_SIZE функция окна получает после изменения размеров окна, a код WM_MOVE – после перемещения левого верхнего угла рабочей области окна. Если при изменении размеров окна изменились координаты левого верхнего угла рабочей области, то функция окна сначала получает код WM_MOVE, а затем – код WM_SIZE. После изменения режима отображения окна функция окна получает код WM_SIZE, а затем – WM_MOVE.
Код WM_COMMAND функция окна получает при поступлении команды. Тогда младшее слово параметра wParam содержит код команды. Разработчик свои сообщения часто связывает с командами меню и описывает идентификаторы для этих команд. Так, для идентификатора CM_FILE_EXIT команды меню текст приложения должен содержать макроопределение вида
#define CM_FILE_EXIT 3001
Код WM_DESTROY функции окна посылают перед разрушением окна. В примере функция окна, вызывая функцию DestroyWindow, сама себе отправляет сообщение WM_DESTROY.
Рассмотрим сообщения от мыши. Пусть курсор мыши находится над рабочей областью окна. После нажатия левой клавиши мыши функция окна получит код WM_LBUTTONDOWN а правой клавиши – код WM_RBUTTON DOWN. После отжатия левой (правой) клавиши функция окна получит код WM_LBUTTONUP (WM_RBUTTONUP). После перемещении курсора мыши функция окна получает код WM_MOUSEMOVE.
Можно получать сообщения от мыши, даже если курсор мыши не находится над рабочей областью окна. Для передачи мыши в монопольное использование окну hwnd вызывают функцию: HWND SetCapture(HWND hwnd);
Эта функция возвращает дескриптор окна, у которого в