Стэн Трухильо - Графика для Windows средствами DirectDraw
- Название:Графика для Windows средствами DirectDraw
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стэн Трухильо - Графика для Windows средствами DirectDraw краткое содержание
Графика для Windows средствами DirectDraw - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
CRect bmprect;
int x,y;
int xscroll, yscroll;
int xlimit, ylimit;
BOOL update_screen;
DisplayModeArray palettemode, nonpalettemode;
};
Единственной открытой ( public) функцией класса является конструктор, используемый для инициализации переменных. Далее мы объявляем четыре обработчика сообщений:
• OnKeyDown()
• OnRButtonDown()
• OnCreate()
• OnDestroy()
Функция OnKeyDonw()обрабатывает нажатия нескольких клавиш, среди которых клавиши со стрелками, Home, End, Page Up, Page Down, Enter, пробел и Escape.
Функции OnCreate()и OnDestroy()предназначены соответственно для инициализации и освобождения структур данных приложения. В частности, функция OnCreate()создает диалоговое окно для выбора BMP-файла, а функция OnDestroy()уничтожает его.
Далее следуют объявления нескольких закрытых переменных. Функция SelectInitialDisplayMode()похожа на версию, созданную DirectDraw AppWizard и использованную в прошлых программах, но в нее внесены некоторые изменения. Кроме выбора исходного видеорежима, эта функция сохраняет текущую палитру Windows с помощью функции GetSystemPalette()(которая объявляется несколькими строками ниже функции SelectInitialDisplayMode()).
Функция CreateCustomSurfaces()объявляется и определяется в объявлении класса. В отличие от других программ, рассмотренных нами, BmpView не отображает никаких вспомогательных поверхностей, поэтому эта функция не делает ничего. Однако из-за того, что функция DirectDrawWin::CreateCustomSurfaces()является чисто виртуальной, нам приходится объявить и определить ее минимальную реализацию.
Функция 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
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
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);
ddraw2->CreatePalette(DDPCAPS_8BIT, pe, &syspal, 0);
}
::ReleaseDC(0, dc);
}
С помощью функции Win32 GetSystemPaletteEntries()мы получаем содержимое текущей палитры Windows и создаем по ее образцу палитру DirectDraw функцией CreatePalette()интерфейса DirectDraw. Указатель на созданную палитру syspalпозднее будет применяться для восстановления системной палитры; это обеспечивает правильное отображение диалоговых окон Windows в 8-битных видеорежимах.
Следующий шаг инициализации приложения, заслуживающий нашего внимания, — функция OnCreate(). В функции OnCreate(), переопределенной классом BmpViewWin(), происходит создание и отображение диалогового окна:
int BmpViewWin::OnCreate(LPCREATESTRUCT lpCreateStruct) {
if (DirectDrawWin::OnCreate(lpCreateStruct) == -1) return -1;
ShowDialog();
return 0;
}
Функция ShowDialog()вызывается при запуске приложения и при выборе нового файла. ShowDialog()подготавливает DirectDraw к отображению диалогового окна, выводит окно, получает информацию о выбранном BMP-файле и выбранном видеорежиме и отображает содержимое файла. Функция ShowDialog()приведена в листинге 5.7.
Листинг 5.7. Функция ShowDialog()
void BmpViewWin::ShowDialog() {
Интервал:
Закладка: