Опубликован: 02.12.2011 | Доступ: свободный | Студентов: 980 / 117 | Оценка: 5.00 / 4.00 | Длительность: 09:26:00
Специальности: Программист
Теги: .net, open source, opengl
Лекция 4:

Структура приложений, использующих OpenGL

< Лекция 3 || Лекция 4: 1234 || Лекция 5 >

Обработка событий мыши и клавиатуры

При необходимости реализации взаимодействия с пользователем в программе могут обрабатываться события от мыши и клавиатуры.

В ниже приведенном примере клавиши "Insert" и "Delete" изменяют угол поворота вокруг оси , клавиши "Home" и "End" – вокруг оси OY, клавиши "Page Up" и "Page Down" – вокруг оси OZ.

Object Pascal (Delphi)

В приложениях на Object Pascal с использованием VCL (Delphi) для этого может использоваться обработчик события формы OnKeyDown. Для определения нажатой клавиши используются коды виртуальных клавиш операционной системы. Виртуальный код нажатой клавиши передаётся в обработчик события через параметр-переменную Key. Виртуальные коды клавиш объявлены как константы в модуле Windows.pas и начинаются с символов "VK_".

В процедуре используются глобальные переменные AngleX, AngleY, AngleZ для сохранения значения новых углов поворота изображения ( пример 3.6).

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case Key of
    VK_INSERT: inc(AngleX, AngleDl);
    VK_DELETE: dec(AngleX, AngleDl);
    VK_HOME: inc(AngleY, AngleDl);
    VK_END: dec(AngleY, AngleDl);
    VK_PRIOR: inc(AngleZ, AngleDl);
    VK_NEXT: dec(AngleZ, AngleDl);
  end;
  InvalidateRect(Handle, nil, False);
end;
Листинг 3.6. Пример обработки нажатия клавиш для поворота изображения вокруг осей координат на Object Pascal (Delphi)

В конце процедуры выполняется системная процедура InvalidateRect, которая информирует операционную систему о необходимости обновления изображения формы. Это приводит к возникновению события формы OnPaint, в обработчике которого формируется изображение, но уже с новыми значениями углов поворота изображения вокруг осей координат.

Библиотека OpenTK

В приложениях с использованием библиотеки OpenTK на С# (WinForms) для этого можно использовать обработчик события KeyDown компонента GLControl. Виртуальный код клавиши передается в обработчик события в качестве свойства KeyCode параметра события, который имеет тип KeyEventArgs. Ниже приведен пример 3.7 обработчика события KeyDown.

private void glControl1_KeyDown(object sender, KeyEventArgs e)
{
switch(e.KeyCode)
{
case Keys.Insert: AngleX += AngleDl; break;
case Keys.Delete: AngleX -= AngleDl; break;
case Keys.Home: AngleY += AngleDl; break;
case Keys.End: AngleY -= AngleDl; break;
case Keys.Prior: AngleZ += AngleDl; break;
case Keys.Next: AngleZ -= AngleDl; break;
}
glControl1.Invalidate(); 
}
Листинг 3.7. Пример обработки нажатия клавиш для поворота изображения вокруг осей координат в программе на C# с использованием библиотеки OpenTK

Для обновления изображения в конце события вызывается метод Invalidate компонента GLControl. В результате будет выполнен делегат события Paint и обновлено содержание компонента GLControl.

Завершение работы c библиотекой OpenGL

Для корректного завершения работы с библиотекой OpenGL необходимо выполнить освобождение ресурсов, выделенных при инициализации работы библиотеки. Обычно это выполняется при завершении приложения.

Object Pascal (Delphi)

В приложениях Object Pascal для завершения работы с OpenGL необходимо выполнить следующую последовательность действий:

  1. Освободить текущий контекст воспроизведения с помощью функции wglMakeCurrent. Для этого ей в качестве параметров передаются нулевые значения.
  2. Удалить контекст воспроизведения, дескриптор которого был сохранен в глобальной переменной hrc. Удаление контекста воспроизведения выполняется с помощью функции wglDeleteContext.
  3. Удалить контекст устройства операционной системы с помощью функции ReleaseDC. В качестве параметров функции передаются дескриптор окна приложения (свойство формы Handle) и дескриптор устройства (переменная hr). Глобальная переменная hr была инициализирована при запуске программы на этапе инициализации библиотеки OpenGL.

Эти действия можно выполнить в обработчике события закрытия формы OnDestroy.

Фрагмент кода, выполняющий эти действия приведен ниже ( пример 3.8).

procedure TForm1.FormDestroy(Sender: TObject);
begin
  if not wglMakeCurrent(0, 0) then
    raise Exception.Create(
      'Невозможно освободить текущий контекст воспроизведения !');
  if not wglDeleteContext(hrc) then
    raise Exception.Create('Ошибка удаления контекста воспроизведения !');
  if ReleaseDC(Form1.Handle, dc)=0 then
    raise Exception.Create('Ошибка удаления контекста устройства');
end;
Листинг 3.8. Пример завершения работы с библиотекой OpenGL на Object Pascal (Delphi)

Библиотека OpenTK (С#)

При использовании библиотеки OpenTK завершение работы с библиотекой OpenGL выполняет сама библиотека OpenTK. При этом она выполняет операции, аналогичные приведённым в листинге 3.8 для приложения на Object Pascal (Delphi).

Может показаться, что приложенные усилия по разработке приложения на Object Pascal (Delphi) не соответствуют полученному результату, но это совсем не так. Созданная программа может использоваться в качестве каркаса для создания более сложных вариантов программ.

Краткие итоги

В лекции рассмотрена структура приложений, использующих библиотеку OpenGL для формирования изображений, на языке программирования C# с использованием библиотеки OpenTK и на языке программирования Object Pascal. Рассмотрено назначение вторичного буфера и теста глубины. В созданных приложениях реализована обработка клавиатуры для изменения изображения.

Библиотека OpenTK скрывает практически весь процесс инициализации библиотеки OpenGL.

В Object Pascal весь процесс инициализации OpenGL необходимо реализовать непосредственно в программе, при этом есть возможность полного контроля данного процесса.

< Лекция 3 || Лекция 4: 1234 || Лекция 5 >
Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!

Лариса Парфенова
Лариса Парфенова

1) Можно ли экстерном получить второе высшее образование "Программная инженерия" ?

2) Трудоустраиваете ли Вы выпускников?

3) Можно ли с Вашим дипломом поступить в аспирантуру?