Файл: Практическое задание Тема 4. Разработка простейших Win32 API программ.pdf
Добавлен: 20.10.2018
Просмотров: 959
Скачиваний: 8
Тема 4. Разработка простейших Win32 API программ
Для выполнения всех практических заданий данной темы необходимо
использовать какой-либо компилятор, “умеющий” создавать 32−х разрядный
код для систем Windows. Можно использовать компиляторы, встроенные в
системы быстрой разработки Windows-приложений Borland Delphi, C++
Builder, MS Visual C++ и др.
Важно понимать, что объектно-ориентированные средства быстрого
создания приложений, составляющие суть этих пакетов, при разработке
“чистых” WinAPI программ использовать не надо. Все дальнейшие
примеры в пособии ориентированы на использование Pascal-компилятора
пакета Delphi, а примеры использования языка С можно найти в достаточно
многочисленной литературе.
Порядок выполнения заданий в системе Delphi:
запустить систему Delphi и (при необходимости) создать новый проект
(меню File/New Application);
удалить из проекта модуль Unit1 и связанную с ним форму Form1
(меню Project / Remove from Project, выбрать Unit1 и удалить его);
показать стандартный код Delphi-проекта (меню Project / View Source);
отредактировать текст проекта в соответствии с приведенной выше
базовой структурой API-приложения;
сохранить текст в файле с именем Project1.dpr, создав для этого новую
отдельную папку;
провести компиляцию проекта и выполнить его (кнопка RUN на
панели инструментов);
закрыть приложение, вернуться в среду разработки и последовательно
внести в текст приложения все изменения в соответствии с
приводимыми ниже заданиями.
Набор заданий 1. Основы создания Windows-приложений
Задание 1.1. Реализовать простейшую Windows/API-программу, которая
создает пустое главное окно со стандартным поведением.
Выполнить программу несколько раз для различных типов
курсоров, пиктограмм, заголовков, фонов заполнения окна.
Задание 1.2. Добавить в простейшую программу вывод двух дочерних и двух
всплывающих окон. Исследовать различия в поведении этих окон
при их перемещении по экрану и при сворачивании окон.
Задание 1.3. Добавить в простейшую программу вывод в главном окне
одного дочернего окна, в котором, в свою очередь, выводятся два
своих дочерних окна. Исследовать различия в поведении этих
окон при перемещении и сворачивании.
Задание 1.4. Добавить в простейшую программу возможность отработки
оконного сообщения wm_Create, которое генерируется при
создании оконной структуры вызовом CreateWindow, но ДО
прорисовки окна на экране. Обработчик этого события в оконной
функции должен лишь вывести вспомогательное информационное
окно с кратким текстом (например: “Окно создано, но не
показано”).
Для
вывода
информационных
окон
можно
использовать API-функцию MessageBox (0, текст сообщения, текст
в заголовке окна, константа типа). Здесь константа типа
определяет набор стандартных кнопок в информационном окне. В
самом простом случае достаточно использовать константу
mb_OK, которая в информационном окне выводит только одну
кнопку OK. Поскольку сообщение wm_Create возникает при
каждом вызове функции CreateWindow, в том числе и при
создании подчиненных окон, можно оставить в приложении
только одно главное окно.
Задание 1.5. Добавить в простейшую программу следующую возможность:
при закрытии главного окна должно выводиться информационное
сообщение с подтверждением пользователем факта завершения
приложения. Для этого необходимо:
добавить в оконную функцию обработку сообщения wm_Close,
которое генерируется системой при закрытии главного окна;
вывести информационное сообщение с помощью вызова MessageBox с
использованием константы mb_OKCancel, которая позволяет
создать в окне 2 кнопки OK и Cancel;
для проверки того, какую из двух кнопок в информационном окне
выбрал пользователь, можно проверить результат, возвращаемый
вызовом MessageBox:
o
если выбрана кнопка OK, то результат задается константой
idOK;
o
если выбрана кнопка Cancel, то результат задается константой
idCancel. Проверка выполняется условной инструкцией if – then.
Если пользователь подтверждает закрытие окна, то вызывается
API-функция DestroyWindow(дескриптор_окна) для
освобождения информационной оконной структуры и
завершения цикла обработки сообщений.
Задание 1.6. Изучить по встроенной системе помощи возможности вызова
MessageBox с другими наборами кнопок и возвращаемых значений.
Самый быстрый вызов встроенной помощи: в тексте программы
разместить курсор ввода в нужном слове (имя API-функции,
системная константа, сообщение, системный тип данных) и нажать
клавишу F1.
Задание 1.7. Ввести в оконную функцию обработку нажатий левой и правой
кнопок мыши (сообщения wm_LButtonDown и wm_RButtonDown)
с выводом в информационном окне сообщения о нажатой кнопке.
Набор заданий 2. Создание и использование меню
Для получения навыков работы с меню последовательно выполнить
следующие задания.
Задание 2.1. Программное создание меню. Внести в исходный текст
программы следующие изменения:
1. Убрать имя меню в поле описания оконного класса.
2. Сразу после создания главного окна приложения добавить код для
программного создания двухуровневого меню (2-3 команды верхнего
уровня и 1-2 выпадающих подменю), НЕ забыв объявить необходимое
количество переменных-дескрипторов для всех подменю и основного
меню.
3. После кода отображения главного окна на экране добавить код для
показа меню.
4. Проверить работу созданного приложения.
Задание 2.2. Динамическое подключение к приложению различных меню
(например – разноязыковых). В текст предыдущей программы внести
следующие изменения:
1. Добавить код для программного создания второго меню со своими
дескрипторами, идентификаторами и текстами элементов.
2. При создании главного окна подключить к нему и отобразить только
ОДНО (любое) из созданных меню, убрав для второго меню вызовы
функций SetMenu и DrawMenuBar.
3. Для динамического изменения меню добавить в меню две команды и
создать для них обработчики в оконной функции, которые должны
выполнять два действия:
подключение к главному окну необходимого меню по SetMenu;
отображение полосы меню по DrawMenuBar.
4. Проверить работу созданного приложения
Задание 2.3. Ввести в программу возможность динамического изменения
меню: добавление новых элементов, удаление элементов, изменение
текста элементов, изменение активности элементов. Для управления
элементами меню создать два подменю: одно будет использоваться для
отслеживания производимых изменений, второе – для реализации самих
изменений.
Набор заданий 3. Вывод графической информации
Задание 3.1. Простейший вывод графических примитивов. Для этого
необходимо:
создать обработчик события wm_Paint c запросом контекста
устройства по BeginPaint;
вывести с помощью стандартных инструментов несколько
примитивов:
o
отрезок от текущей точки до заданной: LineTo(контекст,
x_конечное, y_конечное); для изменения текущей точки
можно использовать вызов MoveToEx(контекст, x, y, nil)
o
эллипс Ellipse(контекст, x_left, y_top, x_right, y_bottom)
o
прямоугольник Rectangle( контекст, x_left, y_top, x_right,
y_bottom);
изменить установленное по умолчанию перо на белое с помощью
вызова SelectObject (контекст, GetStockObject (WHITE_PEN)), а
кисть – на черную вызовом SelectObject (контекст, GetStockObject
(BLACK_BRUSH)) и повторить вывод нескольких разных
примитивов;
установить прозрачное заполнение внутренних частей примитивов,
установив в контексте пустую (нулевую) кисть:
SelectObject (DC, GetStockObject(NULL_BRUSH));
вывести несколько примитивов c прозрачным фоном.
Задание 3.2. Вывод примитивов с помощью цветных перьев. Основные шаги:
объявление необходимого числа переменных-дескрипторов перьев (тип
HPen), причем одна из переменных необходима для сохранения
стандартного пера;