Стэн Трухильо - Графика для Windows средствами DirectDraw

Тут можно читать онлайн Стэн Трухильо - Графика для Windows средствами DirectDraw - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-programming. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Графика для Windows средствами DirectDraw
  • Автор:
  • Жанр:
  • Издательство:
    неизвестно
  • Год:
    неизвестен
  • ISBN:
    нет данных
  • Рейтинг:
    4.88/5. Голосов: 81
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 100
    • 1
    • 2
    • 3
    • 4
    • 5

Стэн Трухильо - Графика для Windows средствами DirectDraw краткое содержание

Графика для Windows средствами DirectDraw - описание и краткое содержание, автор Стэн Трухильо, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Графика для Windows средствами DirectDraw - читать онлайн бесплатно полную версию (весь текст целиком)

Графика для Windows средствами DirectDraw - читать книгу онлайн бесплатно, автор Стэн Трухильо
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать
Функция OnCreate()

Мы будем рассматривать функции примерно в порядке их выполнения. Начнем с функции OnCreate(), которая выглядит так:

int AviPlayWin::OnCreate(LPCREATESTRUCT lpCreateStruct) {

if (DirectDrawWin::OnCreate(lpCreateStruct) == -1) return -1;

AVIFileInit();

ShowDialog();

return 0;

}

Сначала мы вызываем версию OnCreate()базового класса (а она инициализирует DirectDraw). Если вызов этой функции закончится неудачей, продолжать бессмысленно, и мы возвращаем код неудачного завершения –1.

Затем мы вызываем функцию AVIFileInit(), которая инициализирует Video For Windows. После этого можно спокойно пользоваться функциями VFW.

Наконец, функция ShowDialog()выводит диалоговое окно для выбора AVI-файла и ожидает ввод от пользователя. Однако перед тем, как обсуждать ShowDialog(), необходимо рассмотреть функцию SelectInitialDisplayMode(), которая вызывается при использовании функции OnCreate()класса DirectDrawWin.

Функция SelectInitialDisplayMode()

Как упоминалось выше, функция SelectInitialDisplayMode()решает три задачи. Она выглядит так:

int AviPlayWin::SelectInitialDisplayMode() {

GetSystemPalette();

int i, nummodes=GetNumDisplayModes();

DWORD w,h,d;

for (i=0;i

DisplayModeDescription desc;

GetDisplayModeDimensions(i, w, h, d);

if (d==8) {

desc.w=w;

desc.h=h;

desc.d=d;

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

displaymode.Add(desc);

}

}

int curdepth=GetDisplayDepth();

if (curdepth!=8) ddraw2->SetDisplayMode(640, 480, curdepth, 0, 0);

for (i=0;i

GetDisplayModeDimensions(i, w, h, d);

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

}

return 1;

}

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

Затем функция SelectInitialDisplayMode()перебирает список доступных видеорежимов и сохраняет описания 8-битных режимов в массиве displaymodes. Позднее этот массив передается диалоговому окну для вывода списка доступных видеорежимов.

Наконец, функция ищет 8-битный режим с разрешением 640x480. Этот режим выбран лишь потому, что он поддерживается абсолютным большинством видеокарт (если не всеми). После вывода диалогового окна пользователь сможет выбрать любой другой 8-битный режим.

Функция ShowDialog()

Давайте рассмотрим функцию для вывода диалогового окна. Функция ShowDialog()приведена в листинге 8.2.

Листинг 8.2. Функция ShowDialog()

void AviPlayWin::ShowDialog() {

const CRect& displayrect=GetDisplayRect();

if (displayrect.Width()<640 || displayrect.Height()>480) ddraw2->SetDisplayMode(640, 480, 8, 0, 0);

ClearSurface(backsurf, 0);

ClearSurface(primsurf, 0);

primsurf->SetPalette(syspal);

ddraw2->FlipToGDISurface();

ShowCursor(TRUE);

if (avidialog==0) {

avidialog=new AviDialog();

avidialog->SetArray(&displaymode);

}

if (avistream) AVIStreamRelease(avistream), avistream=0;

if (avidialog->DoModal()==IDCANCEL) {

PostMessage(WM_CLOSE);

return;

}

ShowCursor(FALSE);

fullfilename=avidialog->fullfilename;

filename=avidialog->filename;

pathname=avidialog->pathname;

int index=avidialog->GetIndex();

DWORD w,h,d;

w=displaymode[index].w;

h=displaymode[index].h;

d=displaymode[index].d;

ActivateDisplayMode(GetDisplayModeIndex(w, h, d));

LoadAvi();

CreateAviSurface();

InstallPalette();

curframe=startframe;

}

Функция ShowDialog()начинается с проверки текущего разрешения. Если в данный момент установлен видеорежим с разрешением меньше 640x480, он изменяется. Это сделано для того, чтобы диалоговое окно не выводилось в режиме Mode X. Поскольку этот режим не поддерживается Windows, такая попытка, скорее всего, закончится неудачей из-за нелинейной организации пикселей в режимах Mode X.

Возможно, у вас возник вопрос — а почему может действовать режим Mode X? Вспомните, что эта функция вызывается при каждом нажатии клавиши Escape, пробела или правой кнопки мыши во время воспроизведения видеоролика. Нельзя исключать того, что видеорежим Mode X был установлен для воспроизведения ролика, поэтому перед выводом диалогового окна необходимо проверить эту возможность.

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

После установки системной палитры мы вызываем функцию DirectDraw FlipToGDISurface(). Это гарантирует, что диалоговое окно Windows будет отображаться на видимой поверхности, а не во вторичном буфере. Кроме того, мы снова включаем курсор мыши (иначе пользователь не сможет нажимать кнопки диалогового окна и выбрать AVI-файл).

Если экземпляр класса AviDialogне был создан при предыдущем вызове функции ShowDialog(), мы создаем его. Обратите внимание на то, что при создании диалогового окна ему передается массив 8-битных видеорежимов, подготовленный в функции SelectInitialDisplayMode().

Затем мы закрываем существующий AVI-поток. Это делается из-за того, что класс AviDialogобладает собственными средствами для работы с файлами, с помощью которых он выводит размеры и количество кадров в выбранном AVI-файле. Если не закрыть ранее открытый файл, то при его повторном выборе диалоговое окно уже не сможет получить эту информацию.

Функция DoModal()отображает диалоговое окно, в котором пользователь может выбрать нужный файл. При нажатии кнопки Cancelмы посылаем сообщение WM_CLOSE. Если все идет нормально, мы получаем имя выбранного файла (в трех различных формах) вместе с индексом видеорежима (видеорежим необходимо выбрать до нажатия кнопки Play). Размеры выбранного видеорежима, взятые из массива displaymode, передаются функции SetDisplayMode().

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

Функция InstallPalette()извлекает данные палитры из AVI-файла и строит по ним палитру DirectDraw, которая лучше всего подходит для просмотра. Наконец, переменной curframe, предназначенной для перебора кадров, присваивается значение переменной startframe.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Стэн Трухильо читать все книги автора по порядку

Стэн Трухильо - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




Графика для Windows средствами DirectDraw отзывы


Отзывы читателей о книге Графика для Windows средствами DirectDraw, автор: Стэн Трухильо. Читайте комментарии и мнения людей о произведении.


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

Напишите свой комментарий
x