Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ПП_Лаб1

.pdf
Скачиваний:
16
Добавлен:
11.02.2015
Размер:
528.52 Кб
Скачать

Лабораторная работа №1 «Разработка простейшего графического приложения,

реагирующего на действия пользователя»

Создание проекта

Откройте Microsoft Visual Studio 2005 и создайте новый проект при помощи команды File->New->Project…

Воткрывшемся окне выберите тип проекта – Visual C++, шаблон проекта

Win32 Project, имя проекта – LabWork1.

Выберите пункт Application Settings и установите тип приложения – Windows Application и опцию проекта Empty Project для создания пустого проекта.

В дереве проекта (Solution Explorer) добавьте исходный файл. Для этого воспользуйтесь командой New Item -> Add… контекстного меню.

Создание простейшего приложения

Любое приложение должно иметь точку входа. Для консольных приложений такой точкой входа является функция main(). Для приложений Windows точкой входа является функция WinMain. Эта функция имеет следующий прототип:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

Параметры:

hInstance – идентификатор текущей запущенной копии приложения, присваивается системой.

hPrevInstance – оставлен для совместимости с предыдущими версиями, всегда имеет значение NULL.

lpCmdLine – строка, переданная в качестве параметров командной строки при запуске приложения.

nCmdShow – константа, показывающая как должно быть запущено приложение – со свернутым окном, с раскрытым окном или как-то иначе. Значения можно посмотреть в MSDN.

Возвращаемое значение:

Функция должна возвращать параметр, переданный в сообщении WM_QUIT. В случае, если приложение завершается до запуска цикла обработки сообщений, возвращаемое значение должно быть 0.

Описание основных функций Windows API находится в стандартном заголовочном файле windows.h.

Простейшая программа для Windows может выглядеть следующим образом:

Добавим в нашу программу реализацию оконного интерфейса. Первым шагом будет создание класса окна приложения. Реализуем функцию, которая создаст и зарегистрирует класс:

Как видно из кода функции в ней используется параметр hInstance, который должен передаваться из функции WinMain. Для простоты реализации передачи определите некоторые параметры глобально в начале программы:

Не забудьте добавить их заполнение при запуске WinMain:

Параметр lpfnWndProc задает указатель на функцию, которая будет обрабатывать оконные сообщения. Эта функция имеет прототип:

Первым параметром передается идентификатор окна, где сгенерировано сообщение, вторым – тип сообщения, третий и четвертый параметры – параметры сообщения.

Не забудьте добавить объявление прототипа функции до его первого использования.

Добавим функцию, отвечающую за создание окна:

Данная функция создает стандартное окно шириной и высотой по 400 пикселей, показывает его в необходимом режиме (ShowWindow) и отправляет ему команду на перерисовку (UpdateWindow).

Следующим шагом необходимо реализовать цикл обработки сообщений:

Функция GetMessage останавливает работу программы до прихода нового сообщения от пользователя или системы. Это позволяет освободить процессор для решения других задач, если в нашей программе не происходит активности. Данная функция не подходит для программ, где, например, содержимое экрана должно меняться динамически вне зависимости от вмешательства пользователя (например, игры и т.д.). Как справиться с этим ограничением, будет рассмотрено позднее.

Функция возвращает TRUE во всех случаях, кроме одного. При получении сообщения WM_QUIT, завершающего работу программы, возвращается FALSE, что позволяет покинуть цикл обработки сообщений.

Функция DispatchMessage передает полученное сообщение функции обработки сообщений, определенную в классе окна, которую также необходимо реализовать:

Функция анализирует тип сообщения (msg) и реагирует на него соответствующим образом. В данный момент добавлена обработка только сообщения WM_DESTROY, которое присылается при попытке закрыть окно приложения. В ответ на это при помощи вызова PostQuitMessage в очередь ставится сообщение WM_QUIT, которое закончит цикл обработки сообщений.

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

Далее остается только дополнить WinMain вызовами созданных функций:

После компиляции и запуска программы можно увидеть главное окно:

Добавление отрисовки графики

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

Отрисуйте на экране круг. Для этого воспользуйтесь функцией Ellipse, которая имеет следующий прототип:

BOOL Ellipse(

HDC hdc, // идентификатор контекста рисования

int nLeftRect, // координата x левого верхнего угла описывающего прям-ка int nTopRect, // координата y левого верхнего угла описывающего прям-ка int nRightRect, // координата x правого нижнего угла описывающего прям-ка int nBottomRect // координата y правого нижнего угла описывающего прям-ка

);

Идентификатор контекста рисования используется для поддержки рисования на разных устройствах (экран, принтер и т.д.) и получается у операционной системы.

Для отрисовки необходимо добавить обработку сообщений WM_PAINT:

Функция BeginPaint берет контекст рисования у системы, а EndPaint – возвращает.

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

Результат работы программы станет следующим:

Для изменения цвета фигуры нужно будет запросить у операционной системы специальные кисти (Brush). Для того, чтобы определить правильный порядок создания и возвращения кистей, а также отделить функциональность работы с шаром от каркаса приложения, реализуем шар в виде класса CBall. Определение класса разместим в файле CBall.h, а его реализацию в классе

CBall.cpp.

Определение класса:

Подключение заголовочного файла windowsx.h необходимо для подключения некоторых вспомогательных библиотек для работы с графикой.

hBrush – рабочая кисть для отрисовки шарика.

Реализация класса:

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

Восновной программе добавим шарик в описание глобальных переменных:

И изменим обработчик WM_PAINT следующим образом:

Результат выполнения программы будет выглядеть следующим образом:

Добавление динамики

Для добавления движения необходимо провести ряд существенных доработок.

Прежде всего необходимо заложить нужную функциональность в класс CBall. Для начала сделам так, чтобы шарик мог двигаться.

Добавим в описание класса внутренние поля, отвечающие за текущее положение шарика: x и y. Также необходимо задать скорость движения шарика. Скорость можно задать двумерным вектором, но, в нашем случае, можно упростить задачу, задав скорость отдельно по координатам: vx и vy. Задавать скорость будем в пикселах в секунду. Добавим еще радиус шарика в виде параметра r.

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