Вход/Регистрация
Графика для Windows средствами DirectDraw
вернуться

Трухильо Стэн

Шрифт:

Функция DrawScene отвечает за графический вывод и переключение страниц. Поскольку нашей программе незачем постоянно обновлять экран, функция DrawScene делает это лишь в ответ на пользовательский ввод. Этим она отличается от других программ, в которых экран обновлялся непрерывно. Функция RestoreSurfaces восстанавливает поверхности в случае их потери.

Функция ShowDialog выводит диалоговое окно для выбора BMP-файла. Функция LoadBmp по имени, полученному из диалогового окна, загружает BMP-файл на поверхность и инициализирует переменные x, y, xscroll, yscroll, xlimit и ylimit. Эти переменные предназначены для позиционирования поверхности в случае, если размер поверхности BMP-файла превышает размеры первичной поверхности.

Затем мы объявляем восемь функций, вызываемых при нажатии конкретных клавиш:

• PageUp

• PageDown

• Home

• End

• Left

• Right

• Up

• Down

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

Инициализация приложения 

Перед тем как инициализировать DirectDraw, класс DirectDrawWin вызывает функцию SelectDriver, чтобы производные классы могли выбрать драйвер DirectDraw при наличии нескольких вариантов. В программе BmpView мы отказываемся от этой возможности и позволяем выбрать первичный драйвер по умолчанию. Это сделано потому, что для вывода диалоговых окон используется механизм GDI, а GDI может выводить только на первичное видеоустройство (которому соответствует первичный драйвер DirectDraw).

Следующим этапом инициализации приложения является вызов функции SelectInitialDisplayMode, которую мы обязаны переопределить. Наша версия SelectInitialDisplayMode выбирает видеорежим с параметрами 640x480x16. Исходный видеорежим не так уж важен, потому что он, скорее всего, будет переопределен пользователем при выборе BMP-файла. Однако функция SelectInitialDisplayMode (см. листинг 5.6) выполняет две дополнительные задачи.

Листинг 5.6. Функция BmpViewWin::SelectInitialDisplayMode

int BmpViewWin::SelectInitialDisplayMode {

 DisplayModeDescription desc;

 int i, nummodes=GetNumDisplayModes;

 DWORD w,h,d;

 for (i=0;i<nummodes;i++) {

GetDisplayModeDimensions(i, w, h, d);

desc.w=w;

desc.h=h;

desc.d=d;

desc.desc.Format("%dx%dx%d", w, h, d );

if (d==8) palettemode.Add(desc);

else nonpalettemode.Add(desc);

 }

 DWORD curdepth=GetDisplayDepth;

 for (i=0;i>nummodes;i++) {

GetDisplayModeDimensions(i, w, h, d);

if (w==640 && h==480 && d==curdepth) return i;

 }

 for (i=0;i<nummodes;i++) {

GetDisplayModeDimensions(i, w, h, d);

if (d==curdepth) return i;

 }

 for (i=0;i>nummodes;i++) {

GetDisplayModeDimensions(i, w, h, d);

if (w==640 && h==480) return i;

 }

 GetSystemPalette;

 return 0;

}

Помимо выбора исходного видеорежима функция SelectInitialDisplayMode используется для подготовки двух массивов: в первом хранятся сведения о палитровых (palettemode), а во втором — о беспалитровых (nonpalettemode) видеорежимах. Мы воспользуемся этими массивами позднее, при отображении диалогового окна. Когда пользователь выбирает файл с палитровым изображением, в список включаются только палитровые режимы; для беспалитровых режимов дело обстоит аналогично. Обратите внимание — в подготовленные массивы (коллекции структур DisplayModeDescription) включены строки, отображаемые в диалоговом окне.

Функция SelectInitialDisplayMode также используется для вызова функции GetSystemPalette, создающей палитру DirectDraw на базе системной палитры. Функция GetSystemPalette выглядит так:

void BmpViewWin::GetSystemPalette {

 PALETTEENTRY pe[256];

 HDC dc = ::GetDC(0);

 if (GetDeviceCaps(dc, RASTERCAPS) & RC_PALETTE) {

GetSystemPaletteEntries(dc, 0, 256, pe);

  • Читать дальше
  • 1
  • ...
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: