Опубликован: 13.07.2010 | Уровень: специалист | Доступ: платный
Самостоятельная работа 10:

Введение в DirectX

Создание устройства

Теперь у нас достаточно информации для создания устройства в нашем проекте.

  • В конец класса формы включите объявление ссылки на экземпляр класса Device
namespace SimpleMedia
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    
        private Device device = null;
    }
}
Листинг 10.2. Создание ссылочной переменной в классе Form1
  • Добавьте новую функцию-член в конец класса Form1 с именем InitializeGraphics(), которую наполните следующим кодом
public void InitializeGraphics()
{
  // Создание объекта и настройка параметров представления
  // Создать объект параметров представления
  PresentParameters presentParams = new PresentParameters();
  // Установить оконный режим
  presentParams.Windowed = true;
  // Сбрасывать содержимое буфера, если он не готов к представлению
  presentParams.SwapEffect = SwapEffect.Discard;
  // Создать объект устройства и сохранить ссылку на него
  device = new Device(0, DeviceType.Hardware, this,
    CreateFlags.SoftwareVertexProcessing, presentParams);
}
Листинг 10.3. Функция InitializeGraphics() класса Form1

Нулевое значение параметра adapter подразумевает установку устройства по умолчанию. В результате мы создали фактическое аппаратное устройство, в противоположность устройству, эмулированному программными средствами. В коде использовано ключевое слово this, подразумевающее, что окном представления ( рендеринга ) будет текущее окно формы. Мы возложили вершинную обработку на наш центральный процессор.

  • Откройте созданный мастером файл Program.cs и перепишите функцию Main() ) так
static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
    
            using (Form1 frm = new Form1())
            {
                // Показать форму перед созданием движка
                frm.Show();
                // Создать и инициализировать графический движок
                // нашей функцией
                frm.InitializeGraphics();
                // Войти в цикл сообщений
                Application.Run(frm);
            }
        }
Листинг 10.4. Измененный код функции Main()

Здесь сначала мы добавили директиву using для создания формы. Это гарантирует вызов сборщика мусора при завершении приложения. Команда Show() визуализирует форму прежде, чем мы попытаемся создать наше графическое устройство.

  • Постройте проект и убедитесь в отсутствии синтаксических ошибок. Результатом вывода пока будет обычное окно формы пустого проекта, будто-бы мы ничего не сделали. Дальше наша задача - что нибудь отобразить на экране средствами DirectX.

Замещение метода OnPaint() формы

Форма наследует от класса System.Windows.Forms.Control метод OnPaint(), который можно переопределять в форме. Этот метод диспетчеризует событие Paint, генерируемое операционной системой в тот момент, когда нужно перерисовывать окно формы. Добавим этот метод в наш код рендеринга (отображения). Нет смысла делать сейчас какие-то сложные вещи, просто очистим окно и заполним его однородным цветом.

  • В конце класса Form1 начните набирать ключевое слово override и в подсказчике кода выберите метод OnPaint(), который заполните следующим кодом
protected override void OnPaint(PaintEventArgs e)
        {
            // Очистить цветом клиентскую область формы
            device.Clear(ClearFlags.Target,
                System.Drawing.Color.CornflowerBlue,
                1.0F, 0);
    
            // Перерисовать
            device.Present();
    
            // Вызвать обработчики, подписавшиеся на событие Paint
            // base.OnPaint(e);
        }
Листинг 10.5. Замещение метода OnPaint()

Первый параметр метода Clear() определяет, что именно мы хотим очистить. В данном примере это будет текущее окно формы. Вторым параметром является цвет, используемый при очистке нашего окна. После того, как устройство очищено, нужно обновить состояние дисплея. Данную процедуру выполняет метод представления Present(). Существует несколько перегружаемых вариантов этого метода, наш вариант очищает всю область окна.

  • Постройте приложение и убедитесь, что окно заливается васильковым цветом


Но пока что мы не использовали мощные возможности DirectX. То же самое можно было сделать, установив цвет фона формы через ее свойство BackColor в конструкторе программы. Теперь пришла пора что-нибудь нарисовать.

Иван Циферблат
Иван Циферблат
Россия, Таганрог, 36, 2000